knn基礎與優化1 kd tree

2021-10-05 22:43:42 字數 2751 閱讀 2972

knn(k-nearest neighbours),k最近鄰演算法,是乙個基於距離的有監督演算法,常被用於分類問題的演算法,它也可以用於回歸問題。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個資料點都可以用它最接近的k個鄰居資料點來代表。當用於分類時,用k個最近鄰居所屬類別的多數做**結果;當用於回歸時,用k個最近鄰居對應標籤的平均值來表示**結果。knn演算法雖然簡單,但在資料量較大時,效果還是相當不錯的。

注意事項:

雖然knn可以暴力實現,就是每**乙個樣本,就計算其與每個訓練樣本的距離,找到k個最近鄰居,但複雜度

kd-tree (k-dimension tree) 是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd-tree是一種二叉搜尋樹,樹節點的**表示著使用貼著座標軸的超平面把資料空間切割成兩個子空間,不斷**直至節點中包含資料點數小於一定的數量,**停止,kd-tree構造完成,最終資料空間被切成了乙個個超矩形子空間,如下圖所示。kd樹的每個結點對應於乙個超矩形空間區域,每個非葉子節點都在分割超平面上。利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的次數。

kd-tree構建過程中,涉及兩個問題:維度如何選取?分割點如何選取?這兩個問題都可以歸到同乙個目標,即選取的值要讓構造出來的樹深盡可能的小,即樹盡可能平衡。

問題1:維度如何選取?選取方差最大的那個維度,能使資料空間劃分得更加均勻;但由於這樣計算量比較大,一般多使用輪流選擇每個維度進行劃分的方法。

問題2:分割點如何選取?很明顯,選擇中位數,均分資料,左邊一半,右邊一半。

kd-tree構建的示例圖(引用自:

在訓練階段構建好kd-tree後,通過kd-tree進行k最近鄰搜尋時是如何減少搜尋的次數的呢?簡單起見,先闡述k=1時的搜尋過程:

找到待**樣本在kd-tree中所屬的葉子節點;

計算樣本與當前節點的距離,如小於最近距離d0,則更新最小距離、更新最近點為當前節點;

計算與(當前節點的父節點所在的)分割超平面的距離

若d0

移動到父節點,重複過程1.1~1.3;

重複步驟2,直至回退到根結點時,搜尋結束,輸出結果。

以上圖中的kd-tree為例,搜尋點(3,4.5)的最近鄰,過程如下:找到對應的葉子節點(4,7),與其距離為2.69,大於與父節點(5,4)所在分割超平面的距離0.5;移動到兄弟節點(2,3),計算距離為1.8,更新最近鄰;移動到節點(5,4),計算距離2.06>1.8,不更新最近鄰,計算與父節點(7,2)所在分割超平面的距離4>1.8,不搜尋兄弟節點;移動到節點(7,2),計算距離4.72>1.8,不更新最近鄰,結束;返回最近鄰(2,3)。

k>1的情況相似,具體如下:

找到待**樣本在kd-tree中所屬的葉子節點;

計算樣本與當前節點的距離,如小於第k個最近距離

計算與(當前節點的父節點所在的)分割超平面的距離

大,即其兄弟節點對應區域中的資料點一定不會成為k個最近鄰中的一員;反之,則當前節點的兄弟節點所對應的區域中可能有資料點的距離比當前小,即可能有資料點會成為k個最近鄰中的一員,移動到兄弟節點,遞迴進行最近鄰搜尋

移動到父節點,重複過程1.1~1.3;

重複步驟2,直至回退到根結點時,搜尋結束,輸出結果。

從以下幾個方面來講kd-tree的效能:

訓練資料量n對效能的影響

n對kd-tree的影響表現在樹深logn上,一般n較小時kd-tree相比暴力knn沒什麼優勢,n較大時優勢才會顯現。

資料維度d對效能的影響資料維度d對效能的影響體現在兩個方面:

影響距離計算的耗時;

影響搜尋時的剪枝

由距離的計算公式可知,維度d越大,距離越偏大,即會越大,很容易造成搜尋時需要去搜尋兄弟節點,而減少了剪枝的次數,使得搜尋次數大為增加,過大的d甚至會造成沒有剪枝,效能退化成暴力knn。

由於kd-tree的每次**都是選擇乙個維度來進行的,樹上任一一條路徑所使用的維度數量最多也只有logn,當用上的維度也沒有得到更進一步的劃分,導致劃分出的超矩形子空間都比較大,空間內的資料密度會比較低,資料點之間相隔較遠,而導致增大,很容易造成搜尋時需要去搜尋兄弟節點,而減少了剪枝的次數,使得搜尋次數大為增加;想想在二維空間中,都需要劃分很多次,才會顯現出kd-tree的效能。

sklearn中推薦d不大於20左右時使用kd-tree,否則推薦使用ball-tree。

訓練資料的結構對效能的影響其實資料維度d大時,訓練資料的本徵維度d(可以理解為主成分分析中的一些主要維度)並不一定會大,所以效能2.2.1的影響本質上還是取決於本徵維度d;

訓練資料的空間分布密度也會對效能有較大影響,與2.2.2是一樣的,即空間內的資料密度比較低時,會導致增大,很容易造成搜尋時需要去搜尋兄弟節點,而減少了剪枝的次數,使得搜尋次數大為增加

最近鄰個數k對效能的影響最近鄰個數k對效能的影響表現在搜尋時的剪枝上,從前面的搜尋過程可以知道,當k增大時,也會增大,很容易造成搜尋時需要去搜尋兄弟節點,而減少了剪枝的次數

KNN的優化演算法2 KD tree

傳統knn缺點 資料量特別大時,需要計算參考點和每個樣本點的距離,計算量非常大,所以提出一種優化演算法 kd tree.為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。kd樹 k dimension tree 是一種對k維空間中的例項點進行儲存以便對其進行快速檢索...

KNN的優化演算法1 距離加權

參考文章 對參考文章中最後一部分說的有問題的地方進行了修改。權值加權 為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。該方法最簡單的形式是返回距離的倒數,比如距離d,權重1 d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距...

knn演算法原理與實現(1)

一 演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個資料中出現類別最多的作為新輸入資料的label。模型用公式表示如下 二 python 實現 author gujun bill k...