kNN算法通俗讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012494321/article/details/83718330

        接触机器学习一段时间了,知道它有四种分类:监督学习、无监督学习、半监督学习、强化学习;也知道它的一般步骤:收集数据-->准备数据-->分析数据-->选择模型-->训练模型-->评估模型;知道数据越多测试结果就越准备。

        但是,作为一理工女,不动手就不理解,有很多疑团,怎么让一堆样本做为数据输入,怎么训练数据让模型更好,通过什么方法来评估算法,等等等等。

        然而,一切通过python编程可以解开模糊不清。资源也会单独上传。

       首先是kNN算法。

kNN(k-NearestNeighbor)概述:给一堆数据,每一条数据都要有类别标签,然后输入一条没有类别标签的数据,将这条数据的特征(就是这条数据本身)跟已经存在类别标签的数据一一比较,按相似度排序,找出最相似的k(一般不大于20的整数)条数据,看这k条数据中哪个类别多,那这条新数据就是那个类别。

可能只看文字描述还是不太清晰明了。接下来……

(一)准备数据集。具体的数据是数值型的矩阵如:

          [[1.0, 1.1],

           [1.0, 1.2],

           [5.0, 5.1],

           [5.0, 5.2]]

因为kNN算法要比较距离,所以每个特征需要是数值,能够计算。

上面的数据集,每一行就是一条数据(或实例),每一个值就是一个特征的值。以上数据只有两个特征,可看做二维平面一点(横坐标和纵坐标)。

还要准备类别标签,每一行数据属于什么类别,也就是新数据要分的类。

类别标签Labels=[‘A’, ‘A’, ‘B’, ‘B’],个数跟数据集中数据一致,顺序也要一致。很明显,上面前两条数据属于A类(都在1附近),后两条数据属于B类(都在5附近)。

数据准备完毕。

(二)kNN分类算法。直接就让新数据与已知类别标签的数据进行比较分类。具体:

(1)将当前数据(与数据集中数据格式一致,如[3.3, 4.0])与数据集中数据依次计算距离(欧式距离公式),存到一个4*1的矩阵中。

(2)将距离按从小到大排序(前k个最小值),返回索引值(python一个函数解决)。

(3)根据索引值找到对应类别标签,然后就计算看哪个类别标签最多,那么这个当前数据[3.3, 4.0]就属于哪个类别。

至此,分类结束。

(三)测试算法。会有疑问,不应该先训练数据再进行新数据的分类吗?上面的KNN算法只是一个分类器算法,我们仍然可用kNN算法训练数据来测试它的正确率。训练数据无非就是修改参数提高分类正确率,降低错误率。其实kNN算法就是通过改变k值检查正确率,就算是训练模型了,就是这样。正确率、错误率怎么计算?假如有1000条数据,我拿900条作为训练数据,100条作为测试数据,都有类别标签。用这100条的每一条与训练的900条依次比较,kNN分类器的结果与本身自带的类别标签比较,不一样的就是分类器的误差,错误数据/总测试数量(100)的结果就是错误率。

 

kNN算法的python代码将会单独上传(https://download.csdn.net/download/u012494321/10764006),装好python环境,安装NumPy包可直接运行分类器。后面还有两个运用kNN的实例:约会网站的配对和手写识别系统,还需要安装matplotlib包,数据集也准备好。约会网站的数据类似上面数据,都是数值的,只不过把类别标签放到了数据后面,单独提取出来就OK,需要注意的是:每一条数据的大小差异较大,某一特征会影响结果,所以引入归一化数值问题。手写识别系统是32*32的二进制图像矩阵,需要格式化处理为1*1024的向量,这样一条数据就是一个矩阵的一行。

猜你喜欢

转载自blog.csdn.net/u012494321/article/details/83718330