K近鄰演算法(KNN)推導分析

2021-08-08 20:26:21 字數 1447 閱讀 3767

knn和kd樹介紹

author:divinershi

優點:

直觀,簡單,可以用來做分類也可以用來做回歸

可用於非線性分類,訓練時間複雜度為o(n)

準確度高,對資料沒有假設,對outier不敏感。

缺點:

計算量大,樣本不平衡問題難處理,需要大量的記憶體

演算法解釋:

給定乙個資料集,對新的輸入樣本,在資料集中找到與新的輸入樣本距離最近的k個樣本,將這k個樣本中最多數屬於某個類的那個類別當作新的輸入樣本的類別。

即在距離最近的k個鄰域內,去確定新的輸入樣本x的類別y:

n為類別c的個數,k為選擇的鄰域內樣本個數,i為指示函式,即當時i為1,否則為0。

當k為1,是該演算法就是最近鄰演算法,k的選擇會一定程度影響演算法效能,當k很小的時候,演算法很容易受到雜訊的影響,使得演算法的bias較大,而且如果資料集很大,意味著模型很複雜,很容易過擬合

如果k=n,那麼就是整個資料集了,那麼無論輸入的是啥樣本,選擇的都是整個資料集中數量最多的那個類別。所以當k選擇較大的時候,此時模型過於簡單,variance過大,容易欠擬合

最常見的是歐式距離,也可以曼哈頓距離,或者其他lp距離,看具體問題具體選擇。

k近鄰最簡單的實現就是直接遍歷整個資料集,叫線性掃瞄(linear scan),但是這樣的話,需要將輸入的樣本和資料集中每個樣本進行度量距離,如果資料集很大的話,計算是非常耗時的。所以比較常見的是kd樹

kd樹是乙個二叉樹,利用樹來對k維空間進行劃分。

構造kd樹:

1.先計算每個特徵的方差(資料方差大說明沿著這個座標軸方向上資料點分散的比較開,在這個方向上進行資料分割可以獲得最大的區分度),降序排列構建二叉樹。

2.計算每個特徵的中位值(最中間的作為分割節點),將中位值所在的節點作為分割節點,比它大的放右節點,小的放左節點。

3.以此遞迴,直到最後要劃分的子空間中只有乙個資料點。

搜尋:1.搜尋最近鄰點,沿著路徑搜尋即可,找到葉子節點,計算搜尋節點和葉子以搜尋節點和葉子節點的距離儲存為最近距離。

2.回溯,比較上一節點和搜尋節點距離與之前的最近距離的大小,比當前最近距離小的話,替換當前節點所計算的距離為最小距離。去該節點的另一子節點進行搜尋,判斷是否還有更小的距離存在。以此回溯。

3.到根節點時結束。

該演算法在分類時有個重要的不足是,當樣本不平衡時,即:乙個類的樣本容量很大,而其他類樣本數量很小時,很有可能導致當輸入乙個未知樣本時,該樣本的k個鄰居中大數量類的樣本占多數。

當維數過大時,直接利用kd樹快速檢索的效能急劇下降。假設資料集的維數k,那麼資料集的規模n最好遠大於2的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...

K近鄰演算法 KNN

k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...