机器学习从入门到放弃之KNN算法

谈起机器学习,真是令人心生向往同时又让人头痛不已。

心生向往是因为机器学习在很多方面都已经展现出其魅力,在人工智能的领域比如说AlphaGo,计算机视觉领域的人脸识别,车牌识别,靠近生活的有推荐系统,用户画像情感分析等等,都或多或少用到机器学习的知识。其中大部分应用是相当能满足程序员心中的极客精神的

但令人头不痛不已的当你去涉足机器学习这个领域的时候,你会发现其中涉及大量的数学知识,这对很多程序员来说都很不友好。

但没关系,程序员应该是工程师,而不是科学家,我们要做的是学会把理论落实成为生产力。

因此本系列将尽可能降低数学的描述(避免一长串的数学证明)来描述机器学习算法的基本原理。如果需要对算法进行深入了解和学习,那么读者还是应该学习算法背后的数学原理。

好了,废话不多说,马上开讲第一个机器学习的算法,KNN算法。

KNN算法

算法背景

假设,你是一个电影公司的影片分类员,你需要从一大堆影片里面分类出武侠片爱情片,用肉眼一部部看肯定不科学,现在有一个程序能识别影片中的镜头,聪明的你想到了又么么哒的场面的一定是爱情片,有厮打场面的就是武侠片。

其中,么么哒厮打两种场面则称为特征

你把这两种特征放入程序里面一分类,咦,怎么错这么多?!

然后,你决定打开其中一两个错误的结果看看……

咦,刚刚还刀剑相向的女主角怎么怎么和男主角吻了起来,卧槽,那可是你的杀父仇人啊喂,哦,原来男主角是被奸人所逼……

咦,这爱情片男女主角怎么吻着吻着就厮打起来,卧槽,还要脱衣服,天啊,我还是个孩子……

你终于明白,错误的原因是因为无法将么么哒厮打作为单一特征,这时,你明白需要重设设计分类的标准了。

算法设计

牛逼的你发现,虽然无法将么么哒厮打作为唯一标准,但是是可以作为参考的。比如说,在武侠片中虽然也会出现么么哒的镜头,但显然厮打镜头仍会占主流。

于是你对以往已经分好类别的电影做出统计,并的做出以下表格。

其中这部分样本又叫做训练集

X=么么哒镜头的数量
Y=厮打镜头的数量
0代表爱情片,1代表武侠片

电影ID X Y 类型
1 10 2 0
2 8 3 0
3 2 6 1
…… …… …… ……

把它画出二维图大概是这样:

机器学习从入门到放弃之KNN算法

黄点代表1类电影的分布,绿色代表0类电影的分布,紫色代表需要分类的电影样本。

那么该怎么判别紫色的那颗点所在的类别呢?

没错,KNN就是最简单粗暴的方法,首先判别紫色点离黄色群体和离绿色群体距离,然后将紫色判断为距离最近的那个群体。

这里具体指出利用KNN的具体步骤:

  • 计算上述图中所有点到达待测点的欧式距离(勾股定理计算)。

  • 选出离待测点最近的K个点,k由用户指定。

  • 计算在这k个点中,各个类型的个数

  • 将个数最多的类型作为预测点的类型。

代码实现

KNN代码实现,收录我的github上,点击一下连接并进入classify目录下就可访问

github

后话

在我的github中会慢慢更新TO DO LIST里提及的算法,但文章因需要语言总结会稍慢一点。

另外,本文题目是机器学习从入门到放弃之KNN算法而非机器学习从入门到放弃(1):KNN算法这样,因为如果是后者,某日我要弃坑就会触发我的强迫症,而前者并不会,哈哈哈。

如有错误,欢迎指点。