1、原理
給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。
2、步驟
(1).計算新例項和訓練樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離,曼哈頓距離等);
(2)對上面所有的距離值進行排序;
(3)選前k個最小距離的樣本;
(4)根據這k個樣本的標籤進行投票,得到最後的分類類別;
如何選擇乙個最佳的k值,這取決於資料。一般情況下,在分類時較大的k值能夠減小雜訊的影響。但會使類別之間的界限變得模糊。乙個較好的k值可通過各種啟發式技術來獲取,比如,交叉驗證。另外雜訊和非相關性特徵向量的存在會使k近鄰演算法的準確性減小。
3、公式描述
輸入:訓練資料集t=
其中,xi
⊂rn 為例項的特徵向量,yi
⊂ 為例項的類別,i=1,2,3..,n
輸出:例項x所屬的類y
(1)根據給定的距離度量,在訓練集t中找出與x最臨近的k個點,涵蓋這k個點的x的鄰域記做nk
(x)
(2)在nk
(x) 中根據分類決策規則(如多數表決)決定x的類別y: y=
argm
ax∑x
i⊂nk
(x)i
(yi=
cj),
i=1,
2,3...,n
,j=1
,2,3...,n
其中i 為指示函式,即當yi
=cj時
i 為1,否則
i為0。
knn演算法的優點:
1. 思想簡單,理論成熟,既可以用來做分類也可以用來做回歸;
2. 可用於非線性分類;
3. 訓練時間複雜度為o(n);
4. 準確度高,對資料沒有假設,對outlier不敏感;
缺點:
1. 計算量大;
2. 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
3. 需要大量的記憶體;
4、**實現
(1)手動編寫knn分類器
import numpy as np
# 建立資料集,包含四個例項和兩個分類
defcreatedataset
():
group = np.array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
labels = ['a', 'a', 'b', 'b']
return group, labels
# 用knn進行分類
defknnclassify
(newinput, dataset, labels, k):
numsamples = dataset.shape[0] # shape[0]代表行數,這裡為樣本點個數
## step 1: 計算歐式距離
# >行數=原來*numsamples,列數=原來*1
# >然後每個特徵點和樣本的點進行相減,返回乙個矩陣
diff = np.tile(newinput, (numsamples, 1)) - dataset
squareddiff = diff ** 2
# axis=0 按列求和,1為按行求和,行向量分別相加,從而得到新的乙個行向量
squareddist = np.sum(squareddiff, axis = 1) # 每一列分別求和,得到行向量
distance = squareddist ** 0.5
## step 2: 對距離按大小逆序排序
sorteddistindices =np.argsort(distance) #返回的是陣列元素值從小到大的索引值
classcount = {} # 定義乙個元組,用於存距離最近的k個點中,點所屬的每個類出現的次數
for i in xrange(k):
## step 3: 在距離中選擇最小k個距離
votelabel = labels[sorteddistindices[i]]
# step 4: 計算標籤發生的概率
# get()函式返回指定鍵的值,如果值不在字典中返回預設值0。
classcount[votelabel] = classcount.get(votelabel, 0) + 1
## step 5: 最大的類將會被返回
maxcount = 0
for key, value in classcount.items():
if value > maxcount:
maxcount = value
maxindex = key
return maxindex
if __name__ == '__main__':
dataset, labels = createdataset()
testx = np.array([1.2, 1.0])
k = 3
outputlabel = knnclassify(testx, dataset, labels, 3)
print
"your input is:", testx, "and classified to class: ", outputlabel
testx = np.array([0.1, 0.3])
outputlabel = knnclassify(testx, dataset, labels, 3)
print
"your input is:", testx, "and classified to class: ", outputlabel
(2)呼叫框架中的工具實現knn分類器
import numpy as np
from sklearn.neighbors import kneighborsclassifier
group = np.array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
labels = ['a', 'a', 'b', 'b']
knn = kneighborsclassifier(n_neighbors=3) # k值設定為3
knn.fit(group, labels)
print(knn.predict([[0.1, 0.3]])) # **值
機器學習 KNN
posted on 2015 05 21 20 34 in ml 0 comment views 3195 原始碼 決策樹和基於規則的分類器都是積極學習方法 eager learner 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直...
機器學習 KNN
定義事件ejl j 0,1.k e j epsilon 0,1.k ejl j 0,1.k 為對於標籤 l,k個鄰居中包換j個這個標籤,則 e為乙個 k n 的矩陣,每一行為距離該例項的樣本中每個標籤的數量,則 c l 向量是e矩陣的最後一行,表示距離為k時的各個標籤數量。則我們需要的是在已知e矩陣...
機器學習 kNN
0.載入相關模組 import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from sklearn.model selection import train test s...