轉載請注明出處:http://blog.csdn.net/luoshixian099/article/details/50923056
勿在浮沙築高台
KNN概念
KNN(K-Nearest Neighbors algorithm)是一種非參數模型算法。在訓練數據量為N的樣本點中,尋找近期鄰測試數據x的K個樣本,然后統計這K個樣本的分別輸入各個類別w_i下的數目k_i,選擇最大的k_i所屬的類別w_i作為測試數據x的返回值。當K=1時,稱為近期鄰算法,即在樣本數據D中,尋找近期鄰x的樣本,把x歸為此樣本類別下。經常使用距離度量為歐式距離。
算法流程:
左圖所看到的:在二維平面上要預測中間'*'所屬顏色,採用K=11時的情況,當中有4黑色,7個藍色,即預測'*'為藍色。
右圖所看到的:當K=1時,即近期鄰算法。相當於把空間划分成N個區域,每一個樣本確定一塊區域。每一個區域中的點都歸屬於該樣本的類別,由於該區域的數據點與所用樣本相比與區域樣本近期,此算法也被稱為Voronoi tessellation。
--------------------------------------------------------------------------------------------------------------------------------------------
以下四副圖像是在一個二維平面上。數據點類別為3類。採用K=10。圖(a)為樣本數據點。圖(b)為平面上每一個位置屬於y=1(相應‘+’)的概率熱量圖像。圖(c)為類別y=2(相應'*')時相應的熱量圖像;圖(d)採用MAP預計(即最大概率的類別)平面各點所屬類別。
------------------------------------------------------------------------------------------------------------------
KNN算法誤差率
如果最優貝葉斯分類率記為P_B,依據相關論文證明KNN算法的誤差率為:
當數據樣本量N趨於無窮大時。K=1時: ,M為數據類別總數
當數據樣本量N趨於無窮大時,M=2時:;
由公式看出,KNN的算法要優於1-NN算法,由於減少了誤差下界。
並隨着k的增大。P_kNN漸近於最優誤差率P_B;其實,當k->∞時(但仍然占樣本總量N非常小一部分),KNN算法准確率趨近於貝葉斯分類器。
KNN算法的問題
- 當數據量N非常大,同一時候數據維度D非常高,搜索效率會急劇下降。
若採用暴力求解法。復雜度為
。為增大效率,能夠採用KD樹等算法優化。見:KD樹與BBF算法解析
- 有時依據現實情況,須要減少樣本數量,能夠採用prototype editing或者condensing算法等;prototype editing算法採用自身數據樣本作為測試樣本,應用KNN算法,若分類錯誤則剔除該樣本。
- 當樣本總量N非常小時,會造成錯誤率上升。一種解決的方法是訓練度量距離方法,對不同的樣本採用不同的度量方法目的是為了減少錯誤率。此種方法能夠分為:全局方法(global)、類內方法(class-dependent)、局部方法(locally-dependent)。
Ref:Machine Learning: A Probabilistic Perspective
Pattern Recognition,4th.