《機器學習實戰》學習筆記一:K近鄰演算法
阿新 • • 發佈:2019-01-09
K近鄰演算法
kNN演算法的原理:
存在一個樣本資料集合,且每個樣本資料都有對應的標籤,即我們知道樣本集合中每一資料與所屬分類的對應關係。
輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集合中資料對應的特徵進行比較,然後提取樣本中最相似的K個分類標籤。
最後,選擇K個最相似資料中出現次數最多的分類,作為新資料的分類。
# coding=utf-8 from numpy import * import operator def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] #group和labels是四組資料,group表示座標,labels表示座標對應的特徵值 return group,labels #classify0是k近鄰演算法,計算用於分類的inX到dataSet的距離,判斷inX屬於哪個類。dataSet是訓練樣本資料集,labels是樣本對應的標籤值,k表示選取樣本前k個最相似的資料用於判斷inX屬於哪個分類。 def classify0(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] #獲得dataSet的大小 diffMat = tile(inX,(dataSetSize, 1)) - dataSet #將inX擴充為(dataSetSize,1)即4行1列的矩陣,再與dataSet求差 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) #.sum()執行加函式,引數axis=1表示矩陣每一行的各個值相加和 distances = sqDistances**0.5 sortedDistIndices = distances.argsort() classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndices[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
1.createDataSet用於建立訓練樣本資料集,本例中建立了四個樣本資料,分別為[1.0,1.1],[1.0,1.0],[0,0],[0,0.1],對應的分類(或稱為特徵值)分別為A,A,B,B
2.classify0函式是分類演算法,輸入的四個引數分別為(待分類的資料,樣本資料,樣本標籤,相似樣本標籤的個數)
首先,根據歐式距離公式求得待分類的資料到每個樣本資料的距離distances
dataSetSize:獲得dataSet的大小,為4
diffMat:將inX擴充為(dataSetSize,1)(即4行1列)的矩陣,再與dataSet求差值
然後,argsort函式表示從小到大排序,返回索引0,1,2,3,距離最近---距離最遠
3.對距離最近的k個樣本,進行分類分析
首先,獲得距離最近的k個樣本資料對應的樣本標籤
classCount表示每個樣本標籤以及出現次數的字典
然後,使用sorted函式排序,返回出現次數最多的標籤
[0,0]屬於B類