K近鄰K Nearest Neighbor

項目地址:https://github.com/Daya-Jin/ML_for_learner/blob/master/neighbors/KNN.ipynb
原博客:https://daya-jin.github.io/2018/12/29/KNearestNeighbor/

模型結構

K近鄰(K Nearest Neighbor)是一種基於存儲的算法,該算法不需要擬合任何模型,給定一個需要判別的樣本xix_{i},KNN算法會在數據庫中搜索與xix_{i}最近的數據或kk個最近的數據來判別xix_{i}。特別地,當k=1k=1時,KNN就退化成最近鄰(Nearest Neighbor)算法,也等同於原型方法,其中每一個樣本點都是一個簇中心。由於KNN算法是基於距離的算法,因此影響該算法表現的至關重要的兩點有:1. 距離度量的方法;2. 數據各特徵的尺度差異。對於第二點,一般對數據進行Standardization變換,使得所有特徵服從標準正態分佈。可以證明(智商不夠),最近鄰算法的誤差率近似不會超過貝葉斯誤差的兩倍。

當KNN應用於高維數據時,問題也隨之而來。首先是隨着維度的增加,數據點在空間的分佈會很稀疏,“最近鄰”的概念被淡化;另一個問題是應用最廣泛的歐氏距離並不是一個通用的距離度量方法。考慮下圖所示的情況:

圖中黑點是需要預測的的點,長條區域表示的是隻考慮yy軸距離的5個最近領樣本,圓形區域表示的是考慮所有維度距離的5個最近領樣本;前者正確分類,後者反而造成了誤分類。要減緩這種問題也很簡單,將xx軸的尺度放大或者將yy軸的尺度縮小即可。一般來說,我們會拉伸類分佈概率變化不是很劇烈的那個軸。如上圖的例子,xx軸上的類分佈概率是一個形如符號函數的分佈,而在yy軸上的類分佈概率則是隨機的,那我們就拉伸xx軸。

實現指導

完整代碼

KNN算法其實很簡單,沒什麼好講的,唯一值的一提的就是可優化的地方,用K-D樹可以減少該算法的計算複雜度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章