Python:k近邻算法实例
原始数据(训练集)如下:
#导入模块numpy并以np作为别名
import numpy as np
#def定义函数,Python 使用def 开始函数定义,紧接着是函数名,括号内部为函数的参数,
#内部为函数的 具体功能实现代码,如果想要函数有返回值,
#在 expressions 中的逻辑代码中用return 返回。
def createDataSet():
#四组二维特征
group = np.array([[1,101],[5,89],[108,5],[115,8]])
#四组特征的标签
labels = ['爱情片','爱情片','动作片','动作片']
return group, labels
#if __name__ == '__main__':表示组合前边函数,if __name__=="__main__": 语句之前和之后的
#代码都被执行两个等号,两个下划线组成一个下划线,_和__不一样
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#打印数据集
print(group)
print(labels)
#导入operator模块,下文的operator.itemgetter()要用到
import operator
def classify0(inX, dataSet, labels, k):
#numpy函数shape[0]返回dataSet的行数
dataSetSize = dataSet.shape[0]
#在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
#Numpy的 tile() 函数,就是将原矩阵横向、纵向地复制。tile 是瓷砖的意思,
#顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
#二维特征相减后平方
sqDiffMat = diffMat**2
#sum()所有元素相加,sum(0)列相加,sum(1)行相加
sqDistances = sqDiffMat.sum(axis=1)
#开方,计算出距离
distances = sqDistances**0.5
#返回distances中元素从小到大排序后的索引值
sortedDistIndices = distances.argsort()
#定一个记录类别次数的字典
classCount = {}
for i in range(k):
#取出前k个元素的类别
voteIlabel = labels[sortedDistIndices[i]]
#dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
#计算类别次数
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#python3中用items()替换python2中的iteritems()
#key=operator.itemgetter(1)根据字典的值进行排序
#key=operator.itemgetter(0)根据字典的键进行排序
#reverse降序排序字典
#sortedClassCount输出结果是:“分类名称,次数”
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回次数最多的类别,即所要分类的类别
#sortedClassCount[0][0]表示返回第一个数组的第一个分类名称
return sortedClassCount[0][0]
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [101,20]
#kNN分类
test_class = classify0(test, group, labels, 3)
#打印分类结果
print(test_class)
代码注释:
①Numpy的 tile() 函数,就是将原矩阵横向、纵向地复制。tile 是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
横向铺展:
纵向铺展:
②def 的使用
3.argsort()函数使用
先将[6,-1,7,2,8]按由小到大排序,分别为[-1,2,6,7,8], -1在数组mat中的位置是1;2 在数组mat中的位置是3,依次得到0,2,4。
我们发现argsort()函数是将mat中的元素从小到大排列,提取其对应的index(索引),然后输出到y
4 对于labels[sortedDistIndices[i]]这行代码,解释如下
sortedDistIndices等同于序号3中的‘y’, i从0开始取值...,sortedDistIndices[]会输出如下:
labels[]会输出如下:
5.词典中get()函数使用
6.循环语句 for i in range(k)
7.Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。
8. sorted()函数
9. sortedClassCount[0][0]的关于[0][0]解释