基于物品的协同过滤代码开源
时间: 2024-05-03 18:17:58 浏览: 25
以下是一个基于物品的协同过滤的 Python 代码示例:
```python
import numpy as np
# 创建用户-物品评分矩阵
ratings = np.array([
[3, 1, 2, 3],
[4, 3, 4, 3],
[3, 2, 1, 5],
[1, 6, 5, 2],
[5, 4, 3, 4]
])
# 计算物品之间的相似度
item_sim = np.zeros((ratings.shape[1], ratings.shape[1]))
for i in range(item_sim.shape[0]):
for j in range(i+1, item_sim.shape[1]):
item_sim[i][j] = np.dot(ratings[:,i], ratings[:,j]) / (np.linalg.norm(ratings[:,i]) * np.linalg.norm(ratings[:,j]))
item_sim[j][i] = item_sim[i][j]
# 预测用户对未评分物品的评分
def predict(ratings, item_sim, user_id, item_id):
# 找到用户已评分的物品
rated_items = np.where(ratings[user_id,:] > 0)[0]
# 如果该用户没有评分任何物品,则返回平均评分
if len(rated_items) == 0:
return np.mean(ratings[:,item_id])
# 计算用户对已评分物品的相似度加权平均评分
ratings_avg = np.mean(ratings[user_id,rated_items])
sim_sum = 0
rating_sum = 0
for item in rated_items:
sim_sum += item_sim[item_id][item]
rating_sum += (ratings[user_id][item] - np.mean(ratings[:,item])) * item_sim[item_id][item]
if sim_sum == 0:
return ratings_avg
else:
return ratings_avg + rating_sum / sim_sum
# 预测用户对所有未评分物品的评分
def recommend(ratings, item_sim, user_id):
predicted_ratings = np.zeros(ratings.shape[1])
for item_id in range(ratings.shape[1]):
if ratings[user_id][item_id] == 0:
predicted_ratings[item_id] = predict(ratings, item_sim, user_id, item_id)
return predicted_ratings
# 示例:预测用户 0 对物品 3 的评分
print(predict(ratings, item_sim, 0, 3))
# 示例:预测用户 0 对所有未评分物品的评分
print(recommend(ratings, item_sim, 0))
```
这个例子中,我们首先创建了一个用户-物品评分矩阵 `ratings`。接下来,我们计算物品之间的相似度矩阵 `item_sim`。然后,我们定义了一个函数 `predict`,用于预测用户对一个未评分物品的评分,以及一个函数 `recommend`,用于预测用户对所有未评分物品的评分。最后,我们可以使用这些函数来预测用户对物品的评分,或者推荐用户可能感兴趣的物品。
请注意,这只是一个简单的示例,实际中的基于物品的协同过滤算法可能更加复杂和精细。