1. 程式人生 > >演算法(八):圖解KNN演算法

演算法(八):圖解KNN演算法

演算法簡介

K最相鄰演算法(K-NearestNeighbor Classification Algorithm,KNN)是資料探勘分類技術中最簡單的方法之一,所謂K最近鄰,就是K個最近的鄰居的意思,說的是每個樣本都可以用它最接近的K個鄰居來代表。

KNN演算法的核心思想是如果一個樣本在特徵空間中的K個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

  KNN演算法不僅可以用於分類,還可以用於迴歸。通過找出一個樣本的K個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。

案例

這邊的案例來自"演算法圖解"一書,來自書上的例子,只是為了對KNN演算法有一個基礎認識。

案例一

假設有一個水果(橙子或者柚子), 如何判斷它是橙子或者柚子呢? 這時大腦思維過程一般類似:存在一個水果特徵圖表,假設個頭越大、顏色越黃的就是柚子,如下圖,然後會判斷該神祕水果特徵最接近橙子或者柚子,最接近的就是該水果的種類。

一種方法是看它的鄰居分別是什麼水果來進行判斷,假設看3個鄰居,由上圖所示1,4,7這三個距離最近,因為橙子有2個即1和4節點,柚子只有1個即7節點。橙子比柚子多,所以該未知的水果很有可能為橙子。這簡單的判斷分類的過程便是使用了簡單的KNN演算法來達到分類的目的。

計算2點間的距離可以使用公式(√為平方根符號):

d = √((x1 - x2)² + (y1 - y2)²)

我們進行分類判斷所抽取的特徵為水果的個頭、顏色這2個特徵點,節點3的位置(3,10),節點7的位置(8,15),則2點之間的距離為:

d = √((3 - 8)² + (10 - 15)²) = √(50)

多維座標同上述二維座標一樣,可以使用比如四維度的(x1,y1,z1,w1)與(x2,y2,z2,w2):

d = √((x1 - x2)² + (y1 - y2)² + (z1 - z2)² + (w1 - w2)²)

餘弦相似度

前面計算兩位使用者的距離時,使用的都是距離公式。還有更合適的公式嗎?在實際工作中, 經常使用餘弦相似度(cosine similarity)。假設有兩位品味類似的使用者,但其中一位打分時更 保守。他們都很喜歡Manmohan Desai的電影Amar Akbar Anthony,但Paul給了5星,而Rowan只 給4星。如果你使用距離公式,這兩位使用者可能不是鄰居,雖然他們的品味非常接近。 餘弦相似度不計算兩個向量的距離,而比較它們的角度,因此更適合處理前面所說的情況。

案例二

電影推薦系統:

假設有電影網站,使用者註冊時要求他們對喜歡的電影類別進行評分,現在獲取到如下表的評分資料(滿分5分)。

名稱 喜劇片 動作片 恐怖片 愛情片
小張 3 1 3 5
小王 2 4 4 4
小林 3 3 3 3
小李 5 1 1 3
小陳 2 4 1 4

根據KNN,評分越相近的人,喜愛的電影就會越一致,現在需要給小張推薦電影,就可以把喜好與他最接近的人所收藏的電影推薦給他。

計算出小張與其它人的距離:

比如小張與小王: d = √((3 - 2)² + (1 - 4)² + (3 - 4)² + (5 - 4)² ) = 2√3 ,各種距離如下:

名稱 距離
小張 0
小王 2√3
小林 2√2
小李 2√3
小陳 √15

可以看到小張與小林距離最近,所以可以將小林喜歡的電影推薦給小張。實際中如果給電影網站更多的電影進行評分的話,就可以獲取更加精準的推送,因為網站更能準確判斷你和哪些使用者類似。

使用KNN迴歸預測某個值:

假設有無數個使用者,選取以下5個距離小楊最近的使用者(實際中合理距離內的鄰居數量越多,預測越準確),預測小楊將對各部電影的評分:

名稱 電影A
小張 3
小王 3.5
小林 3
小李 2.5
小陳 2.5

可以簡單的求出這5個鄰居對電影A的平均分: (3 + 3.5 + 3 + 2.5 + 2.5) /5 = 2.9 上述使用了KNN執行2件事:

  • 1.分類:編組,相近的編為一組
  • 2.迴歸:預測結果

假設要從下列5個使用者對電影B評分的平均分來作為電影B最終平均得分的話,則 (1 + 4 + 3 + 1 + 4)/5 = 2.6,但是 上述計算是基於每個人評分的的標準都是一致的,但一般不同的人評分標準不同,比如有的人會給有點喜歡的電影評上4分,但是有的人要求高只會給有點喜歡的電影評上3分。

名稱 電影A 電影B 電影C 電影D 平均分 權重
小張 3 1 3 5 3 1
小王 2 4 4 4 3.5 0.85
小林 3 3 3 3 3 1
小李 5 1 1 3 2.5 0.83
小陳 2 4 1 4 2.75 0.92

所以我們可以計算出每個人大致的平均分,以此簡單判斷每個人的評分標準,比如以小張為每個人的標準模板,則小王所佔權重為 3/3.5 = 0.85(因為小王評分普遍偏高,所以下調點權重),

則電影電影B最終平均得分: (11 + 40.85 + 31 + 10.83 + 4* 0.92)/5 = 2.22

java實現

該小節只是對KNN有基礎的認識,上述例子都是在獲取到資料後進行的簡單資料計算,所以不再展現程式碼。

公眾號