K近邻算法KNN
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 datasetsdef 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,testXdef kNN(k,trainX,trainY,testX):testY=[] #測試的結果集合if k>len(trainY): return 0for 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個樣本的分類結果testY.append(np.argmax(np.bincount(label.astype(int))))return testYdef 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)
測試結果(只繪制數據集的前兩維):
總結
- 上一篇: LeetCode简单题之二进制表示中质数
- 下一篇: 支持向量机SVM序列最小优化算法SMO