机器学习之KNN 算法

时间:2021-12-31 05:45:15
  邻近算法机器学习之KNN 算法

  KNN算法的决策过程

k-Nearest Neighbor algorithm
右图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
  各位看到标题,如果没有听过kNN算法,会不会觉得疑惑:KNN是甚么呢?是不是CNN看久了,就变成DNN、ENN、最后变成KNN了呢?当然不是啦 XD!KNN全名是k-th nearest neighbour,中文意思是「第k位最接近的邻居」。甚么是「第k位最接近的邻居」呢?假设在 一个广场上,有100个朋友,每位朋友都是你的邻居,最接近你的邻居,就是「第一位距离最近的邻居」了,比第一位稍微远一点的邻居,就是「第二位距离最近的邻居」了,以此类推,第10位距离最近的邻居,就是k=10的时候了。
至于KNN算法是甚么,又有甚么特别呢?之前提过了「人工智能与机器学习」。KNN算法就是一种机器学习的算法。在进一步探讨甚么是KNN算法之前,我们先介绍一下甚么是算法。算法可以看成是一种「步骤」的集合。举例来说:我们煮一道菜,第一步是先洗菜,第二步切菜,第三步放油,第四步快炒,第五步加点水闷几分钟,第六步再炒几分钟,最后第七步加盐和味精,然后炒到菜煮熟为止。算法就是这样子,把工作分成详细的步骤,有些步骤可能会重复执行,象是菜不够咸,就再加点盐,一直到口味对了为止。有时候会依照情况的不同而有不同的步骤,象是过马路的时候,如果是红灯,我们重复「等待」的步骤,如果是绿灯,我们会进行「走路过斑马线」的步骤。
由于计算机本身就是执行一道一道的指令,因此算法详细列出来的步骤,已经很接近计算机执行工作的语言。至于KNN算法又是由哪些步骤所组成的呢?在这之前,我们再稍微提一下KNN算法和机器学习之间的关系。之前在「人工智能与机器学习」的文章中稍微提了一下,机器学习就是让机器接收外界输入的资料以后,依照某种算法(一些步骤的集合),训练出一种模型,这个模型是一种从资料学习出来的东西,有了这个东西,机器看到新的资料的时候,不会空空如也,而是有某种程度的经验和智慧,可以了解新的资料了。
在这个过程中,有两种训练的方法:监督式和非监督式的学习。所谓监督式的学习,是指在训练机器学出一个模型的之前,会先有一段训练的时间,在这段时间里面,每一笔资料会有一个正确答案,机器学习以后,会根据答案调整自己学习的方法。举例来说:我们学习数学的时候,可能会练习一些题目,练习以后,会对一下答案,如果算错了,就会调整自己的计算方式,或是检查有没有粗心算错的地方。机器学习里面的监督式学习正是如此,训练之后,才开始有预测的阶段,这个时候输入机器的资料没有正确答案,机器必须根据他之前学习的模型来判断,预测新的资料应该输出哪一个正确答案,而不像再训练阶段的时候,输入的资料会有人类提供的正确答案了。
另外一种非监督式的学习,则是连训练的阶段都没有。我们只给予机器简单的学习方法,或是一个简单的价值观,然后就开始把资料输入机器,让机器自行判断正确答案。举例来说:我们还没上小学之前,已经有了一些基本的说话能力。我们从婴儿开始哑哑学语,我们并不晓得,甚么是主词、动词、受词。我们可能连注音符号都不晓得。但是我们的父母一直跟我们讲话,我们有一天就突然蹦出一些词,第一句可能是「妈妈」!第二句可能是「爸爸」!之后可能开始简单的对话,最后在上小学之前,我们至少会问简单的问题,老师讲的句子也都听的懂,才有办法起立、立正、敬礼,还有学习注音符号,练习写字了。非监督式的学习就是类似如此,我们给机器资料,简单的规则和价值观,剩下的就交给机器一边学习一边预测正确答案是甚么了。
       下面来看一个实例,如图所示。我们的目标是要机器学会怎样子分出红点和蓝点。

                                                                机器学习之KNN 算法

KNN就是一种非监督式的学习法。首先,我们要替每一笔资料定出一个位置,象是上图:
我们的目标是要机器学会怎样子分出红点和蓝点。每个点在平面上有个位置,分别用(x,y)来代表,举个例子来说:红点代表女生的大头照,蓝点代表男生的大头照,x轴代表照片中头发的长度,y轴代表照片中脸面积的大小。现在机器已经知道某些点是男生的大头照(蓝色的点)、某些是女生的大头照(红色的点)。当一张新的大头照输入机器以后(图片里面打问号没有颜色的点),KNN算法就先计算这个点,和其他已经知道男生或女生的资料点之间的距离(图里面画了几条线代表在计算距离)。今天KNN的K如果设定成1,也就是(1-NN)的话,代表机器会找第一位距离最近的点,然后看这个点是男生(图中蓝色点)或是女生(图中红色点)。如果这个点是男生,那么我们也预测刚才打问号的这个点(新的资料点)是男生的大头照。之后这个问号点就变成蓝色的,然后继续反覆同样的动作在下一个新输入的资料点,预测新的问号点是男生或是女生。
如果k=3,也就是使用3-NN学习,情况会变成怎样子呢?机器同样先计算图中打问号的点和各个颜色的点的距离,接着选出前三名距离最近的点,然后看看里面红色的点比较多(2个以上的点是红色)还是蓝色的点比较多(2个以上的点是蓝色),如果蓝色点比较多,就判断这个新问号点,是男生的大头照了。以此类推,会有5-NN,7-NN,9-NN学习法,端看问题的需要而定。
KNN学习法就是如此。他的好处是简单,而且是一种非监督式学习方法,让人们省去准备训练资料(资料和对应的正确答案)的时间。然而KNN也有他困难的地方。首先是每个机器学习法都要面对的问题,就是选择特征,用刚才的例子,我们用头发长度和脸大小的面积来让机器学习,如果遇到留长发的男生或是轮廓比较大的女生,可能就判断不大出来:或是说,如果我们改用肤色来判断,比较白的是女生,比较黑的是男生,万一这个规则拿来判断欧洲人,可能也不大行。
另一个困难则是距离的订定。刚才的例子中,头发长度如果用公分来算,差距1公分的头发长度,可能有办法分辨男女。如果是用头发的颜色来判断的话,那么颜色的「距离」就不知道要怎么定了,或许可以定成光线频率的距离,那机器还可以学习,不然「红色」和「黑色」两种颜色之间的距离,可能就不知道要怎么定了。这个问题在语意的问题上,也特别重要。如果我们要判断两个词是否属于同一类东西,但是只看两个词差别的字数,用相异字数的个数来当做坐标上的距离,就会出现一些意想不到的状况。譬如说:「巴黎铁塔」、和「巴黎蛋塔」,只差了一个字,和「巴黎圣母院」差了三个字,所以「巴黎铁塔」和「巴黎蛋塔」比较接近,属于同一类,那么机器学出来的东西,可能就不是我们想要的了。
因此,KNN是个好用的机器学习法,然而在某些问题上,仍然有改进的空间了!希望大家读完这一篇以后,都能了解KNN算法囉!
总结
1 算法是一些步骤的集合,包含重覆部分与依条件执行的部分
2 机器学习可分为监督和非监督两种学习法,差别在于有无训练资料(训练资料里面有正确答案给机器参考)
3 KNN是一种非监督式学习算法,是参考最近k个邻居的答案来做判断
4 某些问题上(例如语意问题)以及特征的选择,是使用KNN需要注意的地方
KNN算法 (更正篇)
上回和各位分享了KNN算法。不过在算法的归类上,我错把KNN归类成非监督式学习,英文称为unsupervised learning。在这边我重新定义监督式/非监督式学习:监督式学习是说,我们把资料给机器学习的时候,资料会有label,也就是说,每一个资料对应的正确答案,都会给机器看。机器学完以后,会产生一个模型 (model),也就是他学习完的成果,之后遇到新的资料,他就用学习出来的模型来判断新的东西,输出新东西该有的正确答案。用之前判断大头照是男生或女生的例子,每一张照片给机器学习的时候,除了照片本身,还会让机器知道每张照片的正确答案 (男生还是女生)。之后机器用他学出来的模型 (model) 来判断新的照片,接着输出答案 (男生或女生)。
非监督式学习就有些不同了。在非监督式学习的情况下,机器只能看到资料,但是不知道资料的label,也就是说,资料是甚么东西并不晓得。机器学出来的模型,是这些资料的pattern,之后遇到新的资料,机器是根据学出来的模型,判断新的资料比较像以前看过的哪一种资料(比较像以前看过的照片里面的某几张照片),而不是说这个资料对应的答案(男生还是女生)。
KNN算法因为输入的资料有正确答案 (每张照片是男生或是女生),而不是没有答案的资料 (一堆照片)。学习之后也是判断新资料的正确答案 (男生或女生),而不是仅仅告诉我们这张照片和以前看过的哪几张照片比较像。所以KNN算法是一种监督式算法 (supervised learning)。
另一种学习法的分类是parametric learning和instance-based learning。parametric learning中文称作参数式的学习,主要是假设观察到的资料,是由几个关键的参数所决定,机器要做的就是从观察到的资料中去学到这些参数应该是多少,之后用学到的参数当作模型 (model)来判断新的资料。instance-based learning则是把所有观察到的资料都列入考虑,成为学习到的模型,当遇到新的资料的时候,过去所有观察到的资料或多或少都发挥一些判断力,让机器作为根据来判断新的资料。KNN算法因为会计算每一个点和新资料点的距离,因此是一种instance-based学习法。其他算法,譬如说回归分析,假设有一条线可以分出男生和女生的资料点,我们要学出这条线 (这条线的斜率和截距),就是根据观察到的资料点来求出这条直线的斜率以及和坐标轴相交的截距,此时斜率和截距,就是要学习的参数,也因此称为parametric learning,和把所有资料点都当成判断依据的instance-based学习法 (例如KNN) 有所不同了。
最后再提一下reinforcement learning (加强学习法),是先定义每一种情况的好或坏,也就是给机器一套价值观,之后让机器自行去学习。机器观察很多资料以后,作出不同的反应 (「反应」可以是输出正确答案,或是机器人开车等等),但是不同的反应可能会有不同的结果,结果的好坏就成为反馈 (feedback) 的资料,让机器学会下次遇到类似的情形如何反应。reinforcement learning、supervised learning、以及unsupervised learning分别是机器学习的三大类别了!