根据群体偏好来为人们提供推荐。
收集偏好
嵌套的字典表示一个人的偏好。
相似度评估值
欧几里德距离
以经过人们一致评价德物品为坐标轴,然后将参与的人绘制在图上,考察他们之间的距离。
函数pow(n,2)对某数求平方,并使用sqrt函数求平方根。
1 | sqrt(pow(4.5-4,2)+pow(1-2,2)) |
上述可计算距离值,偏好相似的人,距离越短。需要一个函数计算偏好相似的情况下给出越大的值,可以将函数值加1(避免被0整除),并取其倒数。
1 | 1/(1+sqrt(pow(4.5-4,2)+pow(1-2,2))) |
这个函数总是返回0到1之间的值,返回1则表示两人具有一样的偏好。
相似度函数
1 | for item in critics['Lisa Rose']: |
代码:
1 | # -*- coding:utf-8 -*- |
计算两个人的相似度。
1 | import recommendations |
皮尔逊相关度评价
判断两组数据与某一条直线拟合程度的相似度。
如果两位评价者对所有的评分情况都相同,那么这条直线将成为对角线。
首先会找出两位评论者都曾评价过的物品,然后计算两者的评分总和与平方和,并求得评分的乘积和。
1 | 1,2,3,4) sum( |
代码
1 | #皮尔逊算法 |
计算:
1 | import recommendations |
寻找与自己有相似品味的影评者。以下的函数中的一个参数为可选的相似性参数,该参数指向一个实际的算法函数。
Python 列表推导式
1 | #从反映偏好的字典中返回最匹配者。 |
计算:
1 | import recommendations |
推荐物品
通过一个加权的评价值为影片打分,评论者的评分结果因此而形成了先后的排名。
首先取得所有其他评论者的评价结果,借此得到相似度后,在乘以他们为每部影片所给的评价值。
Sum(相似度*评价值)/sum(相似度)
1 | #推荐物品 |
计算
1 | import recommendations |
匹配商品
那些商品是彼此相近的。
可以通过哪些人喜欢某一特定物品,以及这些人喜欢哪些其他物品决定相似度。这和之前决定人和人之间相似度的方法是一样的—只需将人员和物品对换即可。
现在以电影作为键,评论者和评分为值。
1 | #字典转换。键值转换 |
结果
1 | import recommendations |
基于物品的过滤
对于一个大型的网站,将一个用户和其他用户进行比较,然后对每位用户评过分的商品进行比较,其速度太慢。之前是采用基于用户的协作过滤,还有一种基于物品的协作过滤。在拥有大量数据集的情况下,基于物品的协作过滤能够得出更好的结论,且允许将大量计算任务预先执行,从而给需要推荐的用户更快得到想要的结果。
思路,为每件物品预先计算好最为相近的其他物品。为某位用户提供推荐时,查看他曾经评价过的物品,从中选出排位靠前者,再构造一个加权列表,其中包含了与这些选中物品最为相近的其他物品。物品的比较不会向用户间的比较那么频繁变化。
构建物品比较数据集
构建一个包含相近物品的完整数据集。构建完后,可以重复使用。
1 | def calculateSimilarItems(prefs,n=10): |
该函数首先利用此前定义过的transformPrefs
函数,对反映评价值的字典进行倒置处理,从而得到有关物品及其用户评价情况的列表。程序又循环遍历每项物品,并将转换的字典传入topMatches
函数中,求得最为先进的物品及其相似度评价值。最后建立了一个包含物品及其最相近物品列表的字典。
1 | import recommendations |
获得推荐
取得用户评价过的所有商品,找出其相近物品,并根据相似度来进行加权。
1 | def getRecommendedItems(prefs,itemMatch,user): |