Hike News
Hike News

機器學習-演算法-K Neighbors Classifier

Introduction

  • 透過鄰居(離自己最近的點)來推斷所屬的類別
  • 比較樣本之間的特徵遠近;相似的樣本,特徵之間的值應該都是相近的
  • 定義:如果一個樣本在特徵空間中 與K個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於同一個類別,則該樣本也屬於這個類別
  • 兩個樣本的距離可以通過如下公式計算,又稱歐式距離,比如a(a1,a2,a3), b(b1,b2,b3)
    $$
    distance = \sqrt{(a1-b1)^2+(a2-b2)^2+(a3-b3)^2}
    $$

  • 在計算兩個樣本的距離時,會因為某些特徵值本就屬於非常大的數值,在求其距離時會直接影響最後的結果

    • 使用KNN算法時需將數據集做標準化或是歸一化處理
  • 使用sklearn.neighbors.KNeighborsClassifier() 調用此演算法的API


K Neighbors Classifier

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
  • n_neighbors:為int類型,可選,預設值為5,選擇查詢的鄰居數
  • algorithm:有'auto','ball_tree','kd_tree','brute'幾種選擇,可選用於計算最近鄰居的算法,'auto'將嘗試根據傳遞給fit()方法的值來決定最合適的算法

Example

1
2
3
4
5
6
7
8
9
10
11
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

iris_data = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target)

KNN = KNeighborsClassifier()
KNN.fit(X_train,y_train)
KNN.predict(X_test)
print("score = ",KNN.score(X_test,y_test))

result

1
score = 1.0

tips

  • 須考慮k值須取多大
    • k值取太小容易受異常點的影響
    • k值如果取得太大容易受到鄰近點(類別)結果比例影響
  • 因為每個點都需計算距離造成性能低落

優缺點

  • 優點
    • 簡單
    • 易於理解及實現
    • 無須估計參數(演算法所需參數),無須訓練(不是迭代,而是單純的計算距離)
  • 缺點
    • 對測試樣本分類時計算量大
    • 內存開銷大
    • 必須指定k值,且k值選擇不當分類精確度不能保證
  • 使用場景
    • 小數據(幾千~幾萬樣本)