Python:k近邻算法实例

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

机器学习实战教程(一):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]解释

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值