一、KNN思想簡介
KNN 採用的是“物以類聚,人以羣分”的思想。也就是找出K個距離待遇測點最近的數據點,然後根據這K個點的類別(或者數值),根據一定的規則判斷(或者計算)得到帶預測點的類別(或者數值)。
KNN的核心就是找出數據點的K個鄰近的數據點。
在分類中採用少數服從多數或者加權的少數服從多數的分類方法。(當然,KNN一般用於分類)
在迴歸中採用平均值或者加權平均值的方法得到迴歸值。
二、查找KNN中K個最近鄰的數據點的方法
1)暴力求解(brute,樣本量較少的時候適用)
所謂暴力求解就是計算待遇測點到每個數據點的距離,然後進行排序處理,再將排序後的最近的K的點取出,就是要找的K個最近鄰的點。
這裏給出暴力求解的僞代碼:
對未知類別屬性的數據集中每個點依次執行如下步驟:
1)計算已知類別數據集中的點與當前點之間的距離
2)按照距離遞增次序排序
3)選取與當前點距離最小的k個點
4)確定前k個點所在類別的出現頻率
5)返回前k個點出現頻率最高的類別作爲當前點的預測分類
2)KD-Tree(樣本量較多的時候適用)
根據第一種方法我們可以求解K近鄰的數據點,且該方法在數據集較小的情況下能夠得到較好的結果。然而,在數據集較大(樣本量較多)的時候,要對於每個點都計算距離在排序,程序運行效率較低,不能快速得到結果。因此,這裏提出了第二種方法,也就是KD-Tree的方法。(要理解KD-Tree思想)
KD-Tree的構建方法:
1、計算所有特徵的方差,並選擇最大的方差(方差體現數據集的離散程度)作爲劃分的標準;
2、對於方差最大的特徵,選擇數據集中的該特徵的中位數作爲劃分點,將特徵小於劃分點的樣本數據劃分到左子樹中,將大於劃分點的樣本數據劃分到右子樹中。
3、不斷重複第二步即完成了KD-Tree的構建。
那麼,構建好的KD-Tree該如何查找近鄰的K個點呢??
1、首先,對於給定的目標點,我們先要在KD-Tree中找到包含該目標點的葉子節點。
2、以目標點爲圓心,以目標點到葉子節點樣本實例的距離爲半徑,得到一個超球體,要找到K個最近鄰的點一定在這個超球體中。
3、返回葉子節點的父節點,檢查另外一個葉子節點的超矩形體是否與超球體相交。如果相交,則到這個超矩形體中找是否有更近鄰的數據點。如果有,則更新近鄰點。(簡單點說,就是看所在節點的分割面與超球體是否相交割,如果是,說明這個分割面將超球體分爲了兩個部分,K近鄰點可能被分割到了另一個子樹中去,所以要到另一個子樹中查找是否存在更近鄰的點)
4、如果不相交,則返回父節點的父節點,繼續查找另外一個分支是否有更近鄰的點。直到遍歷到根節點,結束遍歷過程。所得到的K個近鄰點就是最近鄰的點。
三、小結
KNN作爲較爲簡單的算法模型,其算法的原理理解起來也較爲簡單。然而,KNN能夠既能夠實現分類,也能夠運用於迴歸中,算法的效果也都是不錯的。其中的KD-Tree的方法理解稍難(遞歸的過程),且在後面的決策樹、密度聚類等算法中也較多的應用。