k近鄰法(KNN)演算法理解
阿新 • • 發佈:2019-02-14
一、如何理解KNN?
給定一個訓練資料集,對新的輸入樣本,根據已知的訓練資料集中找到與該樣本最鄰近的k個樣本,在這k個樣本中,樣本類別最多的那個類即為新的輸入樣本的類別。
二、KNN三個基本要素
(1)距離度量
假設特徵向量有n維,xi與xj的Lp距離定義為:
當p=2時,稱為歐氏距離(Euclidean distance),實際應用中通常採用歐氏距離
當p=1時,稱為曼哈頓距離(Manhattan distance)
(2)k值的選擇
較小的k值:較小的k值預測的結果對近鄰點比較敏感,當選擇的近鄰點恰好是噪聲,則預測誤差就增大。k值的減小意味著整體模型變得更復雜,容易產生過擬合。
較大的k值
(3)分類決策規則
在KNN中通常採取多數表決方法來決定輸入樣本的類別
三、KNN的實際應用
sklearn實現KNN:
import numpy as np
from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris=datasets.load_iris()
X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2 ,random_state=0)
knn=neighbors.KNeighborsClassifier(algorithm='auto',leaf_size=30,metric='minkowski',
metric_params=None,n_jobs=1,n_neighbors=5,p=2,weights='uniform')
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
輸出結果:
0.96666666666666667
採用10折交叉:
#採用10折交叉驗證
from sklearn.model_selection import cross_val_score
scores=cross_val_score(knn,iris.data,iris.target,cv=10)
scores.mean()
輸出結果:
0.96666666666666679
部分引數解釋:
algorithm=’auto’,指定用於計算最近鄰的演算法,auto表示試圖採用最適合的演算法計算最近鄰
metric:用於樹的距離度量。預設’minkowski
p = 2(即歐氏度量)
n_neighbors=5,預設值為5,表示查詢k個最近鄰的數目
weights:確定近鄰的權重,‘uniform’權重一樣,‘distance’權重為距離的導數,預設值‘uniform’
四、總結
- kNN沒有明顯的學習過程,屬於懶惰性學習
- kNN適用於多分類問題,當維度較大時,比SVM快
- k值較小時,對資料較敏感,抗噪能力差;k值過大,會因資料不平衡導致分類誤差增大
- 當資料量較大時,計算量較大,因為對於每個樣本的分類都進行了全域性的計算
- kNN適用於文字分類、模式識別、聚類分析、多分類