用python实现基于用户的协同过滤算法
时间: 2023-10-20 17:11:58 浏览: 49
好的,基于用户的协同过滤算法可以分为以下几个步骤:
1. 数据处理,将用户和物品转化为数字标识,如1、2、3、4等。
2. 构建用户-物品评分矩阵,即将用户对物品的评分存储到一个矩阵中。
3. 计算用户之间的相似度,可以使用余弦相似度或皮尔逊相关系数等。
4. 预测用户对未评分物品的评分,计算方法为:对于用户u和物品i,找出与u最相似的k个用户,计算这k个用户对i的评分的加权平均值,权重为相似度。
5. 推荐物品,根据预测的评分值对用户推荐物品。
下面是一个简单的基于用户的协同过滤算法实现:
```python
import numpy as np
# 原始评分矩阵
R = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
])
# 用户相似度矩阵
sim_matrix = np.zeros((R.shape[0], R.shape[0]))
for i in range(R.shape[0]):
for j in range(i+1, R.shape[0]):
# 计算余弦相似度
sim_matrix[i, j] = np.dot(R[i], R[j]) / (np.linalg.norm(R[i]) * np.linalg.norm(R[j]))
sim_matrix[j, i] = sim_matrix[i, j]
# 预测用户对未评分物品的评分
def predict(u, i, k=3):
# 找出与u最相似的k个用户
sim_users = np.argsort(-sim_matrix[u])[:k]
# 计算加权平均值
rating = np.dot(sim_matrix[u][sim_users], R[sim_users, i]) / np.sum(sim_matrix[u][sim_users])
return rating
# 推荐物品
def recommend(u, k=3):
# 找出用户u未评分的物品
unrated_items = np.where(R[u] == 0)[0]
# 预测用户对未评分物品的评分
ratings = [predict(u, i, k) for i in unrated_items]
# 对预测评分排序,推荐评分最高的物品
recommended_item = unrated_items[np.argmax(ratings)]
return recommended_item
# 测试推荐结果
print(recommend(0, 3))
```
这里的数据是一个5x4的评分矩阵,其中5个用户对4个物品进行评分。首先计算用户之间的相似度,然后对于每个用户,预测他对未评分物品的评分,最后推荐评分最高的物品。