from random import randrange
# 其他用户喜欢看的电影清单#构建用户电影及其评分
data ={'user'+str(i):{'film'+str(randrange(1,10))for j inrange(randrange(15))}for i inrange(10)}#给电影打分for user in data.keys():
data[user]=[str(i)+":"+str(randrange(1,6))for i inlist(data[user])]# 查找与待测用户最相似的用户和Ta喜欢看的电影
user ={'film1','film2','film3'}
similarUser, films =max(data.items(), key=lambda item:len(set(str(item).split(':')[0])&user))# 推荐
dic ={}
siml =[]for film in data[similarUser]:
name,score =str(film).split(':')
siml.append(name)
dic[name]=int(score)
dic =sorted(dic.items(),key =lambda x:x[1],reverse=True)print('Ta看过的电影中跟你的喜好匹配程度排序:',dic)print('历史数据:')for u, f in data.items():print(u, f, sep=':')print('和您最相似的用户是:', similarUser)print('Ta最喜欢看的电影是:', films)print('Ta给电影打分排序情况:',dic)print('Ta看过的电影中您还没看过的有:',set(siml)-user)print('他看过的电影中跟你的喜好可能最匹配的是:',dic[0])
版本2
from random import randrange
# 模拟历史电影打分数据
data ={'user'+str(i):{'film'+str(randrange(1,15)):randrange(1,6)for j inrange(randrange(3,10))}for i inrange(10)}# 当前用户打分数据
user ={'film'+str(randrange(1,15)):randrange(1,6)for i inrange(5)}# 最相似的用户及其对电影打分情况# 两个用户共同打分的电影最多# 并且所有电影打分差值的平方和最小
f =lambda item:(-len(item[1].keys()&user),sum(((item[1].get(film)-user.get(film))**2for 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))**2for film in user.keys()&item[1].keys())),
item,
sep=':')print('current 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]))
编写程序,生成数据模拟(也可以使用真实数据)多人对多部电影的打分(1~5分),然后根据这些数据对某用户A进行推荐。推荐规则为:在已有数据中选择与用户A的爱好相似的用户B,然后从最相似的用户B已看过但用户A还没看过的电影中选择用户B打分最高的电影推荐给用户A。相似度的计算标准:○1两个用户共同打分过的电影越多,越相似;○2两个用户对共同打分过的电影的打分越接近,越相似。from random import randrange# 其他用户喜欢看的电影清单#构建用户电影及其评分data