1. 程式人生 > >統計學習方法筆記(三)K近鄰演算法

統計學習方法筆記(三)K近鄰演算法

K近鄰法(KNN)是一種基本的分類和迴歸的方法,KNN的基本思想是給出一定數量帶有標籤的訓練樣本,使用這些訓練樣本將特徵空間劃分成許多的子空間,當一個新的測試樣本進來以後,這個測試樣本一定會落在一個超矩形區域內部,然後找到距離這個測試樣本最近的K個訓練樣本,用這些訓練樣本的標籤去投票,票數最多的類別就是這個測試樣本的類別。

KNN的三個要素:

K值選擇,距離度量,分類決策規則。

演算法描述:

1.     根據所給定的距離度量,在訓練樣本T中選出K個與測試樣本最接近的訓練樣本點。包含這K個樣本點的鄰域我們記為:Nx(K)。

2.     在Nx(K)中根據分類決策函式判斷測試樣本點所屬的類別:


其中I為指示函式。內部料件成立則為1,否則為0.

距離度量:

通常KNN所用的距離度量通常為歐氏距離或者曼哈頓距離,更一般的是Lp距離。當P為1的時候為曼哈頓距離,當P為2的時候為歐氏距離。

設特徵空間X是n維實數向量空間:



當P為正無窮的時候,它表示的是各個座標距離的最大值,即


在二維空間中,P取不同的值,與原點為1的點所組成的圖形如下圖所示, p越小那麼資料的分佈也就越稀疏。


KNN的實現:Kd樹

Kd樹是一種對k維空間中的樣本點進行儲存以便對其進行快速檢索的樹形結構,它是一種二叉樹,表示對k維空間的一個劃分。構造k樹相當於不斷的用垂直於座標軸的超平面去劃分k維空間,構成一些列的k維超矩形區域,kd樹的每個節點對應於一個k維的超矩形區域。

Kd樹的構造:

通俗來講,對於一個樣本空間的樣本點,計算每一個維度的方差,按照方差最大的那個維度來排序(至於為什麼按照方差最大的維度去分割,這是因為方差大代表的是資料分散的比較開,這樣分割會有更高的分割效率),取中位數作為根節點,小於中位數的樣本點作為左子樹,大於的作為右子樹。重複進行,直到得到一棵完整的二叉樹。

Kd樹的檢索:

1.     首先找到包含目標節點的葉子結點:從根節點出發,按照相應維度比較,遞歸向下訪問kd樹,如果目標點x的當前維度的座標小於根節點,則移動到左子節點,否則移動到右子節點,直到子節點為葉子節點為止。

2.     找到葉子節點並不一定就是距離最近的點,但是最近鄰點一定是以查詢點為圓心並且通過葉子節點的圓域內。

3.     為了找到真正的最近鄰點,還需要遞迴的向上回退,檢查該節點的另一個子節點區域,如果有“最近鄰”節點,那麼替換原來的點得到最新的“最近鄰”節點,然後檢查父節點,如果不是“最近鄰”節點,那麼繼續往上回退,直到到達根節點。遍歷結束,“最近鄰”節點即為最近鄰節點,結束搜尋。

KNN是一種lazy-learning演算法,它不需要訓練,分類的時間複雜度為N(訓練樣本的個數),引入kd樹來實現KNN時間複雜度為logNkd樹更適合於訓練樣本樹遠大於空間維度的情況,如果訓練樣本數接近於空間維度,那麼它的效率會迅速下降,幾乎接近於線性掃描。

KNN演算法不僅可以用於分類,還可以用於迴歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。

該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。因此可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。該方法的另一個不足之處是計算量較大,因為對每一個待分 類的文字都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。