為什麼需要kd樹呢?
因為在實現k近鄰法時,主要考慮的問題是如何對訓練資料進行快速k近鄰搜尋,這點在特徵空間的維度大及訓練資料容量大時尤其必要。k近鄰法最簡單的實現方法是線性掃瞄,這時要計算輸入例項與每乙個訓練例項點的距離,當訓練集很大時,計算非常耗時,這種方法是不可行的。為了提高k近鄰搜尋的效率,可以使用特殊的結果儲存訓練資料,以提高效率。
(1)構造kd樹
kd樹是一種對k維空間(這裡的k指的是k維空間不是knn中的k,knn中的k指的是k個近鄰點)中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹是二叉樹,表示對k維空間的乙個劃分。構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。kd樹的每乙個結點對應於乙個k維超矩形區域。
輸入:k維空間資料集τ
=\tau = \
τ=, 其中xi=
(xi(
1),x
i(2)
,..,
xi(k
)),i
=1,2
,...
,n
;x_i = (x_i^, x_i^, .., x_i^), i = 1, 2, ..., n;
xi=(x
i(1)
,xi
(2)
,..,
xi(k
)),
i=1,
2,..
.,n;
輸出:kd樹
(1)開始:構造根節點,根節點對應於包含t
tt的k維空間的超矩形區域。
選擇x (1
)x^
x(1)
為座標軸,以t
tt中所有例項的x(1
)x^
x(1)
座標的中位數為切分點,將根節點對應的超矩形區域分成兩個子區域,切分由通過切分點並與座標軸x(1
)x^
x(1)
垂直的超平面實現。
由根節點生成深度為1的左、右子節點:左子節點對應座標x(1
)x^
x(1)
小於切分點的子區域,右子節點對應座標x(1
)x^
x(1)
大於切分點的子區域。
將落在切分超平面上的例項點儲存在跟節點上。
(2)重複:對深度為j
jj的節點,選擇x(l
)x^
x(l)
為切分的座標軸,l=j
(mod
k)+1
l = j(mod k) + 1
l=j(mo
dk)+
1,以該節點區域中的所有例項的x(l
)x^
x(l)
座標的中位數為切分點,將該節點對應的超矩形區域劃分為兩個子區域,切分由通過切分點並於座標軸x(l
)x^
x(l)
垂直的超平面實現。
由該結點生成深度為j+1
j+1j+
1的左、右子節點:左子結點對應座標x(l
)x^
x(l)
小於切分點的子區域,右結點對應座標x(l
)x^
x(l)
大於切分點的子區域。
將落在切分超平面上的例項點儲存在該結點。
(2)搜尋kd樹
將kd樹構造成功後,對於任意乙個輸入的點,我們應該如何找到這個點的k個近鄰呢??
這就是我們要將的kd樹。
輸入:已構造的kd數;目標點x;
輸出:x的最近鄰
(1)在kd樹種找到包含目標點x的葉結點:從根節點出發,遞迴地向下訪問kd樹,若目標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點,直到子結點為葉結點為止。
(2)以此葉結點為「當前最近點」。
(3)遞迴地向上回退,在每個結點進行以下操作:
(a)如果該結點儲存的例項點比當前最近點距離目標點更近,則以該例項點為「當前最近點」。
(b)當前最近點一定存在於該結點乙個子結點對應的區域。檢查該子結點的父結點的另乙個結點對應的區域是否有更近的點。具體地,檢查另一子結點對應的區域是否與以目標點為球心、以目標點與「當前最近點」間的距離為半徑的超球面相交。
如果相交,可能在另乙個子結點對應的區域內存在距目標點更近的點,移動到另乙個子結點,接著,遞迴遞迴地進行最近鄰搜尋;
如果不相交,向上回退。
(4)當退回到根節點時,搜尋結束,最後的「當前最近點」即為x的最近鄰點。
如果例項點是隨機分布的,kd樹搜尋的平均計算複雜度是o(l
ogn)
o(log n)
o(logn
),n為訓練例項樹。kd樹更適合用於訓練例項數遠大於空間維度時的k近鄰搜尋,當空間維度接近訓練例項數時,它的效率會迅速下降,幾乎接近線性掃瞄。
同時在sklearn關於knn的演算法中,在底層有兩個選擇:kdtree和ball tree,有興趣的可檢視維基百科關於ball tree的介紹-提取碼:ugem
機器學習演算法總結3 k近鄰法
k近鄰法 k nn 是一種基本分類與回歸方法。演算法思想 給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與其最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為哪個類。k近鄰的特殊情況是k 1的情形,稱為最近鄰演算法。k近鄰演算法沒有顯式的學習過程。1.模型 k近鄰法使用的模型對...
機器學習 統計學習方法 3 k近鄰法 筆記
注 本章只介紹分類問題的k近鄰演算法。t t t 其中,xi x rn x i in mathcal subset r n xi x rn為例項的特徵變數,yi y y i in mathcal yi y 為例項的類別,i 1 2,3 n i 1,2,3,n i 1,2,3,n 例項特徵變數 xxx...
統計學習方法 3K近鄰法
1968年由cover和hart提出。k近鄰法假設給定乙個訓練資料集,其中的例項類別已定。分類時,對新的例項,根據其k個最近鄰的訓練例項的類別,通過多數表決等方式進行 k近鄰法實際上利用訓練資料集對特徵向量空間進行劃分,並作為其分類的 模型 k近鄰法三要素 k值得選擇 距離度量和分類決策規則。lp距...