请用python写基于用户的协同过滤算法
时间: 2023-06-11 07:07:08 浏览: 50
好的,以下是基于用户的协同过滤算法的Python代码:
```python
import numpy as np
# 创建用户评分矩阵
user_ratings = np.array([
[5, 3, 0, 1, 4, 2],
[1, 0, 5, 4, 2, 1],
[2, 3, 1, 2, 0, 5],
[5, 4, 3, 0, 1, 2],
[2, 0, 3, 4, 1, 5]
])
# 计算用户之间的相似度
def similarity(user1, user2):
# 找到两个用户都评价过的电影
common_ratings = np.intersect1d(np.nonzero(user1), np.nonzero(user2))
if len(common_ratings) == 0:
# 如果没有共同评价过的电影,相似度为 0
return 0
# 计算两个用户共同评价过的电影的评分差的平方和
squared_diffs = np.sum(np.square(user1[common_ratings] - user2[common_ratings]))
# 相似度 = 1 / (1 + 平方差的平均值)
return 1 / (1 + np.sqrt(squared_diffs / len(common_ratings)))
# 计算所有用户之间的相似度
num_users = user_ratings.shape[0]
user_sims = np.zeros((num_users, num_users))
for i in range(num_users):
for j in range(i+1, num_users):
user_sims[i,j] = similarity(user_ratings[i], user_ratings[j])
user_sims[j,i] = user_sims[i,j]
# 预测用户对电影的评分
def predict_rating(user_ratings, user_sims, movie):
# 找到所有评价过电影的用户
raters = np.where(user_ratings[:,movie] > 0)[0]
if len(raters) == 0:
# 如果没有用户评价过这部电影,返回 0
return 0
# 计算这些用户对电影的加权评分平均值
weights = user_sims[:,raters]
ratings = user_ratings[raters,movie]
return np.dot(weights, ratings) / np.sum(weights)
# 预测用户对电影的评分并打印出来
movie = 2
predicted_rating = predict_rating(user_ratings, user_sims, movie)
print("预测用户对电影 %d 的评分为 %.2f" % (movie, predicted_rating))
```
这个代码中,我们首先创建了一个用户评分矩阵,然后定义了一个 `similarity` 函数来计算两个用户之间的相似度。接着我们计算了所有用户之间的相似度,并定义了一个 `predict_rating` 函数来预测用户对电影的评分。最后我们使用这个函数预测了用户对电影 2 的评分,并打印出来。