今天聊KNN。
KNN不是“夸你呢”的缩写,全称K-NEAREST NEIGHBOR,取首字母缩写为KNN,中译一般叫“K最近邻算法”,是一种常用的机器学习算法。
为什么想起来聊KNN呢?这是因为最近读了好几本机器学习的书,发现了一个很有趣的现象,忍不住和大家分享。机器学习的书我常说,一般分两种,一种偏数学,一种偏编程。偏编程的机器学习教材,基本都把KNN排在前几章比较靠前的位置。
这说明什么呢?技术书的编排顺序其实是有规律的,基本会按难易先后,排在前几章的,一般都是比较基础的内容,但同时也是作者最希望读者优先阅读的内容。回忆一下就知道了,一本新书拿到手,翻得最多的肯定是前三章,而后三章没准过了很多年都还和新的一样。嗯,不用害羞,大家都是这么干的,那些大部头的技术书,后几章的主要作用都是用来藏私房钱。
那么,有趣的事情就来了。偏数学的机器学习教材恰恰相反,我发现很多干脆不提KNN,连那本著名的神书PRML,厚达700多页,基本上把机器学习中值得一提的题材都八卦完了,却也没有提KNN半个字。
KNN是何方神圣,为什么会造成这么大的反差呢?
因为简单。
KNN真的很简单,主要算法都写在名字里了。KNN是个分类算法,分类共两步:
第一步,量距离,以当前待分类样本为中心,找到K个最近邻;
第二步,记得票,统计一下K个最近邻中各个类的占比,哪个类占比最大,待分类样本就归属哪个类。
实现也简单,差不多就是机器学习里的Hello World了,所以机器学习在编程方面肯定都不会少了KNN。但另一方面,KNN太符合直觉太简单了,简单得简直没有道理可讲。我想,偏数学的教材大概不知道怎么套用频率学说或者贝叶斯学说的框架给KNN安排一套解释理论,同时又不显得画蛇添足,所以要么干脆不讲,要么只讲那些距离都怎么量。
不过,书上不讲,不代表KNN没有实战价值。机器学习不是一个看脸的地方,谁能解决问题谁就能出名。KNN出名不止因为它简单,同时也因为它好用。都知道深度学习是靠图像分类一战成名的,那在深度学习横着走之前,业内常用的图像分类算法是哪款?KNN。为什么好用?那就是另一个故事了,找机会再聊。
现在讲图像识别的书相当多,各种CNN模型眼花缭乱,不过,如果要我来写的话,我会从KNN这款图像分类算法的老前辈写起,历史传承,饮水思源嘛。
下次再聊。