KNN(K近鄰)總結

一、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的方法理解稍難(遞歸的過程),且在後面的決策樹、密度聚類等算法中也較多的應用。

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