k近鄰演算法是一種簡單有效的分類與回歸方法。其基本思想是:給定乙個訓練用的資料集,對於新的輸入例項,在訓練資料中找到與該例項最為相似或者接近的k個例項,通過某種表決規則,比如這k個例項的多數類別為某個類a,就把這個新輸入的例項類別歸為這個類a;
k近鄰演算法是很簡單與直觀的。只需要通過簡單的距離度量,比如計算新的輸入例項與訓練用的例項的歐式距離,然後取k個最近的,再少數服從多數,即可實現分類。
k近鄰演算法在處理大量資料時,由於是線性遍歷計算給定測試用例與訓練資料集每乙個例項的距離,消耗時間非常大。kdtree搜尋用於實現k近鄰演算法的快速計算是很有效的。kdtree是一種對k維空間中的例項點進行儲存以便進行快速檢索的樹形結構。
kdtree的構造方法
我將kdtree的構造方法比作切蛋糕就很好理解了。
1、選定某乙個維度,如二維資料(x,y),選擇x這一維度,以資料集中所有例項點x的中位數xm作為切分資料集的標準。可以將資料集分為兩個部分,例項點的xxm的為另外一部分。
2、重複對剛才生成的兩部分繼續按剩下的維度上的中位點繼續切分,直到兩個子區域沒有進一步的子區域可分。
這樣,就可以構造出一棵kdtree。其實很直觀,上述某一次劃分,其實都可以看做左右兩個子節點,不過是某個節點包含了更多的資料維度而已。
kdtree搜尋
kdtree的最近鄰搜尋的思想也是基於上述分塊的思想,如果有的蛋糕塊中的點根本不可能是與給定測試例項點最近的,那麼就不用考慮那塊蛋糕塊去做計算了。
1、首先從最初的劃分根節點向下遞迴訪問kdtree,根據測試例項點當前維的座標與切分點座標的大小,決定去哪找到包含測試例項點的那塊蛋糕。
2、將當前蛋糕塊中的最近點作為當前全域性最近點。
3、遞迴向上回退:a如果該節點儲存的例項點更近,則更新當前全域性最近點;b檢查當前最近點所在區域的父節點的另一子節點中的點,這裡需要先檢查另一子節點所在區域是否與測試例項點同當前全域性最近點所畫的球體相交,若相交才去做計算。
當回退到最初劃分的根節點時,結束搜尋。此時的當前全域性最近點就是最近鄰點。
KDTree簡單理解
kdtree作為乙個樹的結構,通常用來做高維的分割。在分割成為樹的時候,保證下一層節點的比較位如果小於當前的比較位,則向左生長,否則向右生長。所謂的比較位就是當前層數 總的維度,例如三維座標,第一層就是x,第二層就是y,第三層就是z。直接看圖 圖中每一層的比較位用加粗表示了,看第一層,比較位是第一位...
k近鄰法中kd tree樹的建立
經過一天努力實現了kd tree樹二維的建立,但是 只適用於二維,這是令人遺憾的地方。在這個過程中學到了不少東西,特別是對vector的一些用法,多了更多的了解。思路 建立樹時,傳遞vector為形參,以第n 2維為變數,對結構體vector排序,找出中位數,奇數找中間,偶數取第 n 2 1個,以它...
統計機器學習 3 K近鄰法(二)Kd Tree
為什麼需要kd樹呢?因為在實現k近鄰法時,主要考慮的問題是如何對訓練資料進行快速k近鄰搜尋,這點在特徵空間的維度大及訓練資料容量大時尤其必要。k近鄰法最簡單的實現方法是線性掃瞄,這時要計算輸入例項與每乙個訓練例項點的距離,當訓練集很大時,計算非常耗時,這種方法是不可行的。為了提高k近鄰搜尋的效率,可...