1. 关于这个系列
这一系列笔记是我对下面这本书的阅读笔记:
虽然里面的内容看起来很简单,但是我想,想要读懂的话至少还是需要大致了解一点相关知识的。我们从二分查找到选择排序,再到递归与快速排序,之后又了解了散列表与广度优先搜索,并且我们还了解了狄克斯特拉算法与贪婪算法、简单介绍了动态规划。之后,我们将了解K最近邻算法,之后简单介绍一些其他的算法,为进一步的学习做做铺垫。我们的这一系列文章几乎完全按照这个顺序走下去,对书中的知识、例子与代码进行了记录、讨论、挖掘与实现。
对于个人来说,我认为整本书的内容都讲解的清晰易懂——除了第九章的动态规划部分。不过,书中也说明了一点:动态规划是全书最困难的一个部分。我相信随着学习的深入,我们会更好的理解这个内容的。
2. K最近邻算法(KNN)
橙子还是柚子
我们有一个水果——它只可能是橙子或者柚子。我们想让计算机告诉我们答案。
首先,计算机调取了它所知道的几个柚子和橙子,发现自己存储着它们的颜色与个头,于是把它们绘制成了坐标图:
计算机发现橙子的颜色接近橙色、个头更小,而柚子颜色接近红色、个头更大。它们大致分布如图所示。
有了这张图,当我们把手上的水果的颜色信息与大小信息输入计算机后,计算机就可以判断它到底是什么了——如果离橙子近,那么它就是橙子,否则就是柚子。
这就是K最近邻算法——一种简单的分类算法。
电影推荐系统
使用K最近邻算法,我们可以创建一个电影推荐系统。比如,我们的电影分为
电影类别 |
---|
喜剧片 |
动作片 |
生活片 |
恐怖片 |
爱情片 |
我们想要使用K最近邻算法,首先需要将某些用来度量的量数值化。比如,我们通过用户对电影的评分获得了他们对不同种类电影的喜爱程度:
电影类别 | 猫咪 | 海獭 |
---|---|---|
喜剧片 | 2 | 4 |
动作片 | 5 | 3 |
生活片 | 1 | 5 |
恐怖片 | 3 | 1 |
爱情片 | 1 | 5 |
这样,我们用一系列数字表示出了猫咪和海獭对不同类型电影的喜爱程度。之后,假设我们新来了一位用户,它在注册时填写了自己对不同类型电影的喜爱程度(我们应该对这些评分归一化,但这里就不这么做了。或者我们也可以在下面的地方不使用毕达哥拉斯公式而是使用余弦相似度——一种归一化的方式):
电影类别 | 猫咪 | 海獭 | 狐狸 |
---|---|---|---|
喜剧片 | 2 | 4 | 3 |
动作片 | 5 | 3 | 4 |
生活片 | 1 | 5 | 4 |
恐怖片 | 3 | 1 | 1 |
爱情片 | 1 | 5 | 4 |
好了——我们现在开始计算狐狸和猫咪与海獭的“距离”:我们只需要使用所谓的毕达哥拉斯公式
只不过是五维的(其实没什么区别,只是将数对增加了)。
通过计算,我们发现狐狸与海獭的距离是2,而与猫咪的距离则是4.9。所以,我们只要将海獭喜欢的电影推荐给狐狸即可。
这就是一个使用了K最近邻算法的电影推荐系统。
预测电影评分
有了K最近邻算法,我们就可以预测用户对某个电影的打分了——首先,我们通过计算距离找到与狐狸最近接的K个用户——这里我们取K = 3,它们对电影的评分是3.5、4.1,3.9,那么,我们取这三个评分的平均数,就可以作为对狐狸打分的预测。
这种做法被称为回归。
回归大有用处
假设我们开了一家面包店。如何确定今天烤多少面包呢?
首先,我们要将一些具体的特征数值化,例如给天气定下1到5的标准,给是不是节假日定下1或0,给面包店是否打折定下1或者0,这样我们就可以将这些值和卖出的面包数挂钩了。比如,我们已经有了一些数据
(5,1,0)= 300;(3,1,1) = 225;
(1,1,0) = 75;(4,0,1) = 200;……
那么,我们将今天的情况表示成三元组,计算与今天距离最近的K天,然后将这些天卖出的面包取平均值——这样的一个回归过程所得到的值可以很好的指导我们今天要烤的面包数。