协同过滤(Collaborative Filtering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型:
1. 用户基协同过滤(User-based Collaborative Filtering):
这种方法通过找到与目标用户兴趣相似的其他用户,然后推荐这些相似用户喜欢的物品给目标用户。它依赖于用户之间的相似度计算,通常使用评分数据来确定用户之间的相似性。例如,如果用户A和用户B对多个物品的评分很相似,那么用户A喜欢的物品很可能也会被用户B喜欢。2. 物品基协同过滤(Item-based Collaborative Filtering):
这种方法通过分析用户对物品的评分,找出相似的物品,然后将这些相似物品推荐给用户。它依赖于物品之间的相似度计算,通常也是基于用户的评分数据。例如,如果物品X和物品Y经常被相似的用户评分,那么喜欢物品X的用户也可能会喜欢物品Y。
协同过滤算法的关键在于如何准确计算用户或物品之间的相似度。常用的相似度计算方法包括:
- 皮尔逊相关系数(Pearson Correlation):衡量两个用户或物品评分向量之间的线性相关性。
- 余弦相似度(Cosine Similarity):通过计算两个评分向量的夹角的余弦值来衡量相似度,对评分尺度不敏感。
- 欧几里得距离(Euclidean Distance):衡量两个评分向量在多维空间中的直线距离。
一:用户基协同过滤
实现用户基协同过滤(User-Based Collaborative Filtering)的实例通常涉及以下步骤:
- 数据收集:收集用户对项目的评分数据。
- 用户相似度计算:计算用户之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
- 邻居选择:根据相似度选择与目标用户最相似的邻居用户。
- 推荐生成:根据邻居用户的评分预测目标用户对未评分项目的评分,并生成推荐列表。
为了展示这一过程,将使用一个简化的示例。假设我们有以下用户对电影的评分数据:
用户/电影 | 电影1 | 电影2 | 电影3 | 电影4 |
---|---|---|---|---|
用户1 | 5 | 4 | 3 | 2 |
用户2 | 4 | 5 | 2 | 1 |
用户3 | 3 | 3 | 5 | 4 |
用户4 | 2 | 1 | 4 | 5 |
我们将计算用户之间的相似度,并选择与用户1最相似的邻居,然后预测用户1对电影4的评分。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 评分数据
ratings = np.array([
[5, 4, 3, 2],
[4, 5, 2, 1],
[3, 3, 5, 4],
[2, 1, 4, 5]
])
# 计算用户之间的余弦相似度
user_similarity = cosine_similarity(ratings)
user_similarity
结果如下:
我们计算了用户之间的余弦相似度,得到了一个相似度矩阵。例如,用户1和用户2之间的相似度为0.963,用户1和用户3之间的相似度为0.886,依此类推。
接下来,我们将选择与用户1最相似的邻居用户,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(用户2)。
预测用户1对电影4的评分的公式为:
预测评分 = 用户1的平均评分 + 相似度 × (用户2对电影4的评分 − 用户2的平均评分)
现在,我将计算用户1对电影4的预测评分。
# 计算用户平均评分
user_means = np.mean(ratings, axis=1)
# 用户1和用户2的相似度
similarity_user1_user2 = user_similarity[0, 1]
# 用户2对电影4的评分
rating_user2_movie4 = ratings[1, 3]
# 用户2的平均评分
mean_user2 = user_means[1]
# 用户1的平均评分
mean_user1 = user_means[0]
# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_user1_user2 * (rating_user2_movie4 - mean_user2)
predicted_rating_user1_movie4
根据计算,用户1对电影4的预测评分约为1.57。这意味着基于用户之间的相似度,我们预测用户1可能不会特别喜欢电影4,因为该评分低于用户1的平均评分。
二:物品基协同过滤
实现物品基协同过滤(Item-Based Collaborative Filtering)的实例通常涉及以下步骤:
- 数据收集:收集用户对项目的评分数据。
- 物品相似度计算:计算物品之间的相似度,常用的方法有余弦相似度、皮尔逊相关系数等。
- 邻居选择:根据相似度选择与目标物品最相似的邻居物品。
- 推荐生成:根据邻居物品的评分预测目标用户对未评分项目的评分,并生成推荐列表。
为了展示这一过程,我将仍然使用以上用户对电影的评分数据。同理可得:
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 评分数据
ratings = np.array([
[5, 4, 3, 2],
[4, 5, 2, 1],
[3, 3, 5, 4],
[2, 1, 4, 5]
])
# 计算电影之间的余弦相似度
item_similarity = cosine_similarity(ratings.T)
item_similarity
结果如下:
我们计算了电影之间的余弦相似度,得到了一个相似度矩阵。例如,电影1和电影2之间的相似度为0.972,电影1和电影3之间的相似度为0.852,依此类推。
接下来,我们将选择与电影1最相似的邻居电影,并使用这些邻居的评分来预测用户1对电影4的评分。为了简化,我们这里只选择一个最相似的邻居(电影2)。
预测用户1对电影4的评分的公式为:
预测评分 = 用户1的平均评分 + 相似度 × (用户1对电影2的评分 − 电影2的平均评分)
现在,我将计算用户1对电影4的预测评分。
# 计算电影平均评分
item_means = np.mean(ratings, axis=0)
# 电影1和电影2的相似度
similarity_movie1_movie2 = item_similarity[0, 1]
# 用户1对电影2的评分
rating_user1_movie2 = ratings[0, 1]
# 电影2的平均评分
mean_movie2 = item_means[1]
# 用户1的平均评分
mean_user1 = np.mean(ratings[0, :])
# 预测用户1对电影4的评分
predicted_rating_user1_movie4 = mean_user1 + similarity_movie1_movie2 * (rating_user1_movie2 - mean_movie2)
predicted_rating_user1_movie4
根据计算,用户1对电影4的预测评分约为4.23。这意味着基于电影之间的相似度,我们预测用户1可能会比较喜欢电影4,因为该评分高于用户1的平均评分。