举例解释下协同过滤算法的代码
时间: 2024-05-06 21:21:41 浏览: 147
协同过滤算法是一种常见的推荐算法,它通过分析用户历史行为来推荐其可能感兴趣的物品。其具体实现通常涉及两种方法:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤算法的代码实现如下:
首先,建立用户与物品的评分矩阵。对于用户 i 和物品 j,如果用户 i 已经对物品 j 进行了评分,则记录其评分值 r(i,j);否则,该位置为空。
```
rating_matrix = {user1: {item1: 3.0, item3: 4.0},
user2: {item1: 2.0, item2: 3.5, item3: 5.0},
user3: {item2: 2.0, item3: 3.5},
user4: {item1: 5.0, item2: 4.5, item3: 5.0}}
```
接下来,对于用户 i,可以计算其与其他用户之间的相似度。常见的相似度计算方法包括欧几里得距离、余弦相似度等。
```
from math import sqrt
def euclidean_distance(user1, user2):
intersection = set(user1.keys()) & set(user2.keys())
if len(intersection) == 0:
return 0
distance = sqrt(sum([(user1[item] - user2[item]) ** 2 for item in intersection]))
return 1 / (1 + distance)
def cosine_similarity(user1, user2):
intersection = set(user1.keys()) & set(user2.keys())
if len(intersection) == 0:
return 0
dot_product = sum([user1[item] * user2[item] for item in intersection])
norm_1 = sqrt(sum([user1[item] ** 2 for item in user1.keys()]))
norm_2 = sqrt(sum([user2[item] ** 2 for item in user2.keys()]))
return dot_product / (norm_1 * norm_2)
similarity_matrix = {user1: {user2: euclidean_distance(rating_matrix[user1], rating_matrix[user2])
for user2 in rating_matrix if user2 != user1}
for user1 in rating_matrix}
```
最后,对于每个用户 i,可以基于其与其他用户的相似度,为其推荐物品。常见的方法有基于邻居的推荐、基于加权邻居的推荐、基于 SVD 的推荐等。
```
def recommend_items(user, n=5):
items_user_has_rated = set(rating_matrix[user].keys())
scores = {item: sum([similarity_matrix[user][other_user] * rating_matrix[other_user].get(item, 0)
for other_user in similarity_matrix[user] if other_user != user])
for item in set(item for other_user in similarity_matrix[user] if other_user != user
for item in rating_matrix[other_user]
if item not in items_user_has_rated)}
top_n_items = [(item, score) for item, score in sorted(scores.items(), key=lambda x: x[1], reverse=True)][:n]
return top_n_items
recommend_items(user="user1", n=5)
```
以上代码为基于用户的协同过滤算法的实现,代码通过评分矩阵、相似度矩阵等完成了推荐物品的流程。
阅读全文