谈起机器学习,真是令人心生向往同时又让人头痛不已。
心生向往是因为机器学习在很多方面都已经展现出其魅力,在人工智能的领域比如说AlphaGo
,计算机视觉领域的人脸识别
,车牌识别
,靠近生活的有推荐系统
,用户画像
,情感分析
等等,都或多或少用到机器学习的知识。其中大部分应用是相当能满足程序员心中的极客精神的
但令人头不痛不已的当你去涉足机器学习
这个领域的时候,你会发现其中涉及大量的数学知识,这对很多程序员来说都很不友好。
但没关系,程序员应该是工程师,而不是科学家,我们要做的是学会把理论落实成为生产力。
因此本系列将尽可能降低数学的描述(避免一长串的数学证明)来描述机器学习算法的基本原理。如果需要对算法进行深入了解和学习,那么读者还是应该学习算法背后的数学原理。
好了,废话不多说,马上开讲第一个机器学习的算法,KNN算法。
KNN算法
算法背景
假设,你是一个电影公司的影片分类员,你需要从一大堆影片里面分类出武侠片和爱情片,用肉眼一部部看肯定不科学,现在有一个程序能识别影片中的镜头,聪明的你想到了又么么哒的场面的一定是爱情片,有厮打场面的就是武侠片。
其中,么么哒和厮打两种场面则称为特征
你把这两种特征放入程序里面一分类,咦,怎么错这么多?!
然后,你决定打开其中一两个错误的结果看看……
咦,刚刚还刀剑相向的女主角怎么怎么和男主角吻了起来,卧槽,那可是你的杀父仇人啊喂,哦,原来男主角是被奸人所逼……
咦,这爱情片男女主角怎么吻着吻着就厮打起来,卧槽,还要脱衣服,天啊,我还是个孩子……
你终于明白,错误的原因是因为无法将么么哒和厮打作为单一特征,这时,你明白需要重设设计分类的标准了。
算法设计
牛逼的你发现,虽然无法将么么哒和厮打作为唯一标准,但是是可以作为参考的。比如说,在武侠片中虽然也会出现么么哒的镜头,但显然厮打镜头仍会占主流。
于是你对以往已经分好类别的电影做出统计,并的做出以下表格。
其中这部分样本又叫做训练集
X=么么哒镜头的数量
Y=厮打镜头的数量
0代表爱情片,1代表武侠片
电影ID | X | Y | 类型 |
---|---|---|---|
1 | 10 | 2 | 0 |
2 | 8 | 3 | 0 |
3 | 2 | 6 | 1 |
…… | …… | …… | …… |
把它画出二维图大概是这样:
黄点代表1类电影的分布,绿色代表0类电影的分布,紫色代表需要分类的电影样本。
那么该怎么判别紫色的那颗点所在的类别呢?
没错,KNN就是最简单粗暴的方法,首先判别紫色点离黄色群体和离绿色群体距离,然后将紫色判断为距离最近的那个群体。
这里具体指出利用KNN的具体步骤:
- 计算上述图中所有点到达待测点的欧式距离(勾股定理计算)。
- 选出离待测点最近的
K
个点,k
由用户指定。 - 计算在这
k
个点中,各个类型的个数 - 将个数最多的类型作为预测点的类型。
代码实现
KNN代码实现,收录我的github上,点击一下连接并进入classify
目录下就可访问
后话
在我的github
中会慢慢更新TO DO LIST
里提及的算法,但文章因需要语言总结会稍慢一点。
另外,本文题目是机器学习从入门到放弃之KNN算法而非机器学习从入门到放弃(1):KNN算法这样,因为如果是后者,某日我要弃坑就会触发我的强迫症,而前者并不会,哈哈哈。
如有错误,欢迎指点。