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

2021-07-05 19:29:53 字數 2450 閱讀 9309

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個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。

統計學習方法 k 近鄰演算法

所謂k 近鄰 knn 是基本且簡單的分類與回歸方法,說的就是每個樣本的分類都可以用它最接近的k個鄰居來代表。1 對給定的訓練例項點和輸入例項點,首先確定輸入例項點的k個最近鄰訓練例項點,然後利用這k個訓練例項點的類的多數來 輸入例項點的類。2 k近鄰模型對應於基於訓練資料集對特徵空間的乙個劃分。k近...

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

目錄 k近鄰的思想 距離怎麼算 k的取值 規則 應用 kd樹 kd樹的構建 kd樹的搜尋 今天介紹的k近鄰演算法是一種思想非常簡單的分類回歸演算法。顧名思義,結果肯定是和樣本最靠近的k個鄰居有很大的關係。不同於其他演算法,需要先訓練模型才可以進行 k近鄰演算法直接選擇與我們要 的樣本點距離最近的k個...

統計學習方法筆記 K近鄰法

看完了knn演算法,感覺演算法挺簡單的,選擇k的大小,距離計算公式,分類決策三個部分就行了,並且三個部分用的東西都挺常見,沒什麼難度。後面的提到了乙個改進演算法,搜尋空間kd演算法,這樣可以幫助我們很快的找到k個最近鄰,運用中位數縮小搜尋空間,省去了對大部分資料點的搜尋。思想不難 k近鄰法是一種基本...