zoukankan      html  css  js  c++  java
  • 监督学习算法_k-近邻(kNN)分类算法_源代码

    因为自己想学着去写机器学习的源码,所以我最近在学习《机器学习实战》这本书。

    《机器学习实战》是利用Python2完成的机器学习算法的源代码,并利用机器学习方法来对实际问题进行分析与处理。

    (《机器学习实战》豆瓣读书网址:https://book.douban.com/subject/24703171/)

    以下内容是我通过学习《机器学习实战》,以及我对k-近邻(kNN)分类算法的理解,所总结整理出的内容,其中kNN分类算法的源码为Python3的代码,希望大家多多批评指正。

    kNN分类算法是一类有监督的学习算法,kNN分类算法首先计算出测试样本点与已知样本点之间的距离,选择距离测试样本点最近的k个已知样本点,根据k个已知样本点的类别,通过“投票法”得到测试样本点的最终分类。

    kNN分类算法的优缺点:优点:精度高、对异常值不敏感、无数据输入假定;缺点:计算复杂度高、空间复杂度高;适用数据范围:数值型和标称型(标称型数据:变量的结果只在有限目标集中取值)。--摘自《机器学习实战》

    kNN分类算法通常使用欧氏距离来计算测试样本点与已知样本点之间的距离。

    已知两个点A=(x1, y1)、B=(x2, y2),则A和B的欧氏距离为:

    Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )

    kNN分类算法的伪代码如下:

    Step1:计算出测试样本点与已知样本点之间的距离;

    Step2:将距离按照升序排序;

    Step3:选择距离测试样本点最近的k个已知样本点;

    Step4:计算k个最近的已知样本点所在类别出现的频率;

    Step5:k个最近的已知样本点出现频率最高的类别,即为测试样本点的最终分类。

     

    kNN分类算法的源码:

     def classify(test, samples, labels, k):

      import numpy as np
      import operator

      # 改变测试样本的格式
      samplesize = samples.shape[0]
      testnew = np.tile(test, (samplesize, 1))

      # 计算测试样本与已知样本之间的距离
      distances2 = (testnew - samples) ** 2
      distances = (distances2.sum(axis = 1)) ** 0.5

      # 对距离进行升序排序,并返回距离的下标
      sortdistances = distances.argsort()

      #计算k个最近的已知样本点所在类别出现的次数
      classcount = {}

      for i in range(k):
        sortedlabels = labels[sortdistances[i]]
        classcount[sortedlabels] = classcount.get(sortedlabels, 0) + 1

      #将k个最近的已知样本点所在类别出现的次数降序排列
      sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = True)

      #返回k个最近的已知样本点出现频率最高的类别,即为测试样本点的最终分类
      return sortedclasscount[0][0]

    对 kNN分类算法的源码进行测试:

    import numpy as np

    import operator
    test = [0, 1]
    samples = np.array([[1, 1], [1, 3], [0, 0], [0., .1]])
    labels = ['A', 'A', 'B', 'B']
    k = 3
    print(classify(test, samples, labels, k))

    测试代码的输出结果为 'B',即测试样本点[0, 1]的所属类别为:B。 

     

    以上是我对kNN分类算法的理解以及kNN分类算法的源代码,欢迎大家多多批评指正。

    后续如果有时间的话,我会增加 监督学习算法_k-近邻(kNN)分类算法_实战 这一部分的随笔整理。

     

    祝好

    希望可以和大家互相学习、共同进步

    Violet HE

    2019.1.18  00:35

     

    你必须非常努力,才能看起来毫不费力。
  • 相关阅读:
    阿里云ecs环境配置
    linux下Nginx安装Zend Optimizer组件步骤
    phpcms 按价格、按销量、按时间等排序实现思路
    云服务器 ECS Linux Web 环境配置站点的方法
    CentOS7安装和配置FTP
    Centos7安装SVN
    ExtJs桌面组件(DeskTop)
    jsapi支付,提示redirect_uri 参数错误
    php判断来源网址地址并且限制非法来源
    php正则表达式获取表格内容
  • 原文地址:https://www.cnblogs.com/violethjq/p/10285462.html
Copyright © 2011-2022 走看看