import numpy as np
import operator
def createDataSet():
group=np.array([[3,104],[2,100],[101,10],[99,5]])
labels=['爱情片','爱情片','动作片','动作片']
return group,labels
def classify0(inX,dataSet,labels,k):
#输入向量是inX,输入的训练样本集是dataSet,标签向量为labels,用于选择最近邻居的数目
dataSetSize=dataSet.shape[0]
#确定数据维数 (shape)
diffMat=np.tile(inX,(dataSetSize,1))-dataSet
#tile表示将inX复制dataSetSize行 1列 然后减去dataSet
#计算距离差
sqDiffMat=diffMat**2
# **表示乘方
sqDistances=sqDiffMat.sum(axis=1)
#.sum(axis=1)表示将矩阵每一行的元素相加
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
#argsort函数返回的是数组值从小到大的索引值
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#get()方法语法:dict.get(key, default=None)。key-字典中要查找的键。default-如果指定键的值不存在时,返回该默认值
# items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#Python内置的排序函数sorted可以对list或者iterator进行排序
#sorted(iterable[, cmp[, key[, reverse]]])
#iterable指定要排序的list或者iterable
#cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数
#key为函数,指定取待排序元素的哪一项进行排序
#.itemgetter(1)按照第二个元素的次序对元组进行排序
#reverse参数就是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列
return sortedClassCount[0][0]
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [1,81]
#kNN分类
test_class = classify0(test, group, labels, 3)
#打印分类结果
print(test_class)
#**机器学习之K邻近算法代码实现以及详细解释****
最新推荐文章于 2022-09-18 21:33:09 发布