监督学习之kNN原理解析

来源:互联网 发布:无线键盘 知乎 编辑:程序博客网 时间:2024/05/22 10:25
kNN算法原理剖析
 一、kNN算法介绍
        kNN算法是由著名学者Cover和Hart在1968年提出来的,是个相对其他算法来讲,比较早的算法,它的工作原理可以这样来理解:对于给定一个训练数据集,对于新的输入实例,在训练数据集中找到与这个新的实例最近的k个邻居,在这k个邻居中,有多数实例属于某个已知的类,那么把这个已知的类作为这个新实例所属的类别。也就是利用投票法(少数服从多数)来决定新实例的类别。注意由于采用的是投票法,因此k值一般取奇数。先来看幅图:
               
       从上面这幅图可以看出,这些数据有两种类别,一个是红色的三角形,另一个是蓝色的正方形,而这个绿色的圆是我们上面讲到的新的实例,现在我们的任务是判别这个新的实例所属的类别。现在根据算法的原理来完成这个任务。
       首先,假如选择最近的3个邻居,即k=3,那么通过肉眼也能看到,在这三个邻居中,有两个邻居是三角形这一类,而另外一个是正方形这一类,根据少数服从多数的原则,新的实例的类别应该是三角形。
        可以看到这个算法非常的简单,不用训练,现用即可,因此有学者又称其为“懒惰学习”算法,很容易理解。但是这个过程是不是就这样结束了呢?
        同样,利用该算法,现在不取k=3,而取k=5,根据投票原则,新的实例的类别应该是正方形。
        这怎么办呢?一会是三角形,一会又是正方形,到底是哪个类别呢?下来待我慢慢道来。
       这个算法看似简单,但要注意的点还真不少,比如k值的选取,如何有效地把握,对我们的分类任务至关重要。
二、kNN细节的把握
       究竟如何选取合适的k值呢?
       首先,如果k值选取太小,就相当于以待分类的实例为中心,在较小的邻域内,以该邻域内的邻居的类别来为新实例分类,那么就意味着我们的整体模型会比较复杂,容易发生过拟合,也就是说如果有噪声,则会影响分类效果。如果取k=1这种极端情况,来解释模型的复杂性以及过拟合现象。如下图所示:

             
        如上图所示,有两个类别,一个是圆类,另一个是矩形类,现在需要预测的实例是那个五边形,它是属于圆类呢还是矩形类呢?
        根据kNN算法很容易判断该五边形属于圆类,但是很明显能感受到,如果这个圆类是个噪声,那么就会导致分类错误,现实中也是这样,出现这样的问题在于,k值太小,受噪声的影响较大,对于上面的分类,若把k值取大,那么受噪声影响就比较小,也就是说相对来讲比较稳定,分类不容易出错。而过拟合指的是在训练数据集上误差很小,而在测试数据集中误差比较大,就比如学知识,反复做会的题,每次都是全对,不去做新的题去提升自己的能力,结果在考试中表现很差,这就是过拟合。由于受到噪声的影响,而忽略了实际中数据的真实分布。
        那么k值取小容易发生过拟合,模型比较复杂,那么取大好不好呢?答案是不一定好。如果k值较大,就相当于用较大邻域中的数据去做预测,这时离待预测实例比较远的数据(不相似),也会对新实例类别的预测起干扰作用,相对应的,k值越大,意味着整体模型变得简单,怎么个简单法呢?试想一下,假如k的取值是训练数据集中实例的个数,假如有m个实例,即取k=m,那么不管待预测的实例是何方神圣,算法都会把它预测为训练数据集中最多的那个类别,这个很容易想,也就是说没有什么可预测的了。那下面的图解释下:
                                
     
      比如现在要预测五边形的类别,数一下就能发现,一共有16个训练实例,其中矩形有7个,圆形有9个,那么根据少数服从多数的原则,五边形应该属于圆类,但是我们明显能感觉出来,五边形应该归为矩形,也就是说,如果范围过大,较远的实例会对分类结果产生影响,而且由于k=16包含了所有的训练实例,而且最多的那个类的实例已经明确,你不管这个训练实例的坐标如何,都会把它归为圆类,这是没有意义的,归根结底还是因为模型太过简单,完全忽略了训练数据集中大量有用的信息,因此这种取法是不合理的。
       因此,k值得选取既不能过大,也不能太小,那么k如何取才算合理呢?一般的通过交叉验证法来选取最优的k值,关于交叉验证法,会在以后进行深层次的讨论,这里只需要知道选取最优k值用到的方法。因此,k值的选取就是通过实验不断的取修改k值,而调参在机器学习领域是经常做的一项工作。那么达到什么样的效果才算合理呢?那就是基本分类稳定,在一定范围内。如下图所示:
                   

  三、kNN算法原理的实现
         

      可以看到kNN算法模型包括三个要素:距离的度量,k值的选择,分类决策规则。在这里,距离度量选的是欧氏距离,k值的选择上面说过了利用交叉验证法来选择,分类规则利用投票法原则。
 四、kNN算法总结
       1.算法的核心思想就是:给定一个训练数据集,计算新的实例与该数据集中每个实例的距离,对这些距离从小到大进行排序,取这些距离中前k个,也就是距离待预测实例最近的k个距离,对应着有k个训练实例,这k个训练实例中的多数所属的类即为新的待预测的实例的类别。
        2.一般而言,距离有多种形式,比如曼哈顿距离,欧氏距离,等等。这里选取欧氏距离,也就是我们常用的距离,即两点间的距离。
        3.在进行距离计算时,为了保证实例的每个特征同等重要,因此,需要进行归一化(又称标准化)处理,一般采用最小最大归一化。
        4.k值的选取,要适中,不能太大,也不能太小,具体的值需要通过实验进行调参。
        笔者才疏学浅,如果各位看客有什么问题,可以留下你们宝贵的意见,我一定会加以改正,谢谢你们了。