鄰近演算法,或者說k最近鄰(knn,k-nearestneighbor)分類演算法是
資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。
knn演算法是機器學習裡面比較簡單的乙個分類演算法了,整體思想比較簡單:計算乙個點a與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裡面所屬分模擬例最大的,則點a屬於該分類。這樣講可能還有點迷糊,下面用乙個例子來說明一下:
電影名稱
打鬥次數
接吻次數
電影型別
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次的電影,它到底屬於哪種型別的電影呢?
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。
右圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果k=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。
knn演算法的決策過程
k最近鄰(k-nearest neighbor,knn)分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。
1. 準備資料,對資料進行
預處理2. 選用合適的資料結構儲存訓練資料和測試元組
3. 設定引數,如k
4.維護乙個大小為k的的按距離由大到小的
優先順序佇列,用於儲存最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號和距離存入優先順序佇列
5. 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所得距離l 與優先順序佇列中的最大距離lmax
6. 進行比較。若l>=lmax,則捨棄該元組,遍歷下乙個元組。若l < lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組存入優先順序佇列。
7. 遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為測試元組的類別。
8. 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新進行訓練,最後取誤差率最小的k 值。
KNN演算法介紹
knn演算法全名為k nearest neighbor,就是k最近鄰的意思。knn是一種分類演算法,其基本思想是採用測量不同特徵值之間的距離方法進行分類。演算法過程如下 1 準備樣本資料集 樣本中每個資料都已經分好類,並具有分類標籤 2 使用樣本資料進行訓練 3 輸入測試資料a 4 計算a與樣本集的...
KNN演算法介紹
knn演算法全名為k nearest neighbor,就是k最近鄰的意思。knn是一種分類演算法,其基本思想是採用測量不同特徵值之間的距離方法進行分類。演算法過程如下 1 準備樣本資料集 樣本中每個資料都已經分好類,並具有分類標籤 2 使用樣本資料進行訓練 3 輸入測試資料a 4 計算a與樣本集的...
手寫簡單的KNN演算法
import numpy as np import math class customkneighborsclassifier knn 自定義實現類 def init self,k 3 初始化賦值,x train 特徵測試集變數 y train 標量測試集變數 res class 結果 param ...