kNN 近鄰算法原理:存在一個樣本數據集合,也稱做訓練樣本集,而且樣本集中每一個數據都存在標籤,即咱們知道樣本集中每一數據與所屬分類的隊友關係。輸入沒有標籤的新數據後,將新數據的每一個特徵與樣本集中的數據對應的進行比較,而後算法提取樣本集中特徵最類似數據(最鄰近)的分類標籤。python
算法流程:算法
1.收集數據數組
2. 準備數據機器學習
3.分析數據學習
4. 訓練算法測試
5. 測試數據code
6. 使用算法排序
# -*- coding: utf-8 -*- ''' Created on Mar 15, 2016 @author: fky k-近鄰算法 ''' from numpy import array import operator from numpy.lib.shape_base import tile def createDataSet(): #準備數據 group = array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]]) labels = ['A','A','B','B'] # 數據標籤 return group, labels def classify(inX,dataSet,labels,k): dataSetSize = dataSet.shape[0] # 得到數組大小 diffMat = tile(inX,(dataSetSize,1)) -dataSet # 算距離 sqDiffMat = diffMat**2 # sqDistances = sqDiffMat.sum(axis=1) # distances = sqDistances**0.5 # sortedDistIndicies = distances.argsort() classCount = {} for i in range(k): # 距離最小的k個點 voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) # 排序 return sortedClassCount[0][0] if __name__=='__main__': group, labels = createDataSet() print(classify([1,1], group, labels, 3))
輸出結果:
utf-8
A
-----------------------------ci
diffMat = tile(inX,(dataSetSize,1)) -dataSet # 算距離 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) # distances = sqDistances**0.5
以上面輸入數據爲例中間的輸出:
diffMat = [[ 0. -0.1] [ 0. 0. ] [ 1. 1. ] [ 1. 0.9]] sqDistances = [ 0.01 0. 2. 1.81] sortedClassCount=[('A', 2), ('B', 1)]
這能夠看到近鄰的A中是兩個大於B 中的一個 因此輸出 A
參考《機器學習實戰》這本書