0Pricing
Learn AI with Python · 课时

协同过滤:基于用户与基于物品

用户相似度、物品相似度、邻域方法,以及用于评分的余弦相似度。

协同过滤:基于用户与基于物品 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 协同过滤:基于用户与基于物品
  2. 使用 SVD 进行矩阵分解
  3. 基于内容的过滤
  4. 混合系统与评估指标
← 返回 Learn AI with Python