K-最近鄰算法
引入:是不是鴨子?
“如果走像鴨子,叫像鴨子,看起來還像鴨子,那麼它很可能就是隻鴨子。”
上面這句諺語可以這樣理解,將“走”、“叫”,“看”刻畫成三個維度:“走路姿態”、“聲音”、“外觀”,已知的每個樣例(是否是鴨子)都是三維空間的一個點,現在有一個測試樣例,如果它的“走路姿態”、“聲音”、“外觀”與數據點中k個“是鴨子”類別近似(鄰近)那麼就認爲該點代表的測試樣例“是鴨子”。
這樣就得到了最近鄰分類的概念:如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。
也就是我們常聽到的“近朱者赤,近墨者黑”的思想。
案例爲本的學習(Case based learning)——惰性學習
KNN最近鄰算法是數據挖掘中最基本的一個學習算法,它甚至不是一種可以進行自身學習的方法,只是機械的進行距離的計算。因爲他是基於檢驗樣本和已知的訓練樣本距離的計算稱案例爲本的學習,同時它也是一種惰性學習方法。
惰性學習法(lazy learner)簡單地存儲給定訓練元組,直到等待給定一個檢驗元組時才進行泛化,以便根據與已儲存的訓練元組的相似性進行分類或數值預測。
對於分類問題,根據“少數服從多數”的原則判斷類別;對於數值預測問題,用“求平均”的方法進行預測。
KNN的原理
KNN的原理就是將需要分類的數據與訓練數據相比對,在事先指定的範圍內(K的數量)找到與測試數據距離最近的k個鄰居,根據它的類別判斷測試樣本的類別。
如上圖,已有分好的三類訓練樣本,對於給定的新的測試樣本:未知類別的綠色圓,通過計算最相似的K數據的類別確定新測試樣本的類別。
若K=3,此時和它最相似(鄰近)的三個樣本中有兩個是紅三角,一個藍方形,此時根據“多數表決”未知樣本是“紅三角”;
若K=5,此時和它最鄰近的五個樣本中3個藍方塊,2個紅三角,此時未知樣本是“藍方塊”。
相似性的度量
數據預處理
根據上面所說的概念和原理,一個很重要的問題就是相似性的度量,即距離的計算,然而影響距離的一個很重要的因素是數據的量綱。比如數據的兩個維度是:年齡、收入。若收入以元做單位,此時變量數量級差別較大,分類結果容易受收入主導而弱化了年齡這個特徵。
因此,在進行KNN算法之前,需要對數據進行預處理以消除量綱。
均值規範化
其中爲樣本均值,爲樣本方差。規範化後的數據服從均值爲0標準差爲1的標準正態分佈。
但是由於其取值的99%都在[-3,3]範圍中,涉及到負值,而有些算法希望取值在0-1之間,因此還有下面的極值正規化的方法。
0-1規範化
規範化後的數據取值在0-1之間,具有良好的性質。
例:下面圖片爲年齡和收入的數據,求其極值正規化後的結果。
易得,上述數據中imcome最小爲:20000,最大爲:60000;年齡最小爲20,最大爲50。
以年齡25000爲例,得到以下結果:
距離計算
- 閔可夫斯基距離(Minkowski Distance)
其中可以隨意取值。 - 曼哈頓距離
- 歐氏距離
繼續根據上述標準化以後的兩個樣本點ID=3,和ID=6計算距離(相似度),選擇歐式距離,有:
對於給定新的測試樣本,和剛纔一樣與每一個訓練樣本計算距離得到最近的K個樣本點的類別(或數值),再對類別進行多數表決(對數值求平均)。
算法步驟及實例計算
記K爲最近鄰數、D爲訓練樣例集合。
(1)對每個測試樣例計算其與每個訓練樣本之間的距離d(x’,x);
(2)選擇距離k個訓練樣本點最近的訓練樣例的集合
(3)根據多數表決,其中v爲類標,是最近鄰的類標號,I(·)是示性函數。
假設新的數據點爲Age=20,Income=30000
數據標準化:
新測試樣本和訓練樣本距離歐式計算:
測試樣本和每個訓練樣本 | 距離(保留兩位小數) |
---|---|
1_new | 0.25 |
2_new | 1.01 |
3_new | 0.35 |
4_new | 0.53 |
5_new | 1.03 |
6_new | 0.87 |
根據K的值進行分類(多數表決)
取K=3,此時和測試樣本最鄰近的樣本點有1、3、4。其中標籤爲兩個“B”,一個“G”,根據多數表決原則,新測試樣本標籤爲“B”。
KNN的優缺點
- 優點:
- 原理簡單、容易實現。
- 使用和具體的訓練實例進行預測,不必維護源自數據的模型(無須建模)
- 決策邊界更加靈活
- 缺點:
- 分類測試集樣例時的開銷較大
- K值選取不易,K較大時容易忽略重要模式;K較小時容易受到噪聲影響。
代碼
KNN手寫上述例子:☞代碼請戳☜
參考文獻
《數據挖掘導論》
CDA建模考試大綱解析