1. 程式人生 > >k近鄰法(KNN)演算法理解

k近鄰法(KNN)演算法理解

一、如何理解KNN?

給定一個訓練資料集,對新的輸入樣本,根據已知的訓練資料集中找到與該樣本最鄰近的k個樣本,在這k個樣本中,樣本類別最多的那個類即為新的輸入樣本的類別。

二、KNN三個基本要素

(1)距離度量
假設特徵向量有n維,xi與xj的Lp距離定義為:
這裡寫圖片描述
當p=2時,稱為歐氏距離(Euclidean distance),實際應用中通常採用歐氏距離
當p=1時,稱為曼哈頓距離(Manhattan distance)
(2)k值的選擇
較小的k值:較小的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適用於文字分類、模式識別、聚類分析、多分類