Introduction
- 透過鄰居(離自己最近的點)來推斷所屬的類別
- 比較樣本之間的特徵遠近;相似的樣本,特徵之間的值應該都是相近的
- 定義:如果一個樣本在特徵空間中 與K個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於同一個類別,則該樣本也屬於這個類別
兩個樣本的距離可以通過如下公式計算,又稱歐式距離,比如a(a1,a2,a3), b(b1,b2,b3)
在計算兩個樣本的距離時,會因為某些特徵值本就屬於非常大的數值,在求其距離時會直接影響最後的結果
- 使用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()
方法的值來決定最合適的算法metric
:預設為"minkowski"
(明可夫斯基距離)- 其為歐式距離及曼哈頓距離兩種計算距離的延伸
- 其實例化KNN算法時參數
p
預設為2p
為2時所使用的是曼哈頓距離:兩點絕對值距離p
為1時所使用的是歐式距離
Example
1 | from sklearn.datasets import load_iris |
result
1 | score = 1.0 |
tips
- 須考慮k值須取多大
- k值取太小容易受異常點的影響
- k值如果取得太大容易受到鄰近點(類別)結果比例影響
- 訓練集的各類別樣本不均衡時造成誤判
- 因為每個點都需計算距離造成性能低落
優缺點
- 優點
- 簡單
- 易於理解及實現
- 無須估計參數(演算法所需參數),無須訓練(不是迭代,而是單純的計算距離)
- 缺點
- 對測試樣本分類時計算量大
- 內存開銷大
- 必須指定k值,且k值選擇不當分類精確度不能保證
- 使用場景
- 小數據(幾千~幾萬樣本)