k近鄰演算法的實現:kd樹

預知夢_發表於2018-05-10

    k近鄰演算法最簡單的實現方法是線性掃描。但當訓練集很大時,搜尋效率低,為了提高效率,可構建kd樹。

一、構建kd樹

    以中位數作為切分點得到的kd樹時平衡樹。kd樹本身是一個二叉樹,對特徵空間進行劃分。

    演算法:輸入:資料集T

                輸出:kd樹

            1.構造根節點,選擇第一個特徵為座標軸,然後只考慮第一個特徵,對所有例項的第一個特徵的值進行排序,找出中位數,並由此作為切分點,將資料集劃分為兩大部分。(將落在切分超平面的點即中位數對應點放在結點上)。

            2.重複:依次對各個座標軸進行切分,再從第一個座標軸迴圈切分。

            3.結束:直至兩個子區域沒有例項存在時停止。

            二維的切分可以如下圖:

                    

二、搜尋kd樹

    構建好kd樹看起來是個冗餘的過程,但是構建完成之後,對特例點進行找尋鄰近點時就會大大提高效率。類似於linux命令的locate和find命令。

    利用kd樹進行最近鄰搜尋:

            輸入:已構造的kd樹,目標點x

            輸出:x的最近鄰

            步驟:1.在kd樹中找出包含目標點x的葉節點。

                        2.以此葉結點作為當前最近點。

                        3.遞迴向上回退,對每個結點進行操作:

                            如果該結點儲存的例項點比當前最近點距離近,更新最近點為此結點。

                            檢查該子節點的父節點的另一子節點對應區域是否有更近點。如果有,更新。

                            接著,遞迴向上進行搜尋。

                        4.當回退到根結點時,搜尋結束。

kd樹搜尋的平均計算複雜度時O(logN)。

kd樹更適用於訓練示例數遠大於空間維數時的k近鄰搜尋。

相關文章