K 近鄰演算法(懶惰演算法)

2021-09-11 18:50:58 字數 4406 閱讀 5647

簡介:

k nearest neighbor演算法又叫knn演算法,如果乙個樣本在特徵空間中的k個最相似的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。

該演算法的思想是:

乙個樣本與資料集中的k個樣本最相似,如果這k個樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,即,對每乙個測試樣本,基於事先選擇的距離度量,knn演算法在訓練集中找到距離最近(最相似)的k個樣本,然後將k個樣本的類別的投票結果作為測試樣本的類別。

k 近鄰演算法api呼叫

1、scikit_learn

2、api

3、模型訓練具體使用

4、knn演算法是乙個懶惰演算法,根據給出的樣本自己進行判斷,比較耗時

舉例:	

# 匯入模組

from sklearn.neighbors import kneihborsclassifier

# 構造資料集

x = [[0],[1],[2],[3]]

y = [0,0,1,1]

# 機器學習--模型訓練

# 例項化api

estimator = kneighborsclassifier(n_neighbors=2)

# 使用fit方法進行訓練

estimator.fit(x,y)

實際計算流程:

1)計算已知類別資料集中的點與當前點之間的距離

2)按距離遞增次序排序

3)選取與當前點距離最小的k個點

4)統計前k個點所在的類別出現的頻率

5)返回前k個點出現頻率最高的類別作為當前點的**分類

距離度量距離

1、歐式距離

就是通過平方,求和,然後開根號進行求解
2、曼哈頓距離

就是通過絕對值,求和進行求解
3、切比雪夫距離

就是通過絕對值,然後取最大值
4、閔可夫斯基距離

是前三個距離的乙個綜合稱呼

p = 1時,就是曼哈頓距離;

p = 2時,就是歐式距離;

p = ∞時,就是切比雪夫距離。

前四個距離的總結:1)將各個分量的量綱,也就是「單位」相同的看待了;2)未考慮各個分量的分布(期望、方差等)可能是不用的。

5、馬氏距離

是基於樣本分佈的乙個距離,在計算過程中,與量綱無關。要求:總體樣本數大於樣本的維數(特徵值)
6、標準化歐氏距離

在使用歐式距離計算之前把每個維度的特徵求了標準化
7、漢明距離

就是計算字串替換的乙個長度(次數),【漢明重量】
8、傑卡德距離

通過資料的交集和並集進行求解
k值的選擇

如果k值過小:

容易受到異常點的影響,意味著整體模型變得複雜,容易發生過擬合

若k值過大:

容易受到樣本均衡的問題,k值增大就意味著整體模型變得簡單,容易發生欠擬合

k=n(n為訓練樣本個數)

此時訓練的模型完全失效,判斷的類別只會選擇樣本中樣本資料最多的類別

個人理解:這個k值的選擇方面,可以把k值當做之前的特徵,在模型訓練時,特徵過少會導致過擬合,特徵過多會導致欠擬合。

kd樹目標:對訓練資料進行快速k近鄰搜尋

實現思路:

1、構建樹

1)構造根節點

2)通過遞迴方式不斷的構造

3)直到子區域沒有例項(節點)停止

2、最近領域搜尋

1)構造乙個佇列,使遍歷過的點在這個佇列裡面

2)進行是否過了超平面的判斷,如果沒有過,跳過,若過了,則需要把當前的子節點新增進去

3)迴圈操作,求得最近點

附加案例

鳶尾花種類**

基本實現流程:

1、獲取資料集

2、資料基本處理

1)資料集分隔

3、特徵工程

4、機器學習

5、模型評估

# 匯入模組

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import standardscaler

from sklearn.neighbors import kneighborsclassifier

# 1、獲取資料集

iris = load_iris()

# 2、資料的預處理

# x_train,x_test,y_train,y_test為訓練集特徵值,測試集特徵值,訓練值目標值,測試目標值

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)

# 3、特徵工程標準化

transfer = standardscaler()

x_train = trasfer.fit_transform(x_train)

x_test = transfer.transform(x_test)

# 4、機器學習(模型訓練)

estimator = kneighborsclassifier(n_neighbors=5)

estimator.fit(x_train,y_train)

# 5、模型評估

# 1)比對真實值和**值

y_predict = estimator.predict(x_test)

print("**結果為:\n",y_predict)

print("比對真實值和**值:\n",y_predict == y_test)

# 2)直接 計算準確率

score = estimator.score(x_test, y_test)

print("準確率為:\n",score)

交叉驗證、網格搜尋(模型選擇與調優)api:

sklearn.model_selection.gridsearchcv(estimator, param_grid=none,cv=none)

鳶尾花案例增加k值調優

# 使用gridsearchcv構建估計器

# 匯入模組

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import standardscaler

from sklearn.neighbors import kneighborsclassifier

# 1、獲取資料集

iris = load_iris()

# 2、資料的預處理

# x_train,x_test,y_train,y_test為訓練集特徵值,測試集特徵值,訓練值目標值,測試目標值

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)

# 3、特徵工程標準化

transfer = standardscaler()

x_train = trasfer.fit_transform(x_train)

x_test = transfer.transform(x_test)

# 4、機器學習(模型訓練)

# 1)knn預估器流程

estimator = kneighborsclassifier()

# 2)準備要調的引數

param_dict =

estimator = gridsearchcv(estimaor, param_grid=param_dict, cv=3)

# 3)fit資料進行訓練

estimator.fit(x_train,y_train)

# 5、模型評估

# 1)比對真實值和**值

y_predict = estimator.predict(x_test)

print("**結果為:\n",y_predict)

print("比對真實值和**值:\n",y_predict == y_test)

# 2)直接 計算準確率

score = estimator.score(x_test, y_test)

print("準確率為:\n",score)

k 近鄰演算法

此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...

K 近鄰演算法

k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...

K 近鄰演算法

首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...