已有大量用户对若干电影的打分数据,现有某用户,也看过一些电影并进行过评分,要求根据已有打分数据为该用户进行推荐。 要求: 代码采用基于用户的协同过滤算法,也就是根据用户喜好来确定与当前用户最相似的用户,然后再根据最相似用户的喜好为当前用户进行推荐。 代码采用字典来存放数据,格式为{用户1:{电影名称1:打分1, 电影名称2:打分2,...}, 用户2:{...}}。
时间: 2023-05-29 14:04:07 浏览: 149
以下是一种基于用户的协同过滤算法的实现:
```python
# 定义一个字典来存放已有打分数据
ratings = {
"User1": {"Movie1": 4, "Movie2": 3, "Movie3": 5, "Movie4": 2},
"User2": {"Movie1": 5, "Movie5": 4, "Movie6": 3},
"User3": {"Movie2": 2, "Movie4": 5, "Movie5": 4},
"User4": {"Movie1": 3, "Movie3": 4, "Movie4": 3},
"User5": {"Movie2": 4, "Movie6": 5}
}
# 定义一个函数来计算两个用户之间的相似度
def similarity(user1, user2):
# 获取两个用户都评价过的电影
movies = [movie for movie in ratings[user1] if movie in ratings[user2]]
# 如果没有共同评价的电影,则相似度为0
if len(movies) == 0:
return 0
# 计算两个用户共同评价的电影的评分之差的平方和
sum_of_squares = sum([(ratings[user1][movie] - ratings[user2][movie]) ** 2 for movie in movies])
# 返回相似度
return 1 / (1 + sum_of_squares)
# 定义一个函数来为指定用户进行推荐
def recommend(user):
# 找到与指定用户最相似的用户
similarities = [(other_user, similarity(user, other_user)) for other_user in ratings if other_user != user]
similarities.sort(key=lambda x: x[1], reverse=True)
most_similar_user = similarities[0][0]
# 获取最相似用户评价过的电影,但当前用户没有评价过的电影
recommendations = {}
for movie in ratings[most_similar_user]:
if movie not in ratings[user]:
recommendations[movie] = ratings[most_similar_user][movie]
# 返回推荐结果
return recommendations
# 测试函数
print(recommend("User1"))
```
在上面的代码中,首先定义了一个字典来存放已有的打分数据。然后定义了一个`similarity`函数来计算两个用户之间的相似度,使用的是余弦相似度算法。接着定义了一个`recommend`函数来为指定用户进行推荐,具体实现是找到与指定用户最相似的用户,然后获取最相似用户评价过的电影,但当前用户没有评价过的电影,作为推荐结果返回。最后,调用`recommend`函数并打印结果。
阅读全文