k近鄰演算法(knn,k-nearestneighbor)是一種十分簡單的分類方法,也是「懶惰學習」的代表。
knn沒有訓練階段,或者說訓練成本為0。knn只需要將已知的樣本拿過來與需要測試的樣本做乙個簡單的比較就能將未分類的樣本分類。
knn的演算法流程也十分簡單,大致的思路就是,計算待測點與已知點的距離,選取與待測點距離最近的k個已知點,統計這k個已知點的類別,哪個類別最多那麼這個待測點的類別就屬於這個類。
**的簡單實現(以鳶尾花資料集為例):
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn import datasets
def data():
#載入鳶尾花資料集
x=datasets.load_iris()
#從第一類中隨機選取5個樣本作為訓練集
train_index=np.random.randint(0,50,5)
#從第二類第三類隨機選出10個樣本作為訓練集(每個樣本取5個)
train_index=np.hstack((train_index,train_index+50,train_index+100))
trainx=x.data[train_index]
trainy=x.target[train_index]
#資料中其他樣本點皆為測試集
test_index=np.delete(np.arange(150),train_index)
testx=x.data[test_index]
return trainx,trainy,testx
def knn(k,trainx,trainy,testx):
testy= #測試的結果集合
if k>len(trainy):
return 0
for i in testx:
#計算距離
dis=np.linalg.norm(trainx-i,axis=1)
#將距離和訓練集的標籤用矩陣繫結
s=np.vstack((dis,trainy))
#將矩陣按從小到大排好序
s=s[:,np.argsort(s[0,:])]
#取前k個已知標籤
label=s[1,0:k]
#統計最多出現的標籤並將其放入結果集合作為第i個樣本的分類結果
return testy
def plot(trainx,trainy,testx,testy):
plt.scatter(trainx[:,0],trainx[:,1],c=trainy,marker='x')
plt.scatter(testx[:,0],testx[:,1],c=testy)
plt.show()
if __name__ == '__main__':
trainx,trainy,testx=data()
testy=knn(5,trainx,trainy,testx)
plot(trainx,trainy,testx,testy)
測試結果(只繪製資料集的前兩維):
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...
k近鄰演算法 kNN
核心思想 前k個最相似資料中出現次數最多的類別,作為新資料的類別。核心函式 計算距離函式,投票函式 coding utf 8 import random import sys from collections import counter from operator import itemgette...
K近鄰演算法 KNN
k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...