看完了knn演算法,感覺演算法挺簡單的,選擇k的大小,距離計算公式,分類決策三個部分就行了,並且三個部分用的東西都挺常見,沒什麼難度。後面的提到了乙個改進演算法,搜尋空間kd演算法,這樣可以幫助我們很快的找到k個最近鄰,運用中位數縮小搜尋空間,省去了對大部分資料點的搜尋。思想不難
k近鄰法是一種基本分類與回歸的方法,k近鄰法假設給定乙個訓練資料集,其中的實力類別已定,分類時,對新的例項,根據其k個最近鄰的訓練例項的類別,通過多數表決等方式進行**。k近鄰法不具有顯式的學習過程。k近鄰法實際上利用訓練資料集對特徵向量空間進行劃分,並作為其分類的「模型」。k值的選擇,距離度量及分類決策規則是k近鄰法的三個基本要素。
演算法如下:
k近鄰演算法的特殊情況是k=1的情形,稱為近鄰演算法。對於輸入的例項點x,最近鄰法將訓練資料集中與x最近鄰點的類作為x的類。
k近鄰法沒有顯式的學習過程。
k近鄰法中,當訓練集、距離度量(歐式距離),k值及分類決策規則(多數表決)確定後,對於任何乙個新的輸入例項,它所屬的類唯一地確定。這相當於根據上述要素將特徵空間劃分為一些子空間,確定子空間裡的每個點所屬的類。
特徵空間中,對每個訓練例項點xi,距離該點比其他點更近的所有點組成乙個區域,叫做單元(cell)。每個訓練例項點擁有乙個單元,所有訓練例項點的單元構成對特徵空間的乙個劃分。最近鄰法將例項xi的類yi作為其單元中所有點的類標記(classlabel)。這樣,每個單元的例項點的類別是確定的。
特徵空間中兩個例項點的距離是兩個例項點相似程度的反映。k近鄰模型的特徵空間一般是n維實數向量rn.使用的距離是歐式距離,但也可以是其他距離,如更一般的lp距離或minkowski距離。
k值的選擇會對k鄰近演算法的結果產生重大影響。
如果選擇較小的k值,就相當於用較小的鄰域中的訓練例項進行**,「學習」的近似誤差會減小,只有與輸入例項較近的訓練例項才會對**結果起作用。但缺點是「學習」估計的誤差會增大,**結果會對近鄰的例項點非常敏感。如果鄰近的例項點恰巧是雜訊,**就會出錯。k值的減小就意味著整體模型變得複雜,容易發生過擬合。
如果選擇較大的k值,就相當於用較大領域中的訓練例項進行**。其優點是可以減少學習的估計誤差。但缺點是學習的近似誤差會增大,這時與輸入例項較遠的訓練例項也會對**起作用,使**發生錯誤。k值的增大就意味著模型變得簡單。
在應用中,k值一般取乙個較小的數值。通過交叉驗證法來選取最優的k值。
k近鄰法中的分類決策往往是多數表決,即由輸入例項的k個鄰近的訓練例項中的多數類決定輸入例項的類。
多數表決規則(majority voting rule)有如下解釋:如果分類的損失函式為0-1損失函式,分類函式為:
誤分類的概率是:
比如k=6,其中有4個分錯了,那麼錯誤率就是4/6,正確率就是2/6.
實現k近鄰法時,主要考慮的問題是如何對訓練資料進行快速k近鄰搜尋。這點在特徵空間的維數大及訓練資料容量大時尤其重要。
最簡單的實現方法是線性掃瞄(linear scan)。這時要計算輸入例項與每乙個訓練例項的距離。當訓練集很大時,計算非常耗時,這種方法是不可行的。
為提高k近鄰搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減少計算距離的次數。
kd樹是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹是二叉樹,表示對k維空間的乙個劃分(partition)。構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一些列的k維超矩形區域,kd樹的每個結點對應對應於乙個k維超矩形區域。
構造kd樹的方法如下:構造根節點,使根節點對應於k維空間中包含所有例項點的超矩形區域;通過下面的遞迴方法,不斷地對k維空間進行切分,生成子結點。在超矩形區域(結點)上選擇乙個座標軸和在此座標軸上的乙個切分點,確定乙個超平面,這個超平面通過選定的切分點並垂直於選定的座標軸,將當前超矩形區域切分為左右兩個子區域(子結點);這時,例項被分到兩個子區域。這個過程直到子區域內沒有例項時終止(終止時的結點為葉子結點)。在此過程中,將例項儲存在相應的結點上。
構造平衡kd樹演算法:
輸入:k維空間資料集t=
其中xi=(xi(1),xi(2),…,xi(k))t, i=1,2,..,n;
輸出:kd樹
(1) 開始:構造根節點,根節點對應於包含t的k維空間的超矩形區域。
選擇x(1)為座標軸,以t中所有例項的x(1)座標的中位數為切分點,將根結點對應的超矩形區域切分為兩個子區域。切分由通過切分點並與座標軸x(1)垂直的超平面實現。
由根結點生成深度為1的左、右子結點:左子結點對應座標x(1)小於切分點的子區域,右子節點對應於座標x(1)大於切分點的子區域。
(2) 重複:對深度為j的結點,選擇x(l)為切分的座標軸,l=j(mod k)+1,以該結點的區域中所有例項的x(l)座標的中位數為切分點,將該結點對應的超矩形區域切分為兩個子區域。切分由通過切分點並與座標軸x(l)垂直的超平面實現。
由該結點生成深度為j+1的左、右子結點:左子結點對應座標x(l)小於切分點的子區域,右子結點對應座標x(l)大於切分點的子區域。
將落在切分超平面上的例項點儲存在該結點。
(3) 直到兩個子區域沒有例項存在時停止,從而形成kd樹區域劃分。
可能有人不明白上述過程是怎麼做的,下面有乙個例項,但是裡面有乙個小小的疑問,x(1)中位數的計算過程是:總共有6個數,從小到大排列為[2.4.5.7.8.9],是偶數個,6/2=3,因此中位數在第三個和第四個之間,(5+7)/2=6,命名計算的中位數是6,而本題卻說中位數是7,所以說得不夠準確。
給定乙個目標點,搜尋其最近鄰。首先找到包含目標點的葉結點;然後從該葉結點出發,依次回退到父結點;不斷查詢與目標點最鄰近的結點,當確定不可能存在更近的結點時終止。這樣搜尋就被限制在空間的區域性區域上,效率大為提高。
包含目標點的葉結點對應包含目標點的最小超矩形區域。依次葉結點的例項點作為當前最近點。目標點的最近鄰一定在以目標點為中心並通過當前最近點的超球體的內部。然後返回當前節點的父結點,如果父結點的另一子結點的超矩形區域與超球體相交,那麼在相交的區域內尋找與目標點更近的例項點。如果存在這樣的點,將此點作為新的當前最近點。演算法轉到更上一級的父結點,繼續上述過程。如果父結點的另一結點的超矩形區域與超球體不相交,或不存在比當前最近點更近的點,則停止搜尋。
用kd樹的最近鄰搜尋的演算法
輸入:已構造的kd樹;目標點x;
輸出:x的最近鄰。
(1) 在kd樹中找出包含目標點x的葉結點:從根結點出發,遞迴地向下訪問kd樹。若目標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點。直到子結點為葉結點為止。
(2) 以此葉結點為「當前最近點」。
(3) 遞迴地向上回退,在每個結點進行一下操作:
a) 如果該結點儲存的例項點比當前最近點距離目標點更近,則以該例項點為「當前最近點」。
b) 當前最近點一定存在於該結點乙個子結點對應的區域。檢查該子結點的父結點的另一結點對應的區域是否有更近的點。具體地,檢查另一子結點對應的區域是否與以目標點為球心、以目標點與「當前最近點」間的距離為半徑的超球體相交。
如果相交,可能在另一子結點對應的區域內存在距目標點更近的點,移動到另乙個子結點。接著,遞迴地進行最近鄰搜尋;
如果不相交,向上回退。
(4) 當退回到根結點時,搜尋結束。最後的「當前最近點」即為x的最近鄰點。
如果例項點是隨機分布的,kd樹搜尋的平均計算複雜度是o(logn),這裡n是訓練例項數。kd樹更適用於訓練例項數遠大於空間維數時的k近鄰搜尋。當空間維數接近訓練例項數時,它的效率會迅速下降,幾乎接近線性掃瞄。
統計學習方法 k近鄰法
k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...
統計學習方法 K近鄰法
k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...
《統計學習方法》 k近鄰法
k近鄰法是一種基本分類與回歸方法。在這裡我們只討論分類問題中的k近鄰法。三要素 k值的選擇 距離度量 分類決策規則 最後會引入一種k近鄰的實現方法 kd樹。輸入 訓練資料集t 輸出 例項x所屬的類y 根據給定的距離度量,在訓練集中找到和x最近的k個點 在這k個點中根據分類決策規則,決定x的類別 注意...