統計學習方法——K近鄰算法

目錄

 

K近鄰的思想

距離怎麼算

K的取值

預測規則

應用:kd樹

kd樹的構建

kd樹的搜索


K近鄰的思想

今天介紹的K近鄰算法是一種思想非常簡單的分類迴歸算法。顧名思義,預測結果肯定是和樣本最靠近的K個鄰居有很大的關係。不同於其他算法,需要先訓練模型纔可以進行預測,K近鄰算法直接選擇與我們要預測的樣本點距離最近的K個樣本,然後用這個K個鄰居的標籤值根據一定的規則得出預測結果。那麼問題來了:1. 距離怎麼算? 2. K的取值? 3. 確定預測結果的規則是什麼呢?下面我們一一來解答一下這三個問題。

距離怎麼算

我們聽到過很多計算距離的方法:餘弦距離、歐氏距離、曼哈頓距離、切比雪夫距離等等...我們經常用到的就是歐式距離了,在K近鄰算法裏最常用的也是歐式距離dis(x_{1}-x_{2}) = \sqrt{\sum_{j=1}^m\left \| x_{1}^{j} -x_{2}^{j}\right \|^2},說到歐式距離,就要提一下L_p距離,計算公式:

L_{p}(x_{1},x_{2}) = \sqrt[\frac{1}{p}]{\sum_{j=1}^m \left \| x_{1}^{j}-x_{2}^{j} \right \|^p},當p=1時代表曼哈頓距離;p=2時是歐氏距離;p=無窮大時代表切比雪夫距離。

K的取值

當K=1時,該算法爲最近鄰算法,算法會將新數據預測爲與和它距離最近的訓練數據一樣的標籤。通常K值是通過交叉驗證確定的。K值的選擇對預測結果有什麼影響呢?

K值小的時候,對噪聲點敏感,算法的近似誤差小,估計誤差大。近似誤差和估計誤差的理解大家可以參考知乎上喬木先生的答案https://www.zhihu.com/question/60793482

K值大的時候,算法的近似誤差增大,估計誤差減小,因爲算法每次預測的時候參考的樣本點比較多,噪聲的影響就會減小。

預測規則

在分類問題中,預測規則是多數表決,即樣本的K個鄰居中哪類樣本多,那就歸爲哪一類

在迴歸問題中,預測規則是取平均,即對樣本的K個鄰居的標籤值取平均,作爲預測結果

應用:kd樹

K近鄰算法如果用線性掃描的方法實現,算法的時間複雜度爲O(n);如果用樹形結構來存儲數據,就可以將算法的時間複雜度優化到O(logn),這便是kd樹了。注意:這裏的k和K近鄰算法裏的K含義不同,這裏的k是指數據維度。

kd樹是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構。

先上一個kd樹的例子(圖片是百度搜索到的,若有侵權請聯繫)

下面分別介紹一下kd樹的構建和搜索過程。

kd樹的構建

輸入:樣本集X=\left \{ x_{1}, x_{2}, x_{3}, ..., x_{n} \right \},其中x_{i} = \left \{ x_{i}^{1}, x_{i}^{2},...,x_{i}^{m}\right \},m是指特徵維度,和kd樹的k是相同的含義,爲了和K近鄰的K區分開,用m代替

(1) 構造根結構,根據第一維特徵的大小將所有樣本排序,以中位數爲中心將樣本分爲兩類,分別作爲根節點的左右子樹;

(2) 對於左右子樹,分別選取第2、3...維特徵變按照中位數進行子樹的劃分,直至每個樣本空間僅有一個樣本

kd樹的搜索

輸入:x=\left \{ x^{1}, x^{2}, ...,x^{m} \right \},kd樹

輸出:樣本的類別

(1) 搜索kd樹中包含x的葉子結點作爲“當前最近點”計入k近鄰數組中。具體步驟:從根節點開始,選擇kd樹當前層的劃分維度,如果x對應維度大於節點值,到右子節點;如果x小於當前節點值,到左節點;

(2) 遞歸的向上回退:

     (a) 如果當前k近鄰數組中的元素少於k個,將當前節點的父節點加入k近鄰數組中;否則,判斷當前節點是否在K近鄰球內部,如果在,就用當前節點的父節點代替k近鄰數組中與x距離最遠的樣本

     (b) 如果當前k近鄰數組中元素少於k個,將當前節點的兄弟節點加入k近鄰數組;否則查看兄弟節點所在的區域與K近鄰球是否相交,如果相交,在兄弟節點區域遞歸查看是否有在K近鄰球內部的節點

(3) 回退到根節點時結束搜索。用K近鄰數組中的樣本規矩預測規則得到x的預測結果。

*注:K近鄰球是指:以x爲球心, \max_{x_{i}\in kner}dis(x_{i}, x)爲半徑的球,每次K近鄰數組(kner)更新後,K近鄰球也需要更新。

 

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