k 近鄰演算法簡單、直觀:給定 乙個訓練資料集,對新的輸入例項,在訓練資料集中 找到與該例項最鄰近的 k 個例項,這 k 個例項的多數屬於某個類,就把該輸入例項分 為這個類。
在應用中,k值一般取乙個比較小的數值。通常採用交叉驗證法來選取最優的k值。
實現k近鄰演算法,主要考慮的問題是如何訓練資料進行快速k近鄰搜尋。
kd是二叉樹,表示對k維空間對乙個劃分。構造kd樹相當於不斷用垂直於座標軸對超平面將k維空間切分,構成一系列對k維超矩形區域。
選取緯度的選擇的依據為資料範圍最大的那一維作為分割緯度,之後也是選中這個緯度的中間節點作為軸點,然後進行分割。
基本的思路很簡單:首先通過二叉樹搜尋(比較待查詢節點和**節點的**維的值,小於等於就進入左子樹分支,等於就進入右子樹分支直到葉子結點),順著「搜尋路徑」很快能找到最近鄰的近似點,也就是與待查詢點處於同乙個子空間的葉子結點;然後再回溯搜尋路徑,並判斷搜尋路徑上的結點的其他子結點空間中是否可能有距離查詢點更近的資料點,如果有可能,則需要跳到其他這裡還有幾個細節需要注意一下,如下圖,假設標記為星星的點是 test point, 綠色的點是找到的近似點,在回溯過程中,需要用到乙個佇列,儲存需要回溯的點,在判斷其他子節點空間中是否有可能有距離查詢點更近的資料點時,做法是以查詢點為圓心,以當前的最近距離為半徑畫圓,這個圓稱為候選超球(candidate hypersphere),如果圓與回溯點的軸相交,則需要將軸另一邊的節點都放到回溯佇列裡面來。
再舉乙個稍微複雜的例子,我們來查詢點(2,4.5),在(7,2)處測試到達(5,4),在(5,4)處測試到達(4,7),然後search_path中的結點為,從search_path中取出(4,7)作為當前最佳結點nearest, dist為3.202;
然後回溯至(5,4),以(2,4.5)為圓心,以dist=3.202為半徑畫乙個圓與超平面y=4相交,如下圖,所以需要跳到(5,4)的左子空間去搜尋。所以要將(2,3)加入到search_path中,現在search_path中的結點為;另外,(5,4)與(2,4.5)的距離為3.04 < dist = 3.202,所以將(5,4)賦給nearest,並且dist=3.04。
回溯至(2,3),(2,3)是葉子節點,直接平判斷(2,3)是否離(2,4.5)更近,計算得到距離為1.5,所以nearest更新為(2,3),dist更新為(1.5)
回溯至(7,2),同理,以(2,4.5)為圓心,以dist=1.5為半徑畫乙個圓並不和超平面x=7相交, 所以不用跳到結點(7,2)的右子空間去搜尋。
至此,search_path為空,結束整個搜尋,返回nearest(2,3)作為(2,4.5)的最近鄰點,最近距離為1.5
參考:
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
K 近鄰演算法
k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...
K 近鄰演算法
首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...