Python:k近邻算法实例

原始数据(训练集)如下: 

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)

 Python:k近邻算法实例

#导入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 是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。

    横向铺展:

Python:k近邻算法实例

   纵向铺展:

Python:k近邻算法实例

 ②def 的使用

Python:k近邻算法实例

 3.argsort()函数使用

Python:k近邻算法实例

先将[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[]会输出如下:

Python:k近邻算法实例

labels[]会输出如下:  

Python:k近邻算法实例

5.词典中get()函数使用

Python:k近邻算法实例

Python:k近邻算法实例

6.循环语句 for  i  in  range(k)

 Python:k近邻算法实例

7.Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。

Python:k近邻算法实例 

8. sorted()函数

Python:k近邻算法实例 

9.  sortedClassCount[0][0]的关于[0][0]解释

Python:k近邻算法实例