假设已有大量用户对若干电影的评分数据,现有某用户,也看过一些电影并进行过评分,要求根据已有打分数据为该用户进行精准推荐。要求尽量推荐与该用户喜欢的电影类型相同的电影(或者说,根据与该用户爱好最相似的用户打分数据进行推荐),如果有多个可能的电影,则推荐打分最高的电影。
from random import randrange
#历史电影打分数据,一个10个用户,每个用户对3到9个电影进行评分
#每个电影的评分最低1分,最高5分,这里是字典推导式和集合推导式的用法
data= {'user'+str(i):{'film'+str(randrange(1,15)):randrange(1,6)
for j in range(randrange(3,10))}
for i in range(10)}
#模拟当前用户打分数据,为5部随机电影打分
user={'film'+str(randrange(1,15)):randrange(1,6) for i in range(5)}
# 最相似的用户及其对电影的打分情况
# 两个用户共同打分的电影最多
# 并且所有电影的打分差值最小
f = lambda item:(-len(item[1].keys()&user),
sum(((item[1].get(film)-user.get(film))**2
for film in user.keys()&item[1].keys())))
similarUser,films= min(data.items() , key=f)
# 在输出结果中,第一列表示两个人共同打分的电影的数量
# 第二列表示两人打分之间的相似度,数字越小表示越相似
# 然后是该用户对电影的打分数据
print('known data'.center(50,'='))
for item in data.items():
print(len(item[1].keys()&user.keys()),
sum(((item[1].get(film)-user.get(film))**2
for film in user.keys()&item[1].keys())),
item,
sep=':')
print('curren user'.center(50,'='))
print(user)
print('most similar user and his films'.center(50,'='))
print(similarUser,films,sep=':')
print('recommended film'.center(50,'='))
# 在当前用户没看过的电影中选择打分最高的进行推荐
print(max(films.keys()-user.keys(), key=lambda film : films[film]))