k-nn在軌跡數據采樣率合適的情況下,用于路網映射的子流程中;下面將介紹k鄰近算法的基本概念和算法實現方式;
1.對于給定的訓練集合{(x1,y1),(x2,y2).......(xn,yn)}其中,y為不同的類別,而k鄰近算法所起的作用為,對于給定的訓練集合,當給定新的輸入x時,通過k鄰近算法為其分配一個對應的類;
2.一個k鄰近模型有三個要素;
1)距離的度量
對于給定的x要求出他到達最近k個訓練點的距離,然后根據這k個點,依據某種決策規則,來預測x的類別;多數情況下取得是x-xi的二范數,值得注意的是,不同度量的選取會影響k個近鄰點的選取
2)k值得選取
如上,k的選擇會對k近鄰發的結果產生較大的影響,具體表現在:
k較小時,近似誤差小,估計誤差較大
k較大時,近似誤差大,估計誤差較小
3)分類決策規則
k近鄰算法的分類決策往往是多數表決,也就是把輸入實例的k個近鄰的訓練實例中的多數類決定實例的類。
3.k近鄰算法的實現:kd樹
kd樹是一種類似于R樹的屬性結構,但是我覺得他比R樹要簡單,他的具體構造過程就是先選取一個和訓練集x的維數k相同的超平面矩陣,首先,根結點是包含所有訓練集的超平面矩陣,然后,選取x某個維的中值,來進行劃分,分為左右子結點,再對左右子結點進行遞歸操作,指導無法再分為止。
下面我將介紹兩種kd樹常用的算法:
1)構造平衡kd樹:
輸入:k維訓練集
輸出:kd樹
Step1:構造根節點,其對應包含所有訓練集的k為超矩陣區域
step2:對于給定的結點,選取x的維的中值,在該緯度上,進行垂直劃分,得到左右結點
step3:對于左右子結點進行遞歸操作,終止條件為不可再分時
2)用kd樹實現最近鄰搜索
輸入:kd樹,目標點x
輸出:x的最近鄰
step1:在kd樹中找到包含x的葉子結點,從根結點出發,向下訪問kd樹,到達葉子結點為止
step2:把得到的葉子結點作為當前最近點。
step3:遞歸向上回退,執行以下操作:
1.如果結點所保存的實例點比當前最近點更近,那么把改點作為當前最近點
2.當前最近的點一定存在于該節點的一個子結點對應的區域,檢查該區域的另外一個子節點是否有更近的點,并檢查以目標點和當前最近的點的距離為半徑的超球體相交,如果相交,那么可能純在另外一個子節點對應區域內存在距離目標點更近的點,移動到另外一個子節點,然后進行遞歸的最近鄰搜索
如過不相交,則向上回退
step4:當回退到根節點時,搜索結束,最后的‘當前最近點’即為x的最近鄰點