协同过滤算法推荐系统
时间: 2023-12-08 16:04:45 浏览: 87
协同过滤算法是一种推荐系统算法,它基于用户历史行为数据,通过计算用户之间的相似度,来预测用户对未知物品的喜好程度。协同过滤算法主要分为两种:基于用户的协同过滤(UserCF)和基于物品的协同过滤(ItemCF)。
基于用户的协同过滤算法(UserCF)是通过计算用户之间的相似度,来预测用户对未知物品的喜好程度。具体来说,对于一个目标用户,找到和他兴趣相似的其他用户,然后将这些用户喜欢的物品推荐给目标用户。但是,UserCF算法存在两个缺陷:一是用户数目很大时,计算用户之间的相似度非常耗时;二是UserCF算法存在“热门物品”和“长尾物品”问题,即只推荐热门物品或者只推荐长尾物品。
基于物品的协同过滤算法(ItemCF)是通过计算物品之间的相似度,来预测用户对未知物品的喜好程度。具体来说,对于一个目标用户,找到他喜欢的物品,然后找到和这些物品相似的其他物品,将这些相似的物品推荐给目标用户。相比于UserCF算法,ItemCF算法具有计算复杂度低、推荐结果多样性高等优点,因此被广泛应用于推荐系统中。
下面是一个基于物品的协同过滤算法的示例代码:
```python
# 假设有5个用户,4个物品
data = [
[5, 3, 0, 1],
[4, 0, 4, 1],
[1, 1, 5, 5],
[1, 4, 1, 4],
[0, 3, 4, 5]
]
# 计算物品之间的相似度
def item_similarity(data):
item_num = len(data[0])
sim_matrix = [[0 for _ in range(item_num)] for _ in range(item_num)]
for i in range(item_num):
for j in range(i+1, item_num):
item_sim = sum([1 for user_rating in data if user_rating[i]>0 and user_rating[j]>0]) # 计算同时评价物品i和物品j的用户数
if item_sim > 0:
sim_matrix[i][j] = sim_matrix[j][i] = item_sim / (sum([pow(user_rating[i]-user_rating[j], 2) for user_rating in data if user_rating[i]>0 and user_rating[j]>0]) ** 0.5) # 计算物品i和物品j的相似度
return sim_matrix
# 给用户推荐物品
def recommend(data, user_id, sim_matrix):
item_num = len(data[0])
user_rating = data[user_id]
scores = [0 for _ in range(item_num)]
sim_scores = [0 for _ in range(item_num)]
for i in range(item_num):
if user_rating[i] == 0:
for j in range(item_num):
if user_rating[j] > 0:
scores[i] += sim_matrix[i][j] * user_rating[j] # 计算物品i的得分
sim_scores[i] += sim_matrix[i][j] # 计算物品i的相似度之和
rankings = [(score/sim_scores[i], i) for i, score in enumerate(scores) if sim_scores[i] > 0] # 计算物品的得分除以相似度之和,得到最终的推荐结果
rankings.sort(reverse=True)
return rankings
# 示例
sim_matrix = item_similarity(data)
print(recommend(data, 0, sim_matrix)) # 给用户0推荐物品
```
阅读全文