K近鄰算法(KNN)推導分析

Knn和kd樹介紹

author:DivinerShi

KNN算法

優點:
直觀,簡單,可以用來做分類也可以用來做迴歸
可用於非線性分類,訓練時間複雜度爲O(n)
準確度高,對數據沒有假設,對outier不敏感。
缺點:
計算量大,樣本不平衡問題難處理,需要大量的內存
算法解釋:
給定一個數據集,對新的輸入樣本,在數據集中找到與新的輸入樣本距離最近的k個樣本,將這k個樣本中最多數屬於某個類的那個類別當作新的輸入樣本的類別。
即在距離最近的k個鄰域內,去確定新的輸入樣本x的類別y:
這裏寫圖片描述
N爲類別c的個數,K爲選擇的鄰域內樣本個數,I爲指示函數,即當時I爲1,否則爲0。

當k爲1,是該算法就是最近鄰算法,k的選擇會一定程度影響算法性能,當k很小的時候,算法很容易受到噪聲的影響,使得算法的Bias較大,而且如果數據集很大,意味着模型很複雜,很容易過擬合

如果k=N,那麼就是整個數據集了,那麼無論輸入的是啥樣本,選擇的都是整個數據集中數量最多的那個類別。所以當k選擇較大的時候,此時模型過於簡單,Variance過大,容易欠擬合

距離度量:

最常見的是歐式距離,也可以曼哈頓距離,或者其他Lp距離,看具體問題具體選擇。

實現:

K近鄰最簡單的實現就是直接遍歷整個數據集,叫線性掃描(linear scan),但是這樣的話,需要將輸入的樣本和數據集中每個樣本進行度量距離,如果數據集很大的話,計算是非常耗時的。所以比較常見的是KD樹

KD樹

Kd樹是一個二叉樹,利用樹來對k維空間進行劃分。

構造KD樹:

1.先計算每個特徵的方差(數據方差大說明沿着這個座標軸方向上數據點分散的比較開,在這個方向上進行數據分割可以獲得最大的區分度),降序排列構建二叉樹。
2.計算每個特徵的中位值(最中間的作爲分割節點),將中位值所在的節點作爲分割節點,比它大的放右節點,小的放左節點。
3.以此遞歸,直到最後要劃分的子空間中只有一個數據點。

搜索:

1.搜索最近鄰點,沿着路徑搜索即可,找到葉子節點,計算搜索節點和葉子以搜索節點和葉子節點的距離保存爲最近距離。
2.回溯,比較上一節點和搜索節點距離與之前的最近距離的大小,比當前最近距離小的話,替換當前節點所計算的距離爲最小距離。去該節點的另一子節點進行搜索,判斷是否還有更小的距離存在。以此回溯。
3.到根節點時結束。

不足

該算法在分類時有個重要的不足是,當樣本不平衡時,即:一個類的樣本容量很大,而其他類樣本數量很小時,很有可能導致當輸入一個未知樣本時,該樣本的K個鄰居中大數量類的樣本佔多數。

當維數過大時,直接利用kd樹快速檢索的性能急劇下降。假設數據集的維數k,那麼數據集的規模N最好遠大於2的k次方,才能達到高效搜索。

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