轉載請註明出處: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.