概述
这段时间打算学习一下机器学习的常用基本算法,包括弄明白这些算法的原理等。笔记主要总结这些算法。本文内容主要关于书中第二章『提供推荐』的两个基本概念,欧几里得距离和皮尔逊相关度及实现。
背景
假设我们有一些用户对电影的评价数据如下。
1 | # test data |
上述Python嵌套字典存储了我们需要的数据(保存为recommendations.py),接下来我们以这些数据来学习计算相似度评价值。
欧几里得距离
欧几里得距离评价(Euclidean Distance Score)是计算相似度评价值的一个非常简单的方法。欧氏距离是在欧氏空间中两点的距离值,欧几里得距离评价即经过适当处理后的值(欧氏距离加1后取倒数),两点之间的距离越近,其欧几里得距离评价越高,取值范围为[0,1]。其Python的实现如下所示(添加到recommendations.py中)。
1 | from math import sqrt |
上面的sim_distance函数共有3个参数,分别是偏好数据(就是我们的示例数据字典),用户1,和用户2。该函数根据偏好数据来计算用户1和用户2的欧几里得距离评价。
1 | from recommendations import * |
注意sim_distance函数中的最后一行,我们把求到的欧氏距离加1后取倒数,这是为了能让我们队偏好相近的情况给出越大的值。所以这里给欧氏距离加1厚去倒数(加1是为了防止被零整除的错误)。
皮尔逊相关度
皮尔逊相关度(Pearson Correlation Score)相对于欧几里得距离而言稍微复杂一些,该相关系数是判断两组数据与某一直线的拟合程度的一种度量。
皮尔逊相关度对『夸大分值(grade inflation)』进行了修正。示例数据中,Jack Matthews总是比Lisa Rose给出的分值更高,但最终的直线仍然是拟合的,这是因为他们两者有着近似的偏好。如果某人总是倾向于给出比另一个人更高的分值,而二者的分值之差又始终保持一致,则他们依然可能会存在很好的相关性。欧几里得距离评价会因为一个人的评价比另一个人更严格,而得出评价始终相对偏低的结论(并不说这样是错的,根据具体的应用场景不同而不同)。
皮尔逊相关度算法的具体Python实现如下所示(添加到recommendations.py中)。
1 | # Pearson Correlation Score |
sim_pearson函数的三个参数与意义相同,但函数的值域在[-1,1]之间。值为1表示两个人对每一样物品均有完全一致的评价,值为-1表示两人对每一样物品均有截然相反的评价,值为0表示两人无相关性。
1 | from recommendations import * |
为评论者打分
我们现在已经能对两个人进行比较了,为了找出对用户而言最合适的评论者,我们可以编写函数然后排序来找到结果,代码如下(添加到recommendations.py中)。
1 | def topMatches(prefs, person, n = 5, similarity = sim_pearson): |
topMatches函数一共四个参数,分别是偏好数据,目标用户,取排序的前几名,相似度算法的选取。其中默认取排序的前5名,相似度算法默认用皮尔逊相关度。
1 | from recommendations import * |
根据结果可知,Toby应该阅读Lisa Rose撰写的影评,因为她的评委与Toby很相近。
推荐物品
很多时候我们需要的不是去看别人的影评,而是希望得到一份电影的推荐列表。问题是,如果Toby只看Lisa Rose撰写的影评,可能会有一些特殊情况,比如Lisa偏好有些古怪,她特别喜欢某部电影,而该电影在其他影评人那里口碑都很差;又或者Lisa有些电影没看到,而这些电影恰恰就是Toby喜欢看的电影。
为了解决这个问题,我们需要对影片的评分加权值,将权值乘以评分后,再除以权值的和。简单地说就是类似于取评分的数学期望,注意这里的评分是不均匀的。下表给出了具体的执行过程。
评论者 | 相似度 | Night | S.xNight | Lady | S.xLady | Luck | S.xLuck | |
---|---|---|---|---|---|---|---|---|
Rose | 0.99 | 3.0 | 2.97 | 2.5 | 2.48 | 3.0 | 2.97 | |
Seymour | 0.38 | 3.0 | 1.14 | 3.0 | 1.14 | 1.5 | 0.57 | |
Puig | 0.89 | 4.5 | 4.02 | 3.0 | 2.68 | |||
LaSalle | 0.92 | 3.0 | 2.77 | 3.0 | 2.77 | 2.0 | 1.85 | |
Matthews | 0.66 | 3.0 | 1.99 | 3.0 | 1.99 | |||
总计 | 12.89 | 8.38 | 8.07 | |||||
Sim.Sum | 3.84 | 2.95 | 3.18 | |||||
总计/Sim.Sum | 3.35 | 2.83 | 2.53 |
算法的具体Python实现如下所示(添加到recommendations.py中)。
1 | # Recommendations |
使用欧几里得距离评价测试如下。
1 | from recommendations import * |
使用皮尔逊相关系数评价测试如下。
1 | from recommendations import * |
以上,我们根据不同的使用相似度评价值算法,得到了Toby的影片推荐列表,可以看出在本例中,二者的并没有质的区别。
最后我们还可以对数据先进行转置,然后再调用topMatches函数,我们可以得到和指定某部电影近似的其他电影,具体过程这里不再赘述。