帮我写一个协同过滤算法
时间: 2024-05-12 15:01:42 浏览: 6
协同过滤算法是一种推荐系统算法,其基本思想是通过分析用户的历史行为数据,找到与其兴趣爱好相似的其他用户,从而推荐给该用户他可能感兴趣的物品。
下面是一个简单的协同过滤算法的伪代码:
1. 根据用户历史数据,计算用户之间的相似度矩阵。
2. 对于每个用户,选取与他相似度最高的k个用户。
3. 对于每个用户未评分的物品,预测该用户对该物品的评分值。
4. 根据预测的评分值,给用户推荐未评分的物品。
其中,相似度矩阵的计算可以使用余弦相似度、皮尔逊相关系数等方法。对于预测评分值的计算,可以使用加权平均、基于邻居的加权平均等方法。
下面是一个示例代码:
```python
import numpy as np
# 构造用户历史评分矩阵
ratings = np.array([[5, 3, 0, 1],
[4, 0, 4, 2],
[0, 2, 5, 2],
[1, 5, 0, 4]])
# 计算用户之间的相似度矩阵
similarity = np.zeros((4, 4))
for i in range(4):
for j in range(4):
if i == j:
similarity[i, j] = 1.0
else:
mask = (ratings[i] > 0) & (ratings[j] > 0)
if np.sum(mask) > 0:
similarity[i, j] = np.dot(ratings[i][mask], ratings[j][mask]) / \
(np.linalg.norm(ratings[i][mask]) * np.linalg.norm(ratings[j][mask]))
# 选取与每个用户相似度最高的k个用户
k = 2
top_k_similar_users = np.zeros((4, k))
for i in range(4):
top_k_similar_users[i] = np.argsort(-similarity[i])[:k]
# 预测每个用户未评分物品的评分值
predicted_ratings = np.zeros((4, 4))
for i in range(4):
for j in range(4):
if ratings[i, j] == 0:
mask = (ratings[top_k_similar_users[i].astype(int), j] > 0)
if np.sum(mask) > 0:
predicted_ratings[i, j] = np.dot(similarity[i][top_k_similar_users[i].astype(int)][mask],
ratings[top_k_similar_users[i].astype(int), j][mask]) / \
np.sum(similarity[i][top_k_similar_users[i].astype(int)][mask])
# 给每个用户推荐未评分的物品
recommendations = np.zeros((4, 4))
for i in range(4):
mask = (ratings[i] == 0)
recommendations[i] = np.argsort(-predicted_ratings[i])[mask]
```
以上是一个简单的协同过滤算法示例,实际应用中需要根据具体场景进行调整和优化。