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 |
首先,我用labels數組中的1和2代表Romance和Aciton,因爲sklearn不接受字符數組作爲標誌,只能用1,2這樣的int型數據來表示,後面處理可以將1和2映射到Romance和Action上來。 fit則是用data和labels進行訓練,data對應的是打鬥次數和接吻次數構成的向量,稱之爲特徵向量。labels則是這個數據所代表的電影所屬的類型。 predict則是進行預測了,將未知電影的特徵向量代入,則能分析出該未知電影所屬的類型。這裏的結果是1,也就是該未知電影屬於Romance。 |