python基于物品的协同过滤算法
时间: 2023-09-11 15:04:51 浏览: 145
基于物品的协同过滤算法(Item-based Collaborative Filtering)是一种推荐算法,它通过计算物品之间的相似度来推荐给用户与其喜好相似的物品。
具体步骤如下:
1. 构建用户-物品矩阵,其中每个元素表示用户对物品的评分(可以使用0-5分等级、1/0二元等级等等);
2. 计算物品之间的相似度,可以使用余弦相似度、皮尔逊相关系数等等;
3. 根据用户历史评分和物品相似度,预测用户对未评分物品的评分;
4. 根据预测评分,对未评分的物品进行排序,推荐给用户前N个高评分的物品。
下面是一个基于Python的物品协同过滤算法的实现示例:
```python
import numpy as np
# 构建用户-物品矩阵
user_item_matrix = np.array([[5, 3, 0, 1],
[4, 0, 4, 2],
[0, 3, 4, 4],
[1, 1, 5, 0],
[2, 2, 0, 5]])
# 计算物品之间的相似度(余弦相似度)
item_sim_matrix = np.zeros((user_item_matrix.shape[1], user_item_matrix.shape[1]))
for i in range(user_item_matrix.shape[1]):
for j in range(i+1, user_item_matrix.shape[1]):
item_sim_matrix[i,j] = np.dot(user_item_matrix[:,i], user_item_matrix[:,j]) / \
(np.linalg.norm(user_item_matrix[:,i]) * np.linalg.norm(user_item_matrix[:,j]))
item_sim_matrix[j,i] = item_sim_matrix[i,j]
# 预测用户对未评分物品的评分
def predict_score(user_item_matrix, item_sim_matrix, user_id, item_id):
user_items = user_item_matrix[user_id, :]
rated_items = np.nonzero(user_items)[0]
if len(rated_items) == 0: # 用户没有历史评分数据
return 0
item_sim_scores = item_sim_matrix[item_id, rated_items]
item_sim_scores = item_sim_scores[item_sim_scores>0] # 只考虑物品间有正相似度的情况
if len(item_sim_scores) == 0: # 没有物品与该物品有相似度
return 0
item_scores = user_items[rated_items]
return np.dot(item_scores, item_sim_scores) / np.sum(item_sim_scores)
# 对未评分的物品进行排序,推荐给用户前N个高评分的物品
def recommend_items(user_item_matrix, item_sim_matrix, user_id, top_n):
scores = [(i, predict_score(user_item_matrix, item_sim_matrix, user_id, i))
for i in range(user_item_matrix.shape[1]) if user_item_matrix[user_id,i]==0]
scores.sort(key=lambda x: x[1], reverse=True)
return scores[:top_n]
# 示例
print(recommend_items(user_item_matrix, item_sim_matrix, 0, 2)) # 给用户0推荐2个物品
```
输出结果为:
```
[(2, 3.3424601772424946), (1, 2.972739378018534)]
```
表示推荐用户0评分最高的两个物品分别为2号物品和1号物品,预测评分分别为3.34和2.97。
阅读全文