k近鄰演算法
knn是通過測量不同特徵值之間的距離進行分類。它的的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。下圖紅色,藍色,代表不同類別的樣本,綠色代表待分樣本。
上圖的表述並不準確,應該是選取距離綠色點最近的k個樣本,而沒有畫出來的這個圈的範圍,(固定大小的圈,圈中各種型別的點來計數,待分樣本依據圈中某類樣本數多分類,這種想法是錯誤的)。應該是選取固定數量的樣本,因為樣本的分布範圍不均勻,所以圈是不固定大小的。
knn演算法
優點:對異常值不敏感,無資料輸入假定,精度高
缺點:計算複雜度很高
k值的選擇對結果影響大
資料不平衡情況下,表現很差
knn適用於數值型的標稱資料
k近鄰的距離度量
1)曼哈頓距離(街區距離)
2)歐式距離
3)余弦距離
k值的選擇
1)選擇較小的k值
學習的近似誤差會減小,學習的估計誤差會變大
雜訊敏感
k值小 意味著整體模型複雜,容易過擬合。
k近鄰演算法的演算法:kd樹
kd樹是一種對k維空間的例項點進行儲存以便對其進行快速檢索的樹形資料結構
kd樹是二叉樹
不斷用垂直於座標平面的超平面將k維空間切分,形成k 維超矩形區域
kd樹的構造演算法:
1)構造根節點
計算輸入的所有樣本每個維度(樣本的列方向)的方差(a1,a2,a3,a4,a5,....,an),選擇方差最大的維作為第乙個切分的維度,方差大,說明資料在這個維度分的比較開。按這個維度的維度值對樣本從大到小排序,選擇中位數的樣本,切開空間,樣本被分為2部分。
2)再在前面劃分的子空間進行再次劃分。
3)結束條件:直到此空間中只包含乙個資料點。
kd樹的構造例項:
假設有6個二維資料點,資料點位於二維空間內,如下圖所示。為了能有效的找到最近鄰,k-d樹採用分而治之的思想,即將整個空間劃分為幾個小部分,首先,粗黑線將空間一分為二,然後在兩個子空間中,細黑直線又將整個空間劃分為四部分,最後虛黑直線將這四部分進一步劃分。
6個二維資料點構建kd樹的具體步驟為:
確定:split域=x。具體是:6個資料點在x,y維度上的資料方差分別為39,28.63,所以在x軸上方差更大,故split域值為x;
確定:node-data = (7,2)。具體是:根據x維上的值將資料排序,6個資料的中值(所謂中值,即中間大小的值)為7,所以node-data域位資料點(7,2)。這樣,該節點的分割超平面就是通過(7,2)並垂直於:split=x軸的直線x=7;
確定:左子空間和右子空間。具體是:分割超平面x=7將整個空間分為兩部分:x<=7的部分為左子空間,包含3個節點=;另一部分為右子空間,包含2個節點=;
構造的kd樹如下:
kd樹的插入
kd樹的插入與二叉樹的插入類似。
kd樹的最近鄰搜尋
通過二叉搜尋,順著搜尋路徑很快找到最鄰近的葉子節點,但是這個葉子節點和並不一定是最近鄰的點,需要進行回溯操作,也就是沿著搜尋路徑方向查詢是否有更加的資料點。
舉例:查詢點(2.1,3.1)
星號表示要查詢的點(2.1,3.1)。通過二叉搜尋,順著搜尋路徑很快就能找到最鄰近的近似點,也就是葉子節點(2,3)。而找到的葉子節點並不一定就是最鄰近的,最鄰近肯定距離查詢點更近,應該位於以查詢點為圓心且通過葉子節點的圓域內。為了找到真正的最近鄰,還需要進行相關的『回溯'操作。
也就是說,演算法首先沿搜尋路徑反向查詢是否有距離查詢點更近的資料點。
以查詢(2.1,3.1)為例:
二叉樹搜尋:先從(7,2)點開始進行二叉查詢,然後到達(5,4),最後到達(2,3),此時搜尋路徑中的節點為,首先以(2,3)作為當前最近鄰點,計算其到查詢點(2.1,3.1)的距離為0.1414,
回溯查詢:在得到(2,3)為查詢點的最近點之後,回溯到其父節點(5,4),並判斷在該父節點的其他子節點空間中是否有距離查詢點更近的資料點。以(2.1,3.1)為圓心,以0.1414為半徑畫圓,如下圖所示。發現該圓並不和超平面y = 4交割,因此不用進入(5,4)節點右子空間中(圖中灰色區域)去搜尋;
最後,再回溯到(7,2),以(2.1,3.1)為圓心,以0.1414為半徑的圓更不會與x = 7超平面交割,因此不用進入(7,2)右子空間進行查詢。至此,搜尋路徑中的節點已經全部回溯完,結束整個搜尋,返回最近鄰點(2,3),最近距離為0.1414。
2.5.2、舉例:查詢點
(2,4.5)
乙個複雜點了例子如查詢點為(2,4.5),具體步驟依次如下:
同樣先進行二叉查詢,先從(7,2)查詢到(5,4)節點,在進行查詢時是由y = 4為分割超平面的,由於查詢點為y值為4.5,因此進入右子空間查詢到(4,7),形成搜尋路徑,但(4,7)與目標查詢點的距離為3.202,而(5,4)與查詢點之間的距離為3.041,所以(5,4)為查詢點的最近點;
以(2,4.5)為圓心,以3.041為半徑作圓,如下圖所示。可見該圓和y = 4超平面交割,所以需要進入(5,4)左子空間進行查詢,也就是將(2,3)節點加入搜尋路徑中得;於是接著
搜尋至(2,3)葉子節點,(2,3)距離(2,4.5)比(5,4)要近,所以最近鄰點更新為(2,3),最近距離更新為1.5;
回溯查詢至(5,4),直到最後回溯到根結點(7,2)的時候,以(2,4.5)為圓心1.5為半徑作圓,並不和x = 7分割超平面交割,如下圖所示。至此,搜尋路徑回溯完,返回最近鄰點(2,3),最近距離1.5。
上述兩次例項表明,當查詢點的鄰域與分割超平面兩側空間交割時,需要查詢另一側子空間,導致檢索過程複雜,效率下降。
一般來講,最臨近搜尋只需要檢測幾個葉子結點即可,如下圖所示:
但是,如果當例項點的分布比較糟糕時,幾乎要遍歷所有的結點,如下所示:
研究表明n個節點的k維k-d樹搜尋過程時間複雜度為:t
worst
=o(kn
1-1/k)。
《統計學習方法》第三章 k近鄰演算法
給定乙個訓練集,對新的輸入例項,在訓練資料集彙總找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.2.1 距離度量 特徵空間中兩個例項點的距離是兩個例項點相似程度的反映.距離度量可以使用歐式距離,或更一般的lp距離 minkowski距離.2.2 k值的選擇 在應用...
統計學習方法 第三章 k近鄰法
k近鄰法是一種基本的分類與回歸方法,這裡只討論分類問題中的k近鄰法。演算法描述 首先給定乙個訓練集,對於待分類的輸入資料,在訓練集中找到與該輸入資料最鄰近的k個樣本,這k個樣本中哪個類別最多,就把待分類資料分給這個類。k近鄰法沒有顯式的學習過程。k近鄰法的三個基本要素 當這三個要素確定後,任何乙個新...
統計學習方法筆記 第三章 K近鄰法
k近鄰法 knn 是一種基本的分類與回歸的方法,這裡只介紹其分類問題。knn演算法的基本思想 對於乙個新的輸入資料點,在訓練集中找到與它距離最近的k個點,若這k個點中大部分屬於a類,則該資料點也屬於a類。演算法流程 特殊地,若k 1,則相當於離輸入例項最近的乙個樣本例項直接決定了它的類別。knn模型...