算法基本思想
?????存在一個(gè)樣本數(shù)據(jù)集合,也稱作訓(xùn)練樣本集,并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對(duì)應(yīng)關(guān)系。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標(biāo)簽。一般來(lái)說(shuō),我們只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),這就是k-近鄰算法中k的出處,通常k是不大于20的整數(shù)。最后,選擇k個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類。
關(guān)鍵函數(shù)編程實(shí)現(xiàn)
def classify0(inX, dataset, labels, k):
"""
:param inX: 待分類數(shù)據(jù)
:param dataset: 分類樣本數(shù)據(jù)
:param labels: 樣本類別
:param k: 距離最小的k個(gè)點(diǎn)
:return: 返回分類分類標(biāo)簽
"""
# 距離計(jì)算
datasize = dataset.shape[0] # 數(shù)據(jù)行數(shù)
diffMat = tile(inX, (datasize, 1)) - dataset
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() # 將元素從小到大排列,提取其對(duì)應(yīng)的原來(lái)數(shù)據(jù)的index(索引)
# 選擇最近的K個(gè)點(diǎn)
classcount = {}
for i in range(k):
voteLabel = labels[sortedDistIndicies[i]]
classcount[voteLabel] = classcount.get(voteLabel, 0) + 1 # get()如果不存在,返回零值
# 對(duì)字典進(jìn)行排序
sortedClassCount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]