至于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分别是机器学习的三大类别了!