K最相鄰算法(K-NearestNeighbor Classification Algorithm,KNN)是數據挖掘分類技術中最簡單的方法之一,所謂K最近鄰,就是K個最近的鄰居的意思,說的是每一個樣本均可以用它最接近的K個鄰居來表明。java
KNN算法的核心思想是若是一個樣本在特徵空間中的K個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。該方法在肯定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法在類別決策時,只與極少許的相鄰樣本有關。因爲KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來肯定所屬類別的,所以對於類域的交叉或重疊較多的待分樣本集來講,KNN方法較其餘方法更爲適合。算法
KNN算法不只能夠用於分類,還能夠用於迴歸。經過找出一個樣本的K個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就能夠獲得該樣本的屬性。更有用的方法是將不一樣距離的鄰居對該樣本產生的影響給予不一樣的權值(weight),如權值與距離成反比。網站
這邊的案例來自"算法圖解"一書,來自書上的例子,只是爲了對KNN算法有一個基礎認識。rest
假設有一個水果(橙子或者柚子), 如何判斷它是橙子或者柚子呢? 這時大腦思惟過程通常相似:存在一個水果特徵圖表,假設個頭越大、顏色越黃的就是柚子,以下圖,而後會判斷該神祕水果特徵最接近橙子或者柚子,最接近的就是該水果的種類。cdn
一種方法是看它的鄰居分別是什麼水果來進行判斷,假設看3個鄰居,由上圖所示1,4,7這三個距離最近,由於橙子有2個即1和4節點,柚子只有1個即7節點。橙子比柚子多,因此該未知的水果頗有可能爲橙子。這簡單的判斷分類的過程即是使用了簡單的KNN算法來達到分類的目的。blog
計算2點間的距離可使用公式(√爲平方根符號):it
d = √((x1 - x2)² + (y1 - y2)²)數據挖掘
咱們進行分類判斷所抽取的特徵爲水果的個頭、顏色這2個特徵點,節點3的位置(3,10),節點7的位置(8,15),則2點之間的距離爲:io
d = √((3 - 8)² + (10 - 15)²) = √(50)table
多維座標同上述二維座標同樣,可使用好比四維度的(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件事:
假設要從下列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
該小節只是對KNN有基礎的認識,上述例子都是在獲取到數據後進行的簡單數據計算,因此再也不展示代碼。