zoukankan      html  css  js  c++  java
  • 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了

    
    

        前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技巧。我们都知道python中有Numby和Scipy这两个库,还有前段时间写的matplot库,绘图用的,大家可以参考下,实际这个算法是看懂之前的一些算法的实现。

        上面我就简单介绍下这个算法实现,首先我们先肯定一个事前准备好的矩阵,这个多是事前聚类出来的或者通过专家估计出来的值。

        为了这个分类矩阵和标签写一个函数,这里我们把它称为createDataSe:

        上面给出这个函数的代码:

    def createDataSet():
        group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
        labels = ['A', 'A', 'B', 'B']
        return group, labels

        看这篇博客的同时最好配有《机器学习实战》这本书,这本书的译者其中一个是现在项目的一个人参与者,在书中我们可以看到这样的图片:

        算法和代码

        这样很明确的我们可以看到这4个点 和其对应的标签。

        所谓KNN即我们新来一个测试点和之前我们做好标记的点计算距离,然后采取距离最近的标签作为该测试点的标签,当然你可能觉得原来是这么简单的货色,是的这个朴素的思惟,在当今的各种推荐系统,以及广告系统中,依然有所使用。

        然后我们继续讲解下一段简单的代码,有了参考点,下一段当然是来测试点了,

        上面我就先贴上代码:

        每日一道理
    “一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!
    def classify(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0]
        diffMat = tile(inX, (dataSetSize, 1))-dataSet
        print(diffMat, '
    ')
        sqDiffMat = diffMat**2
        print(sqDiffMat)
        sqDistances = sqDiffMat.sum(axis=1)
        print(sqDistances)
        distance = sqDistances**0.5
        sortedDistIndices = distance.argsort()
        classCount = {}
        for i in range(k):
            voteIlabel = labels[sortedDistIndices[i]]
            classCount[voteIlabel]= classCount.get(voteIlabel, 0)+1 
        sortedClassCount  = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
        return sortedClassCount[0][0]

        当然这个有书而且很仔细的童鞋会发现我多了几行打印代码,第一行是失掉先验数据的列数,然后第二行是产生一个与该矩阵一样巨细的矩阵并和原矩阵相减,然后失掉测试点与4个标记点的坐标差,下一行是打印,接下来就是我们将这个矩阵停止平方,然后将所有数据相加,合为一个数据,然后将其开平方,接距离停止排序,产生一个排名。

        这样所有点到测试点的距离排名就都有了。

        下一段for循环开始是选择前k个最近距离对该测试点停止投票,最后再次将投票结果停止排序,输出得票率最高的一个点作为最后的结果。这就是终究的标签结果。

        不得不感叹一句这么短的代码完成了这多功能!

        最后我再说点关于这一句的用法,这个是为了不返回异常如果没有,则增长一项,有了就增长1,这当然是最简单的KNN算法思惟的论述,但是与实际应用差了十万八千里。

    
    
    classCount.get(voteIlabel, 0)

        呵呵,这个也不是说这玩意没用,只是真正使用的时候多是高维空间的特征不是二维空间的特征没办法画出在空间中的点的位置。好了就说这么多吧。

        附上测试调用的代码,该代码完成了(0,0)点的分类:

    group, labels = createDataSet()
    
    
    print(classify([0, 0], group, labels, 3))

        对了还得给出程序运行的截图:

        算法和代码

    文章结束给大家分享下程序员的一些笑话语录: 真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。

    --------------------------------- 原创文章 By
    算法和代码
    ---------------------------------

  • 相关阅读:
    迭代器生成器
    eval()
    【剑指offer】调整数组数字位置
    【剑指offer】二进制中1的个数
    【剑指offer】斐波那契数列非递归求解第N项
    【剑指offer】两个栈实现队列
    【剑指offer】逆序输出链表
    【剑指offer】字符串替换
    【剑指offer】规则二维数组查找
    Java转型
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3150292.html
Copyright © 2011-2022 走看看