什么是KNN? 維基百科給出的解釋:
最近鄰居法采用向量空間模型來分類,概念為相同類別的案例,彼此的相似度高,而可以借由計算與已知類別案例之相似度,來評估未知類別案例可能的分類
無論是分類還是回歸,衡量鄰居的權重都非常有用,使較近鄰居的權重比較遠鄰居的權重大。例如,一種常見的加權方案是給每個鄰居權重賦值為1/ d,其中d是到鄰居的距離。
鄰居都取自一組已經正確分類(在回歸的情況下,指屬性值正確)的對象。雖然沒要求明確的訓練步驟,但這也可以當作是此算法的一個訓練樣本集。
k-NN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。k-NN方法在類別決策時,只與極少量的相鄰樣本有關。由于k-NN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的iris數據集分類器代碼,因此對于類域的交叉或重疊較多的待分樣本集來說,k-NN方法較其他方法更為適合
k-NN算法流程
準備數據,對數據進行預處理 后面代碼準備的數據是Iris Iris也稱鳶尾花卉數據集 ,是一類多重變量分析的數據集。數據集包含150個數據集,分為3類,每類50個數據,每個數據包含4個屬性??赏ㄟ^花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬于(,,)三個種類中的哪一類 選用合適的數據結構存儲訓練數據和測試元組 設定參數,如k 維護一個大小為k的按距離由大到小的優先級隊列,用于存儲最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號和距離存入優先級隊列 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所得距離L 與優先級隊列中的最大距離Lmax 進行比較。若L>=Lmax,則舍棄該元組,遍歷下一個元組。若L < Lmax,刪除優先級隊列中最大距離的元組,將當前訓練元組存入優先級隊列 遍歷完畢,計算優先級隊列中k 個元組的多數類,并將其作為測試元組的類別 測試元組集測試完畢后計算誤差率,繼續設定不同的k值重新進行訓練,最后取誤差率最小的k 值 k-NN的一些數學算法
三維空間
多維空間
k近鄰算法代碼實現 1. 引入依賴 1 asnp
aspd
3
4# 這里直接引入里的數據集,iris鳶尾花(上面介紹過)
.
. it # 切分數據集為訓練集和測試集
. # 計算分類預測的準確率
2. 數據加載和預處理1iris =
2
3df = pd.(data = iris.data, = iris.)
4df['class'] = iris.
5df['class'] = df['class'].map({0: iris.[0], 1: iris.[1], 2: iris.[2]})
6df.head(10)
7df.
8x = iris.data
9y = iris..(-1,1)
(x.shape, y.shape)
df.數據效果
prin t(x.shape, y.shape)數據效果
(150, 4) (150, 1)
3. 劃分訓練集和測試集1# 劃分訓練集和測試集
, , , = (x, y, = 0.3, = 35, =y)
3
(.shape, .shape)
(.shape, .shape)
6a = np.array( [[3,2,4,2],
7[2,1,4,23],
8[12,3,2,3],
9[2,3,15,23],
10[1,3,2,3],
11[13,3,2,2],
12[213,16,3,63],
13[23,62,23,23],
14[23,16,23,43]] )
15b = np.array( [[1,1,1,1]])
(a-b)
17np.sum(np. abs(a - b), axis= 1)
= np. sqrt( np.sum((a-b) ** 2, axis= 1) )
(dist)
結果4. 核心算法實現1# 距離函數定義
(a, b):
.sum(np.abs(a-b), axis= 1)
(a, b):
.sqrt( np.sum((a-b) ** 2, axis= 1) )
6
7# 分類器實現
( ):
9# 定義一個初始化方法, 是類的構造方法
( self, = 1, = ) :
. =
. =
13
14# 訓練模型方法
( self, x, y) :
. = x
. = y
18
19# 模型預測方法
( self, x) :
21# 初始化預測分類數組
= np.zeros( (x.shape[ 0], 1), dtype= self..dtype )
23
24# 遍歷輸入的x數據點,取出每一個數據點的序號i和數據
, (x):
26# 跟所有訓練數據計算距離
= self.( self., )
28
29# 得到的距離按照由近到遠排序,取出索引值
= np.()
31
32# 選取最近的k個點,保存它們對應的分類類別
= self.[ [ :self.] ].ravel
34
35# 統計類別中出現頻率最高的那個,賦給[i]
[i] = np.( np.(nn_y) )
37
39
40
= np.(dist)
( "dist: ",dist)
( ": ",)
= [ [ :9] ].ravel
45#print([:8])
( "nn_y: ",nn_y)
(np.(nn_y))
(np.(np.(nn_y)))
結果5. 測試1# 定義一個knn實例
2knn = kNN( = 3)
3# 訓練模型
4knn.fit(, )
5# 傳入測試數據,做預測
= knn.()
7
(.ravel)
(.ravel)
10
11# 求出預測準確率
= (, )
13
("預測準確率: ", )
結果1# 定義一個knn實例
2knn = kNN
3# 訓練模型
4knn.fit(, )
5
6# 保存結果list
= []
8
9# 針對不同的參數選取,做預測
in[ 1, 2]:
11knn. = ifp ==
12
13# 考慮不同的k取值,步長為2
( 1, 10, 2):
15knn. = k
16# 傳入測試數據iris數據集分類器代碼,做預測
= knn.()
18# 求出預測準確率
= (, )
.([k, ''ifp == 1else'', ])
21df = pd.(, =[ 'k', '距離函數', '預測準確率'])
22df
最終結果
k距離函數預測準確率
0
1
0.
1
3
0.
2
5
0.
3
7
0.
4
9
0.
5
1
0.
6
3
0.
7
5
0.
8
7
0.
9
9
0.
至此k-NN算法介紹完了 機器學習未完待續 ……歡迎關注