1. 程式人生 > >4.1 最鄰近規則分類(K-Nearest Neighbor)KNN演算法

4.1 最鄰近規則分類(K-Nearest Neighbor)KNN演算法

1968年提出的分類演算法

輸入基於示例的學習(instance-based learning),懶惰學習(lazy learning)

例子:




演算法詳述步驟:

為了判斷未知例項類別,用所有已知類別的例項作為參照

選擇引數k

計算未知例項與所有已知例項的距離

選擇最近K個已知例項

根據少數服從多數的投票法則(majority-voting),讓未知例項歸類為K個最鄰近樣本中最多數的類別

演算法詳述細節:

關於K

關於距離的衡量方法:

Euclidean Distance定義

 

其他距離衡量:餘弦值(cos),相關度(correlation),曼哈頓距離(Manhattan distance)

計算距離:

import math

def ComputeEuclideanDistance(x1,y1,x2,y2):
    d = math.sqrt(math.pow(x1-x2,2)+math.pow(y1-y2,2))
    return d
    
d_ag = ComputeEuclideanDistance(3,104,18,90)

print("d_ag: ",d_ag)

舉例:


演算法優點:

簡單,易於理解,容易實現,通過對K的選擇可具備丟噪音資料的健壯性


演算法缺點:

需要大量空間儲存所有已知例項

演算法複雜度高(需要比較所有已知例項與要分類的例項)

當樣本分佈不平衡時,比如其中一類樣本過大(例項數量過多)佔主導的時候,新的未知例項容易被歸類為這個主導樣本,因為這類樣本例項數量過大,但這個新的未知例項實際並沒接近目標樣本

改進版本:

考慮距離,根據距離加上權重

比如:1/d(d:距離)