概念:
k近鄰(knn,k-nearestneighbor),所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
核心思想:
如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。
最簡單的機器學習演算法之一。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。
k值的不同會對knn演算法產生重大影響。實際應用中,k值一般取乙個比較小的資料(不超過20),通常採用交叉驗證法來選取最優值。
比如上面這個圖,有兩類資料,分別為紅色三角和藍色方塊,綠色圓是我們需要判斷所屬的類別;假設k為距離該點最近的k個點,如果k=3,如圖實線圓圈,有乙個藍色,2個紅色,所以認為該點和紅色是同類;如果k=5,如圖虛線圈,有3個藍色,2個紅色,所以認為該點屬於藍色。
演算法缺點:
該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。因此可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。該方法的另乙個不足之處是計算量較大,因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分[參考機器學習十大演算法]。
【參考:
演算法流程:
1)計算已知類別資料集中的點與當前點之間的距離;
2)按照距離遞增次序排序;
3)選取與當前點距離最小的k個點;
4)確定前k個點所在類別的出現頻率;
5)返回前k個點出現頻率最高的類別作為當前點的**分類。
import numpy as np
import matplotlib.pyplot as plt
x_train = np.array([[2,1],[3,2],[4,2],[1,3],[1.5, 4],[1.7, 3],[2.6, 5],[3.4, 3],[3, 6],[1, 7],[4, 5],[1.2, 6],[1.8, 7],[2.2, 8],[3.7, 7],[4.8, 5]])
y_train = np.array([0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1])
x_test = np.array([3.2,5.4])
k = 3
# 這裡的距離公式採用歐式距離
square_ = (x_train - x_test)**2
square_sum = square_.sum(axis=1)**0.5
#根據距離大小排序並找到 測試樣本 與 所有樣本k個最近的樣本的序列
square_sum_sort = square_sum.argsort()
small_k = square_sum_sort[:k]
# k近鄰用於分類則統計k個鄰居分別屬於哪類的個數,用於回歸則計算k個鄰居的y的平均值作為**結果
# 統計距離最近的k個樣本 分別屬於哪一類的個數 別返回個數最多一類的序列 作為**結果
#argsort()返回索引
#count然後
np.bincount(np.array([y_train[i] for i in small_k]))
###argsort,先排序,再返回在bincount中的索引
y_test_sum = np.bincount(np.array([y_train[i] for i in small_k])).argsort()
# 列印**結果
print('predict: class {}'.format(y_test_sum[-1]))
#將資料視覺化
#將class0 一類的樣本點放到x_train_0中
x_train_0 = np.array([x_train[i,:] for i in range(len(y_train)) if y_train[i] == 0])
# 將 class1 一類的樣本點 放到 x_train_1中
x_train_1 = np.array([x_train[i, :] for i in range(len(y_train)) if y_train[i] == 1])
# 繪製所有樣本點 並採用不同的顏色 分別標記 class0 以及 class1
plt.scatter(x_train_0[:,0], x_train_0[:,1], c='g', marker='o', label='train_class0')
plt.scatter(x_train_1[:,0], x_train_1[:,1], c='m', marker='o', label='train_class1')
if y_test_sum[-1] == 0:
test_class = 'g'
elif y_test_sum[-1] == 1:
test_class = 'm'
plt.scatter(x_test[0], x_test[1], c=test_class, marker='*', s=100, label='test_class')
# 連線 測試樣本 與k個近鄰
for i in small_k:
plt.plot([x_test[0], x_train[i, :][0]], [x_test[1], x_train[i, :][1]], c='c')
plt.legend(loc='best')
plt.show()
KNN演算法學習
knn演算法,我的理解是在有標籤的訓練樣本分佈中,有n個需要測試的樣本,通過尤拉距離 通過計算每個測試樣本得出離訓練最近的k個樣本,同過k個樣本中某一類標籤所佔的比例最高,則將該測試值 為該標籤。import numpy as np from math import sqrt from collec...
knn演算法學習
k近鄰近鄰演算法 多數表決規則等價於經驗風險最小化 損失函式最小化 一訓練資料為基礎,通過此類分類規則計算得到 一塊區域,有k個訓練資料,1,2,3個類別。1 2 3 當此區域判為1,損失函式等於2,3個數和 當此區域判為2,損失函式等於1,3個數和 當此區域判為3,損失函式為1,2個數和 選取損失...
機器學習之KNN演算法學習筆記
1.1 cover和hart在1968年提出了最初的鄰近演算法 1.2 分類 classification 演算法 回歸演算法,這裡討論的是分類演算法 1.3 輸入基於例項的學習 instance based learning 懶惰學習 lazy learning 為了判斷未知例項的類別,以所有已知...