本算法没有用到训练模型等内容,属于相对来说比较简单的一个算法,《机器学习实战》这本书中已经给出了比较详细的介绍, 下面是对代码的整理
import numpy as np
import operator
def createDataSet():
group = np.array([[1, 101], [5, 89], [108, 5], [115, 8]])
labels = ['爱情片', '爱情片', '动作片', '动作片']
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
##返回数据集的行列, 0代表的是行, 1是列
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
##意思是 把inx这个向量在行方向上复制dataSetSize次, 列上复制一次。
sqDiffMat = diffMat**2
##各自求平方
sqDistances = sqDiffMat.sum(axis=1)
##按行开方
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount={
}
##进行循环排序
for i in range(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()
test = [101, 20]
test_class = classify0(test, group, labels, 3)
print(test_class)