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

编写程序,生成数据模拟(也可以使用真实数据)多人对多部电影的打分(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])

在这里插入图片描述

版本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]))


在这里插入图片描述

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
协同过滤算法(Collaborative Filtering, CF)是推荐系统中最常用的算法之一,其中基于用户协同过滤算法(UserCF)是其一种常见的实现方式。下面是基于用户协同过滤算法的流程: 1. 首先,我们需要收集用户的历史行为数据,例如用户对商品或者文章的评分、点赞、收藏等。 2. 然后,我们需要将数据转换成用户-物品的评分矩阵,其中用户为行,物品为列,评分为矩阵中的元素。 3. 接着,我们需要计算用户之间的相似度,通常采用余弦相似度或者皮尔逊相似度等计算方法。 4. 然后,我们根据用户之间的相似度来预测目标用户对物品的评分,通常采用加权平均等方法。 5. 最后,我们可以根据用户的预测评分来推荐物品,通常选择预测评分最高的物品作为推荐结果。 下面是一个基于用户协同过滤算法的Python示例代码,该代码使用MovieLens数据集进行演示,其中包括用户电影的评分数据: ```python import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 读取数据集 df = pd.read_csv('ratings.csv') # 构建用户-电影的评分矩阵 ratings_matrix = df.pivot_table(index='userId', columns='movieId', values='rating') # 计算用户之间的相似度 user_similarity = cosine_similarity(ratings_matrix.fillna(0)) # 预测目标用户电影的评分 def predict_rating(ratings_matrix, user_similarity, user_id, movie_id): similar_users = user_similarity[user_id-1] target_movie = ratings_matrix[movie_id] non_nan_indices = ~np.isnan(target_movie) if sum(non_nan_indices) == 0: prediction = np.nanmean(ratings_matrix[user_id]) else: prediction = np.dot(similar_users, target_movie) / np.sum(similar_users[non_nan_indices]) return prediction # 推荐电影 def recommend_movies(ratings_matrix, user_similarity, user_id, n): # 找出目标用户没有评分的电影 target_user = ratings_matrix.loc[user_id] unrated_movies = target_user[target_user.isnull()].index # 预测目标用户电影的评分 predictions = [] for movie_id in unrated_movies: prediction = predict_rating(ratings_matrix, user_similarity, user_id, movie_id) predictions.append((movie_id, prediction)) # 按照预测评分排序并返回前n个电影 predictions = sorted(predictions, key=lambda x: x, reverse=True) recommended_movie_ids = [x for x in predictions[:n]] return recommended_movie_ids # 推荐电影用户1 recommend_movies(ratings_matrix, user_similarity, 1, 5) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alexander plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值