基于用户协同过滤算法的电影打分与推荐

编写程序,生成数据模拟(也可以使用真实数据)多人对多部电影的打分(1~5分),然后根据这些数据对某用户A进行推荐。

  • 推荐规则为:在已有数据中选择与用户A的爱好相似的用户B,然后从最相似的用户B已看过但用户A还没看过的电影中选择用户B打分最高的电影推荐给用户A。
    • 相似度的计算标准:
    • ○1两个用户共同打分过的电影越多,越相似;
    • ○2两个用户对共同打分过的电影的打分越接近,越相似。
from random import randrange
# 其他用户喜欢看的电影清单

#构建用户电影及其评分
data =  {'user'+str(i):{'film'+str(randrange(1, 10)) for j in range(randrange(15)) }for i in range(10)}

#给电影打分
for user in data.keys():
    data[user] = [str(i) + ":" + str(randrange(1,6)) for i in list(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])

基于用户协同过滤算法的电影打分与推荐_第1张图片

版本2

from random import randrange

# 模拟历史电影打分数据
data = {'user'+str(i):{'film'+str(randrange(1, 15)):randrange(1, 6)
                          for j in range(randrange(3, 10))}
         for i in range(10)}

# 当前用户打分数据
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('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]))


基于用户协同过滤算法的电影打分与推荐_第2张图片

你可能感兴趣的:(推荐系统)