python协同过滤代码
时间: 2023-07-02 11:22:35 浏览: 111
下面是一个基于物品的协同过滤推荐的 Python 代码示例:
```python
import numpy as np
# 评分矩阵,每行是一个用户的评分向量,每列是一个物品
ratings = np.array([[5, 3, 0, 1],
[4, 0, 4, 0],
[1, 1, 0, 5],
[0, 0, 4, 4]])
# 计算物品之间的相似度
def sim(i, j):
mask = np.logical_and(ratings[:, i] > 0, ratings[:, j] > 0)
if np.sum(mask) == 0:
return 0
u = ratings[:, i][mask]
v = ratings[:, j][mask]
return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
sim_mat = np.zeros((ratings.shape[1], ratings.shape[1]))
for i in range(ratings.shape[1]):
for j in range(i+1, ratings.shape[1]):
sim_mat[i,j] = sim(i, j)
sim_mat[j,i] = sim_mat[i,j]
# 预测用户对物品的评分
def predict(ratings, sim_mat, user_id, item_id):
mask = ratings[user_id] > 0
sim_vec = sim_mat[item_id, mask]
rating_vec = ratings[user_id][mask]
if len(sim_vec) == 0:
return 0
return np.dot(sim_vec, rating_vec) / np.sum(sim_vec)
# 为用户推荐物品
def recommend(ratings, sim_mat, user_id, top_k=5):
scores = []
for i in range(ratings.shape[1]):
if ratings[user_id, i] == 0:
scores.append((i, predict(ratings, sim_mat, user_id, i)))
scores.sort(reverse=True, key=lambda x: x[1])
return [x[0] for x in scores[:top_k]]
# 测试
print(recommend(ratings, sim_mat, 0, top_k=2))
```
以上代码假设评分矩阵是一个 $m \times n$ 的矩阵,其中第 $i$ 行表示第 $i$ 个用户对 $n$ 个物品的评分,每个评分都是一个非负整数。`sim` 函数计算两个物品之间的相似度,采用余弦相似度。`sim_mat` 是一个 $n \times n$ 的相似度矩阵,其中第 $i$ 行第 $j$ 列表示第 $i$ 个物品和第 $j$ 个物品之间的相似度。`predict` 函数根据相似度矩阵预测用户对物品的评分,采用加权平均的方法,只考虑该用户已经评分的物品和该物品相似度大于零的其他物品对该用户的评分。`recommend` 函数根据预测评分为用户推荐物品,返回一个物品编号列表。
阅读全文