介绍
协作型过滤
对一大群人进行搜索,找出与我们品味相同的人。算法对这些人偏爱的其他的内容进行考察,并把它们组合起来形成一个经过排名的推荐列表。
先找到和我们志趣相投的人,那么那些志趣相投的人推荐的东西,肯定是我们喜欢的。
寻找相似的用户
把每个人与所有其他人进行比较,并计算他们的相似度评价值。有两种方法:欧几里得距离和皮尔逊相关度。
欧几里得距离本质是求出两个向量的夹角。皮尔逊相关度是对向量标准化(减去平均值)之后再求它们的夹角。
欧几里得距离
欧几里得距离就是把每个人对电影的评价当作一个多维空间中的向量。两个人的相似程度就是两个向量的距离。
1. 向量的维度就是电影名称
2. 每个维度的值就是对这个电影的评分。
可以通过下面的函数计算两个人的相似度。最后的返回值做了Normalization,保证返回1是完全相似。返回0是完全不相似。
def sim_distance(prefs, p1, p2):
'''
Returns a distance-based similarity score for person1 and person2.
'''
# Get the list of shared_items
si = {}
for item in prefs[p1]:
if item in prefs[p2]:
si[item] = 1
# If they have no ratings in common, return 0
if len(si) == 0:
return 0
# Add up the squares of all the differences
sum_of_squares = sum([pow(prefs[p1][item] - prefs[p2][item], 2) for item in
prefs[p1] if item in prefs[p2]])
return 1 / (1 + sqrt(sum_of_squares))
皮尔逊相关度
如果某个人评分总是比另外的人高,欧几里得距离就不是那么合适了。这个时候可以用皮尔逊相关度来计算两个变量的相关程度。
pearson其实做的事情就是先把两个向量都减去他们的平均值,然后再计算两个向量