1. 程式人生 > >《統計學習方法(李航)》k近鄰 學習筆記

《統計學習方法(李航)》k近鄰 學習筆記

作者:jliang

https://blog.csdn.net/jliang3

 

1.重點歸納

1)k近鄰是一種基本分類與迴歸方法,不具有顯式的學習過程。

2)模型由三個基本要素決定:距離度量、k值選擇和分類決策規則。

3)k近鄰法最簡單的實現方法是線性掃描,當訓練集很大時,計算非常耗時。為提高搜尋效率,可以使用特殊的結構(kd樹)儲存訓練資料,以減少計算距離的次數。

2.k近鄰演算法

1)k近鄰是一種基本分類與迴歸方法。

  • 分類時,對新的例項,根據其k個最近鄰的訓練資料集,通過多數表決的方式進行預測。
  • 迴歸時,對新的例項,根據其k個最近鄰的訓練資料集,通過取平均值的方式進行預測。

2)k近鄰法不具有顯式的學習過程,k近鄰法實際上利用訓練資料集對特徵向量空間進行劃分,並作為其分類的“模型”。

3)k近鄰的特殊情況是k=1時,稱為最近鄰演算法。

3.k近鄰模型

1)模型由三個基本要素決定:距離度量、k值選擇和分類決策規則。

2)特徵空間中兩個例項點的距離是兩個例項點相似程度的反映。

3)距離度量

  • 馬氏距離/Lp距離(Lp distince)/Minkowski距離(Minkowski distance)

  • p=1時,曼哈頓距離:對應L1範數

  • p=2時,歐氏距離:對應L2範數

  • p=∞時,它是各個座標距離的最大值

4)k值的選擇會對k近鄰法結果產生重大影響。

(1)較小的k值學習的近似誤差會減少,只與輸入例項較近的訓練例項才會對預測結果產生作用。但缺點是學習的估計誤差會增大,預測結果對近鄰例項點非常敏感。如果鄰近的例項是噪音就會導致預測錯誤。K值的減少意味著整體模型變得複雜,容易發生過擬合。

(2)較大的k值的優點是減少學習的估計誤差,但缺點是學習的近似誤差會增大。這是與輸入例項較遠的訓練例項也會對預測產生影響,使預測發生錯誤。K值的增大意味著整體模型變得簡單。

(3)k值一般取一個比較小的數值,通常採用交叉驗證法來選取最優的k值。

4.k近鄰法的實現:kd

1)k近鄰法最簡單的實現方法是線性掃描,當訓練集很大時,計算非常耗時。為提高搜尋效率,可以使用特殊的結構(kd樹)儲存訓練資料,以減少計算距離的次數。

2)kd樹是一種k維空間的例項點進行儲存以便對其快速檢索的樹形資料結構。Kd樹是二叉樹,表示對k維空間切分,構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。

3)kd樹構造步驟

(1)開始構造根結點,根節點對應於包含T的k維空間的超矩形區域。

         選擇某個維度x1為座標軸,以所有例項的x1座標的中位數為切分點,將根結點對應的超矩形區域切分為兩個子區域。左邊子結點對應座標x1小於切分點的子區域,右邊子結點對應座標x1大於切分點的子區域。

(2)重複:對深度為j的結點選擇,選擇xl為切分的座標軸,l=j%k+1(輪流使用k維空間的每一維),以該結點的區域中所有例項點的中位數為切分點,將該結點對應的超矩形區域切分為兩個子區域。由該結點生成深度為j+1的左、右子結點。

(3)直到兩個子區域沒有例項存在時停止。

4)kd樹構造例子

二維空間資料集:

5)利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。

6)利用kd樹最近鄰搜尋步驟

(1)在kd樹中找出包含目標點x的葉節點

從根結點出發,遞迴地向下訪問kd樹,若目標點當前維的座標小於切分點,則移動到左子節點,否則移到右結點,直到葉子結點為止。

(2)以此葉子結點為“當前最近點”

(3)遞迴地向上回退,在每個節點進行以下操作

         a. 如果該結點儲存的例項點比當前最近點距離目標點更近,則以該例項點為“當前最近點”。(即父結點更近,則父結點作為“當前最近點”)

         b. 檢查x目標點離“當前最近點”在當前維度(樹的每一層比較都會變化一次維度)的距離是否大於x目標點與父結點的當前維度的距離大。如果大,則需要比較父結點的另一子結點的距離是否比“當前最近點”距離更近,如果是,則父結點的另一子結點作為“當前最近點”。

(4)當回退到根結點時,搜尋結束。最後的“當前最近點”即為x的最近鄰點。

7)例項點隨機分佈時,kd樹搜尋的平均計算複雜度是O(logN),N是訓練例項數。Kd樹更適合訓練例項遠大於空間維度數的k近鄰搜尋,當維數接近例項數時,效率迅速下降,幾乎接近線性掃描。

8)kd樹搜尋例子:查詢點為(2,4.5)

(1)同樣先進行二叉查詢,先從(7,2)查詢到(5,4)節點,在進行查詢時是由y = 4為分割超平面的,由於查詢點為y值為4.5,因此進入右子空間查詢到(4,7),形成搜尋路徑<(7,2),(5,4),(4,7)>,但(4,7)與目標查詢點的距離為3.202,而(5,4)與查詢點之間的距離為3.041,所以(5,4)為查詢點的最近點;

(2)以(2,4.5)為圓心,以3.041為半徑作圓,如下圖所示。可見該圓和y = 4超平面交割,所以需要進入(5,4)左子空間進行查詢,也就是將(2,3)節點加入搜尋路徑中得<(7,2),(2,3)>;於是接著搜尋至(2,3)葉子節點,(2,3)距離(2,4.5)比(5,4)要近,所以最近鄰點更新為(2,3),最近距離更新為1.5;

(3)回溯查詢至(5,4),直到最後回溯到根結點(7,2)的時候,以(2,4.5)為圓心1.5為半徑作圓,並不和x = 7分割超平面交割,如下圖所示。至此,搜尋路徑回溯完,返回最近鄰點(2,3),最近距離1.5。