參考:
1. knn演算法介紹,python程式和乙個簡單算例
2. k-nearest neighbor algorithm
基本想法:
在距離空間裡,如果乙個樣本的最接近的k個鄰居裡,絕大多數屬於某個類別,則該樣本也屬於這個類別。俗話叫,「隨大流」。
演算法描述:
[plain]view plain
copy
1. 依公式計算 item 與 d1、d2 … …、dj 之相似度。得到sim(item, d1)、sim(item, d2)… …、sim(item, dj)。
2. 將sim(item, d1)、sim(item, d2)… …、sim(item, dj)排序,若是超過相似度閾值t則放入鄰居案例集合nn。
3. 自鄰居案例集合nn中取出前k名,依多數決,得到item可能類別。
引數k的選取:
如何選擇乙個最佳的k值取決於資料。一般情況下,在分類時較大的k值能夠減小雜訊的影響。但會使類別之間的界限變得模糊。比如下圖,
待測樣本(綠色圓圈)既可能分到紅色三角形類,也可能分到藍色正方形類。如果k取3,從圖可見,待測樣本的3個鄰居在實線的內圓裡,按多數投票結果,它屬於紅色三角形類,票數1:2.但是如果k取5,那麼待測樣本的最鄰近的5個樣本在虛線的圓裡,按表決法,它又屬於藍色正方形類,票數2(紅色三角形):3(藍色正方形)。
其它問題:
計算兩者間距離,用哪種距離會更好呢?計算量太大怎麼辦?假設樣本中,型別分布非常不均,該怎麼辦呢?
例子(電影分類):
電影名稱
打鬥次數
接吻次數
電影型別
california man
3104romance
he』s not really into dudes
2100romance
beautiful woman
181romance
kevin longblade
10110action
robo slayer 3000
995action
amped ii
982action
未知18
90unknown
這個資料用打鬥次數和接吻次數來界定電影型別,接吻多的是romance型別的,而打鬥多的是動作電影。現在有一部名字未知的電影,打鬥次數為18次,接吻次數為90次的電影(這裡名字未知是為了防止能從名字中猜出電影型別),它到底屬於哪種型別的電影呢?
下面呼叫python的sklearn模組求解:(**knn演算法介紹)
[python]view plain
copy
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
]])
# data對應著打鬥次數和接吻次數
labels = np.array([1,1
,1,2
,2,2
]) #labels則是對應romance和action
knn.fit(data,labels) #匯入資料進行訓練'''
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,和直覺相符。
資料探勘演算法 KNN學習
knn k nearest neighbour 是資料探勘領域的基本演算法之一,原理比較簡單,在各類別均衡 樣本容量比較大的情況下比較實用。演算法以樣本間的距離作為相似性測度。在同一測量空間中以測試樣本為中心,檢測一定範圍內的k個樣本類別,用 投票法 得出測試樣本的類別。設k為離測試樣本最近的樣本數...
資料探勘 分類演算法 KNN
knn k nearest neighbors k近鄰分類演算法 knn演算法從訓練集中找到和新資料最接近的k條記錄,然後根據他們的主要分類來決定新資料的類別。knn分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表...
資料探勘演算法筆記 knn演算法
前幾篇的總結居然格式錯誤,找時間重新整理。一調包import numpy as npfrom sklearn.neighbors import kneighborsclassifierknn kneighborsclassifier data np.array 3,104 2,100 1,81 10...