提到k近鄰,k-nearest neighbors(它的k是指有多少個鄰居),總是容易想起另外乙個叫k-means的聚類演算法(它的k指有多少個質心),容易搞混淆,它們有一部分思路也很接近,但是knn能做分類和回歸。
k近鄰之所以叫k近鄰,是因為它的思想就是「你與你的鄰居很相似」。所以對於分類來說,找到k個最近的鄰居,用投票法找出最多數的類別,就將資料點**為該類別。同理,回歸的話輸出最近的k個樣本的平均值作為**值。
距離是乙個很重要的概念,通過距離才能找到最近的k個鄰居。
最常用的是歐式距離:
也可以用曼哈頓距離:
甚至通用的閔可夫斯基距離:
可以看到歐氏距離和曼哈頓距離分別就是閔氏距離當p = 2 和p = 1時的特殊情況。
在定義了距離後,需要設定k的值,當k越小時,找到的鄰居就越少,無法保證資料的多樣性,模型的複雜度越大,這時候偏差小,但是帶來的問題是泛化能力變差,方差較大,容易發生過擬合。
當k越大時,會有更多的鄰居參與計算,雖然偏差更大,但這時候可以保證資料的多樣性,同時增強泛化能力,模型變得更加簡單。極端情況是k等於樣本總數,這時候只是簡單**為在訓練例項中最多的類,模型過於簡單。
綜上,找到乙個合適的k值很重要,一般來說,根據樣本分佈選擇乙個較小的k值,再通過交叉驗證對k值進行優化。
但是,如果如上述方式來進行計算, 在樣本量少,特徵少的時候簡單有效。但遇到樣本量幾十萬以上,特徵數上千,演算法的時間效率就很成問題。因此為了解決這樣的問題,採取了兩種辦法,一種是kd樹,一種是球樹。
knn中的k代表最近的k個樣本,kd(k-dimension)樹中的k代表特徵的維數。kd樹是二叉樹,是一種對k維空間中例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹表示對k維空間的乙個劃分(partition),構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。kd樹的每個結點對應於乙個k維超矩形區域。
(1)對所有特徵進行方差排序,找到方差最大的特徵
(2)找到上述特徵的中位數,對小於等於中位數的所有點劃分到左子樹,大於中位數的所有點劃分到右子樹
(3)返回步驟(1),用同樣的方法劃分左右子樹
假設資料點為6個,,最後得到類似劃分的二叉樹(就是kd樹)以及劃分的特徵空間。
所有點最後就變成了對應的葉子節點。
假設要查詢的點(2, 4.5)。根據構建的kd樹,先從根節點(7,2)開始,然後查詢到(5,4),而這個點是通過第二維劃分空間的(該維方差更大),即y = 4來劃分,於是由於4.5大於4,查詢到了(4,7),為葉子節點,此時搜尋路徑為,並計算當前葉子節點到查詢點的距離,假設為a,回溯乙個點(5,4),計算查詢點到回溯點的距離,假設為b。若a小於b,則最近鄰點就為當前葉子點。若a大於b,則回溯到回溯點,此時搜尋路徑為,並以b為半徑做超球面,進入回溯點(5,4)的左半空間進行查詢到(2,3),此時搜尋路徑為,(2,3)比(5,4)更近,所以最近鄰點更新為(2,3)。以1.5為半徑作圓,回溯至(5,4),不與y = 4相交,然後回溯至(7,2),不與x = 7相交。至此搜尋結束,返回最近鄰點(2,3),最近距離1.5。
接下來忽略已選的樣本,重新選最近鄰,繼續跑k-1次,一共得到k個最近鄰,根據多數表決法**為k個最近鄰里有最多類別數的類別。回歸的話直接求k個最近鄰的平均值作為回歸**值。
kd樹劃分後大大減少無效的最近鄰搜尋,很多樣本點由於所在超矩形和超球體不相交,根本不需要計算距離,節省了時間。
kd樹使用超矩形,有稜角,可能有的半徑稍微大一點就會與劃分線相交,這導致可能出現很多冗餘的計算。
而球樹,內部二叉樹對應的不再是超矩形,而是超球體。
(1)先構建包含所有樣本的超球體
(2)通過找到離球心最遠的點a,然後找到離a最遠的點b,對所有點找到離這兩個點中最近的乙個進行聚類,然後計算新的聚類中心,並計算每個聚類能夠包含所有資料點所需的最小半徑。新生成的兩個超球體與kd樹里的左右子樹對應。
(3)返回(2),在新生成的超球體裡繼續**、聚類,最終形成球樹。
當遇到樣本不均衡的情況時,這導致稀有類別樣本在找k個最近鄰時,會把距離較遠的其它樣本考慮進來,而導致**不準確。為此限定乙個最大距離,只在乙個距離範圍內搜尋所有的最近鄰。這個距離稱為限定半徑。
質心演算法:對每個類的所有資料求質心,也就是n維特徵求平均值。最終每個類都有乙個質心點。做**時僅僅比較樣本與質心的距離,最小的距離對於質心類別即為**的類別。通常在文字分類中使用這個演算法。
優點:(1)理論成熟,思想簡單
(2)可用於非線性分類
(3)時間複雜度比支援向量機低,僅為o(n)
(4)對異常點不敏感
缺點:(1)只適合樣本容量大的自動分類,而樣本容量小的類(不均衡樣本)容易誤分
(2)在特徵數多的時候計算量大
(3)kd樹、球樹需要大量記憶體
(4)**時速度比邏輯回歸之類的演算法慢
(5)相比決策樹,knn模型可解釋性不強
K近鄰 KNN 演算法總結
knn演算法是選擇與輸入樣本在特徵空間內最近鄰的k個訓練樣本並根據一定的決策規則給出輸出結果。決策規則 分類任務 輸出結果為k個訓練樣本中佔大多數的類。回歸任務 輸出結果為k個訓練樣本值的平均值。如下圖的分類任務,輸出結果為w1類。k值的選擇 距離度量和分類決策規則是k近鄰演算法的三個基本要素。分類...
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...
k近鄰演算法 kNN
核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...