zoukankan      html  css  js  c++  java
  • 《机器学习实战》学习(1)—— kNN算法

    一些碎碎念:失踪人口回归(虽然也没人fo我,一个人自娱自乐啦)。新学期开始好久了,感觉需要系统性地学习一些东西,扫了一眼书架发现之前买的《机器学习实战》这本书还没看完,于是从这本书开始搭建自己的机器学习基础体系啦,顺便学习一下python。如果正文有什么描述不对的地方,麻烦给与指正啦...争取周更,不能拖拉。

    star了一个github项目(本书配套代码) https://github.com/pbharrin/machinelearninginaction

    kNN算法是分类算法,主要是通过测量比较 输入测试数据 与 分类过的训练数据 的(特征)距离 进行分类的。当输入一个新的未分类(没有标签)的数据时,与样本集中的数据特征进行比较,选出与新数据最接近的k个数据,将出现频率最高的分类作为新数据的分类。

    首先需要对数据进行处理,数据清洗和归一化,数据清洗是为了剔除异常数据,归一化是为了使各个特征不受数据取值大小的影响,当然也可以根据数据的重要性定权重。

    以下是kNN的核心代码:

    def classify0(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0]
        diffMat = tile(inX, (dataSetSize, 1)) - dataSet
        sqDiffMat = diffMat**2
        sqDistances = sqDiffMat.sum(axis=1)
        distances = sqDistances**0.5
        sortedDistIndicies = distances.argsort()
        classCout = {}
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCout[voteIlabel] = classCout.get(voteIlabel, 0) + 1
        sortedClassCout = sorted(classCout.items(),
                                 key = operator.itemgetter(1), reverse = True)
        return sortedClassCout[0][0]

    其中inX是输入数据(向量形式),dataSet和labels分别是样本数据和标签(分类),k是参与评价的点数。

    代码首先求了输入数据与样本数据的距离,然后对距离排序,选出距离最近的k个点,返回k点内出现频率最高的标签作为分类结果。

    此处距离的求解方法是欧式距离,还可以选用其他距离公式,视具体数据情况为定。

    kNN简单有效但是当数据集较大时,所需内存和计算量也较大,也不能体现出各个数据特征之间的区别,这种分类方法还是十分硬核的,适用于简单的情况。

  • 相关阅读:
    猴子选大王(约瑟夫环)
    centos 安装thrift
    KMP字符串匹配算法
    会话技术整理
    PHP数组整理版
    PHP基础知识6【系统内置函数--数组】
    PHP基础知识5【系统内置函数--字符串】
    PHP基础知识笔记4
    PHP基础知识笔记3
    PHP基础知识笔记2
  • 原文地址:https://www.cnblogs.com/chri330dj/p/9786495.html
Copyright © 2011-2022 走看看