0Pricing
Learn AI with Python · 课时

使用 SVD 进行矩阵分解

用户-物品矩阵、SVD 分解、潜在因子,以及 Surprise 库的实现。

使用 SVD 进行矩阵分解 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

为什么使用矩阵分解

用户-项目矩阵规模庞大,而且大部分位置为空。矩阵分解会将它压缩为两个更小的潜在因子矩阵,一个表示用户,一个表示项目;两个矩阵相乘后可以重构并补全评分。与基于邻居的方法相比,这种方法能更好地处理稀疏性。

潜在因子的直观理解

每个用户和项目都由一个包含少量隐藏特征的短向量描述(例如,电影的动作性或喜剧性)。预测评分是用户向量与项目向量的点积,这些向量完全通过数据学习得到。

推荐中的 SVD

SVD 类模型通过在已知评分上最小化预测误差并加入正则化来学习这些因子。surprise 库提供了一个开箱即用的、针对推荐任务优化的 SVD,该方法因 Netflix Prize 而广为人知。

Surprise 库

请导入所需的组件:算法、数据集包装器,以及用于描述数据格式的读取器。

from surprise import SVD, Dataset, Reader
from surprise.model_selection import cross_validate

读取器与评分范围

读取器通过评分范围告诉 Surprise 有效的评分区间。请使其与您的数据匹配(例如 1 到 5 星),否则预测结果的校准会不准确。

reader = Reader(rating_scale=(1, 5))

加载 DataFrame

加载一个恰好包含三列且顺序固定的 DataFrame:用户、项目、评分。

data = Dataset.load_from_df(
    df[["user_id", "item_id", "rating"]],
    reader
)

交叉验证

cross_validate 会在多个折叠上评估模型,并报告误差指标,以便您根据留出数据诚实地判断模型的准确性。

results = cross_validate(
    SVD(), data,
    measures=["RMSE", "MAE"],
    cv=5,
    verbose=True
)

RMSE 与 MAE

  • RMSE(均方根误差)会大幅惩罚较大的误差。
  • MAE(平均绝对误差)表示预测偏差绝对值的平均值,更容易解释。

这两项指标都是越低越好;RMSE 是评分预测中最常用的主要指标。

在完整数据集上训练

完成验证后,请在提供预测服务之前使用完整数据集训练模型。

trainset = data.build_full_trainset()
algo = SVD()
algo.fit(trainset)

生成预测结果

algo.predict(uid, iid) 会返回一个预测对象,其 .est 字段就是该用户-项目组合的估计评分。

pred = algo.predict(uid="user_42", iid="item_99")
print(pred.est)  # estimated rating

调优超参数

SVD 的关键参数包括 n_factors(潜在维度)、n_epochs、lr_all(学习率)和 reg_all(正则化)。请使用 GridSearchCV 根据 RMSE 找到最佳组合。

from surprise.model_selection import GridSearchCV

grid = {"n_factors": [50, 100], "reg_all": [0.02, 0.1]}
gs = GridSearchCV(SVD, grid, measures=["rmse"], cv=3)
gs.fit(data)
print(gs.best_params["rmse"])

快速检查

请测试您对矩阵分解的掌握程度。

回顾

您通过 SVD 学习了矩阵分解:利用潜在的用户向量和项目向量,通过二者的点积预测评分。使用 surprise 时,您设置了评分范围,加载了数据,使用 cross_validate 和 RMSE/MAE 进行了验证,执行了 fit,并调用了 algo.predict(uid, iid)。下一部分:基于内容的过滤。

常见问题解答

「使用 SVD 进行矩阵分解」课时是免费的吗?

是的 — 「使用 SVD 进行矩阵分解」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「使用 SVD 进行矩阵分解」这节课中我会学到什么?

用户-物品矩阵、SVD 分解、潜在因子,以及 Surprise 库的实现。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 SVD 进行矩阵分解」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

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