趋近智
生成个性化推荐需要使用向量 (vector)化的物品画像和聚合后的用户画像。其目标是将用户画像向量中包含的推断偏好与整个物品库向量进行匹配。这一过程可以有效地识别并排列出与用户历史口味最契合的物品。
其核心目标是计算用户画像向量 (vector)与每个物品画像向量之间的相似度得分。该得分衡量了每个物品与用户已习得偏好的匹配程度。随后,我们可以根据该得分对物品进行排序,从而生成个性化列表。
该过程可以分为四个主要步骤:
下图展示了从用户和物品画像到最终排序推荐列表的数据流向。
该工作流将用户的偏好向量和完整的物品矩阵作为输入,最终为该用户生成一份简短的、按顺序排列的新物品列表。
由于用户画像和物品画像都存在于同一个向量 (vector)空间中,我们可以再次使用余弦相似度来衡量它们的匹配程度。用户画像与物品画像之间较高的余弦相似度得分表明,该物品的特征与用户之前喜欢的物品特征高度吻合。
假设你有一个用户画像向量 user_profile,以及所有物品的 TF-IDF 矩阵 tfidf_matrix。我们可以使用 scikit-learn 的 cosine_similarity 函数来高效地完成这项计算。该函数需要两个类似数组的输入,因此我们将用户画像向量重塑为只有一行的二维数组。
from sklearn.metrics.pairwise import cosine_similarity
# 假设 user_profile 是一个代表用户口味的一维 NumPy 数组
# 假设 tfidf_matrix 是来自 TF-IDF 的 (物品数 x 特征数) 矩阵
# 将 user_profile 重塑为 (1, n_features) 以确保兼容性
user_profile_reshaped = user_profile.reshape(1, -1)
# 计算用户与所有物品之间的余弦相似度
user_item_scores = cosine_similarity(user_profile_reshaped, tfidf_matrix)
# 结果是一个二维数组,我们将其展平为一维得分数组
similarity_scores = user_item_scores.flatten()
print(similarity_scores.shape)
# (n_items,)
得到的 similarity_scores 是一个数组,其中索引 处的每个元素对应于用户与原始数据集中索引 处物品之间的相似度得分。
计算完得分后,下一步是将这个原始数组转换为可用的排序列表。我们将使用 pandas 来完成这一步,因为它简化了将得分与物品标题关联、过滤和排序的过程。
首先,让我们创建一个包含物品标题及其对应相似度得分的 DataFrame。
import pandas as pd
# 假设 'movies_df' 是包含电影标题的原始 DataFrame
recommendation_df = pd.DataFrame({
'title': movies_df['title'],
'score': similarity_scores
})
接下来,我们必须过滤掉用户已经看过的物品。假设我们有一个名为 items_seen_by_user 的标题列表。我们可以使用 pandas 的 isin 方法来排除它们。
# 用户已经给出正面评价的电影标题列表
items_seen_by_user = ["The Dark Knight", "Inception", "The Prestige"]
# 过滤掉已看物品
unseen_recommendations = recommendation_df[
~recommendation_df['title'].isin(items_seen_by_user)
]
~ 运算符会反转布尔掩码,从而选择标题 不在 items_seen_by_user 列表中的所有行。
最后,我们按照 score 列对过滤后的 DataFrame 进行降序排序,并选择前 N 个物品。
# 按得分排序并获取前 10 个推荐物品
top_10_recommendations = unseen_recommendations.sort_values(
by='score', ascending=False
).head(10)
print(top_10_recommendations)
输出结果如下所示:
| title | score | |
|---|---|---|
| 50 | The Dark Knight Rises | 0.954 |
| 27 | Batman Begins | 0.921 |
| 119 | Memento | 0.887 |
| 95 | Interstellar | 0.852 |
| ... | ... | ... |
这个最终的排序列表就是我们基于内容的推荐系统的输出。它根据与用户过去偏好的相似度量化 (quantization)指标,向用户展示最相关的物品。从特征提取到生成排序列表的整个过程,构成了一个完整基于内容过滤系统的架构。在接下来的实操环节中,你将从头到尾实现这一流程。
这部分内容有帮助吗?
sklearn.metrics.pairwise.cosine_similarity, scikit-learn developers, 2024 - scikit-learn中用于计算余弦相似度的函数官方文档,提供使用示例和技术细节。© 2026 ApX Machine LearningAI伦理与透明度•