协同过滤:基于用户与基于物品
用户相似度、物品相似度、邻域方法,以及用于评分的余弦相似度。
协同过滤:基于用户与基于物品 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
什么是协同过滤
协同过滤(CF)通过学习许多用户的行为来推荐项目。其核心思想是:过去偏好相同的人,未来往往也会偏好相同的内容。它不需要项目描述,只需要交互历史。
用户-项目矩阵
CF 从用户-项目矩阵开始:行表示用户,列表示项目,每个单元格存储评分(如果用户未评分则为空)。由于每个用户只会评价少数项目,这个矩阵通常非常稀疏。
import pandas as pd
matrix = ratings.pivot_table(
index="user_id", columns="item_id", values="rating"
)CF 的两种类型
- 基于用户:寻找与您相似的用户,推荐他们喜欢的内容。
- 基于项目:寻找与您喜欢的项目相似的项目,并推荐这些项目。
两种方法都依赖于行(用户)或列(项目)之间的相似度度量。
余弦相似度
余弦相似度衡量两个评分向量之间的角度,而不考虑向量的大小。接近 1 的值表示品味非常相似,接近 0 的值表示彼此无关。
from sklearn.metrics.pairwise import cosine_similarity
filled = matrix.fillna(0)
user_sim = cosine_similarity(filled) # user x user基于用户的预测
要预测您对某个项目的评分,可以对相似用户给出的评分进行加权平均,权重取决于相似度。相似度越高的邻居,影响越大。
预测公式
预测评分 = 对评价过该项目的邻居计算 sum(相似度 * 邻居评分) / sum(相似度)。先减去每个用户的平均评分(进行均值中心化),可以修正某些用户通常评分偏高或偏低的问题。
import numpy as np
def predict(sims, ratings_for_item):
mask = ~np.isnan(ratings_for_item)
if sims[mask].sum() == 0:
return np.nan
return np.dot(sims[mask], ratings_for_item[mask]) / sims[mask].sum()选择邻居(k)
不要使用所有用户,而只保留相似度最高的前 k 个邻居。这样可以减少不相似用户带来的噪声,并加快预测速度。k 是一个可调节的超参数。
基于项目的相似度
基于项目的 CF 计算的是项目列之间的相似度,而不是用户行之间的相似度。它会推荐与用户已经喜欢的项目最相似的项目。
item_sim = cosine_similarity(filled.T) # item x item为什么基于项目的方法更稳定
项目之间的关系变化缓慢:两部电影之间的相似度通常会保持大致不变。用户的品味和用户群体变化得更快。因此,可以预先计算项目之间的相似度并重复使用,从而提供更稳定、可扩展的推荐,这也是亚马逊当年著名地偏好这种方法的原因。
冷启动问题
对于尚无评分的新用户或新项目,CF 很难发挥作用,因为没有可供比较的信息。常见的解决方法包括请新用户先提供一些评分,或退回到基于内容的方法(稍后介绍)。
生成推荐
为用户计算每个未评分项目的得分,按降序排列,然后返回排名前 N 的项目作为推荐结果。
scores = {item: predict_for(user, item)
for item in unrated_items(user)}
top_n = sorted(scores, key=scores.get, reverse=True)[:10]快速检查
请测试您对协同过滤的掌握程度。
回顾
您基于用户-项目矩阵构建了 CF,计算了余弦相似度,将评分预测为邻居相似度的加权平均,并了解了为什么基于项目的 CF 比基于用户的方法更稳定。下一部分:使用 SVD 进行矩阵分解。
常见问题解答
「协同过滤:基于用户与基于物品」课时是免费的吗?
是的 — 「协同过滤:基于用户与基于物品」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「协同过滤:基于用户与基于物品」这节课中我会学到什么?
用户相似度、物品相似度、邻域方法,以及用于评分的余弦相似度。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「协同过滤:基于用户与基于物品」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 协同过滤:基于用户与基于物品
- 使用 SVD 进行矩阵分解
- 基于内容的过滤
- 混合系统与评估指标