协同过滤算法的代码
时间: 2023-08-06 10:14:50 浏览: 35
协同过滤算法是一种常用的推荐算法,下面是一个基于用户的协同过滤算法的代码示例:
```python
# 假设已经有了用户对物品的评分矩阵 ratings
# 计算用户之间的相似度
def sim_user(users, user1, user2):
# 获取两个用户都评分过的物品
items = {}
for item in users[user1]:
if item in users[user2]:
items[item] = 1
# 如果两个用户没有共同评分的物品,则相似度为0
if len(items) == 0:
return 0
# 计算两个用户的欧几里得距离
sum_of_squares = sum([pow(users[user1][item] - users[user2][item], 2)
for item in items])
return 1 / (1 + sqrt(sum_of_squares))
# 获取与指定用户最相似的k个用户
def top_k_sim_users(users, user, k=5):
scores = [(sim_user(users, user, other_user), other_user)
for other_user in users if other_user != user]
# 按相似度从大到小排序
scores.sort()
scores.reverse()
return scores[:k]
# 基于用户的协同过滤算法
def user_cf_recommend(users, user):
# 获取与指定用户最相似的k个用户
sim_users = top_k_sim_users(users, user)
# 计算每个未评分物品的评分
recommendations = {}
for sim, other_user in sim_users:
for item in users[other_user]:
if item not in users[user]:
weight = sim * users[other_user][item]
if item in recommendations:
sim_total, weight_total = recommendations[item]
recommendations[item] = (sim_total + sim, weight_total + weight)
else:
recommendations[item] = (sim, weight)
# 按评分从大到小排序并返回推荐列表
scores = [(score[1] / score[0], item) for item, score in recommendations.items()]
scores.sort()
scores.reverse()
return [item for _, item in scores]
```
这段代码中,`users` 是一个字典,键是用户ID,值是另一个字典,键是物品ID,值是用户对该物品的评分。`sim_user` 函数计算两个用户之间的相似度,使用欧几里得距离作为相似度的度量。`top_k_sim_users` 函数获取与指定用户最相似的k个用户,使用相似度作为排序的依据。`user_cf_recommend` 函数实现基于用户的协同过滤算法,首先获取与指定用户最相似的k个用户,然后计算每个未评分物品的评分,最后按评分从大到小排序并返回推荐列表。