KNN算法原理初步介紹

KNN算法是機器學習裏面比較簡單的一個分類算法了,整體思想比較簡單:計算一個點A與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裏面所屬分類比例最大的,則點A屬於該分類。這樣講可能還有點迷糊,下面用一個例子來說明一下:

電影名稱 打鬥次數 接吻次數 電影類型

California Man 

 

3 104 Romance

He’s Not Really into Dudes 

 

2 100 Romance

Beautiful Woman 

 

1 81 Romance

Kevin Longblade 

 

101 10 Action

Robo Slayer 3000 

 

99 5 Action

Amped II 

 

98 2 Action
未知 18 90 Unknown

簡單說一下這個數據的意思:這裏用打鬥次數和接吻次數來界定電影類型,如上,接吻多的是Romance類型的,而打鬥多的是動作電影。還有一部名字未知(這裏名字未知是爲了防止能從名字中猜出電影類型),打鬥次數爲18次,接吻次數爲90次的電影,它到底屬於哪種類型的電影呢?

KNN算法要做的,就是先用打鬥次數和接吻次數作爲電影的座標,然後計算其他六部電影與未知電影之間的距離,取得前K個距離最近的電影,然後統計這k個距離最近的電影裏,屬於哪種類型的電影最多,比如Action最多,則說明未知的這部電影屬於動作片類型。

在實際使用中,有幾個問題是值得注意的:K值的選取,選多大合適呢?計算兩者間距離,用哪種距離會更好呢(歐幾里得距離等等幾個)?計算量太大怎麼辦?假設樣本中,類型分佈非常不均,比如Action的電影有200部,但是Romance的電影只有20部,這樣計算起來,即使不是Action的電影,也會因爲Action的樣本太多,導致k個最近鄰居里有不少Action的電影,這樣該怎麼辦呢?

沒有萬能的算法,只有在一定使用環境中最優的算法,所以,要懂得合適利用算法。

1

2

3

4

5

6

7

import numpy as np

from sklearn import neighbors

knn = neighbors.KNeighborsClassifier()#取得knn分類器

data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])

labels = np.array([1,1,1,2,2,2])

knn.fit(data,labels)#導入數據進行訓練,data對應着打鬥次數和接吻次數,而labels則是對應Romance和Action,因爲這裏只能接受整數類型的數組

knn.predict([18,90])

上面的代碼這裏簡單解釋一下:

首先,我用labels數組中的1和2代表Romance和Aciton,因爲sklearn不接受字符數組作爲標誌,只能用1,2這樣的int型數據來表示,後面處理可以將1和2映射到Romance和Action上來。

fit則是用data和labels進行訓練,data對應的是打鬥次數和接吻次數構成的向量,稱之爲特徵向量。labels則是這個數據所代表的電影所屬的類型。

predict則是進行預測了,將未知電影的特徵向量代入,則能分析出該未知電影所屬的類型。這裏的結果是1,也就是該未知電影屬於Romance。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章