协同过滤模拟器 返回
机器学习

协同过滤模拟器

电商网站中"购买了此商品的用户还购买了"推荐功能背后的推荐算法——协同过滤的体验工具。改变评分矩阵、邻域数、相似度指标,实时了解基于用户的协同过滤如何预测某位用户对未评过商品的评分、谁会成为"趣味相近的用户"。

参数设置
用户数
评分矩阵的行数(虚拟用户)
物品数
评分矩阵的列数(虚拟物品)
邻域用户数 k
进行预测投票的"相似用户"人数
相似度指标
用户间"趣味相近程度"的测量方法
评分矩阵稀疏度
%
"未评分(空白)"单元的比例
计算结果
预测评分
实际评分(隐藏的正确答案)
预测误差(绝对值)
最近邻用户的相似度
评分矩阵稀疏度 (%)
预测判定
评分矩阵及用户×物品可视化

行表示用户,列表示物品。单元格的颜色表示评分(1~5),斜纹表示未评分单元。黄框是预测目标单元,蓝框是选中的邻域用户所在的行。

预测误差 vs 邻域数 k
各用户对目标用户的相似度
理论与主要公式

$$\hat r_{u,i}=\bar r_u+\frac{\sum_{v\in N}\text{sim}(u,v)\,(r_{v,i}-\bar r_v)}{\sum_{v\in N}|\text{sim}(u,v)|}$$

用户 $u$ 对物品 $i$ 的预测评分 $\hat r_{u,i}$。$N$ 是对物品 $i$ 有评分的、与用户 $u$ 相似度最高的 $k$ 个用户的集合,$\bar r_u$ 是用户 $u$ 的平均评分。

$$\text{cos}(u,v)=\frac{\sum_{j} r_{u,j}\,r_{v,j}}{\sqrt{\sum_j r_{u,j}^2}\,\sqrt{\sum_j r_{v,j}^2}}$$

余弦相似度。$j$ 遍历 $u$ 和 $v$ 共同评过的物品。两个评分向量的夹角越小,值越接近 1。

$$\text{pear}(u,v)=\frac{\sum_{j}(r_{u,j}-\bar r_u)(r_{v,j}-\bar r_v)}{\sqrt{\sum_j(r_{u,j}-\bar r_u)^2}\,\sqrt{\sum_j(r_{v,j}-\bar r_v)^2}}$$

皮尔逊相关。在减去各用户平均评分后计算相关性,能够补正评分偏高和偏严格的评分习惯差异。

协同过滤概述

🙋
电商网站上常见的"购买了此商品的用户还购买了"推荐,是怎样工作的呢?AI 在读物品内容吗?
🎓
有趣的是,这种"协同过滤"算法根本不看物品内容。电影不看"这是科幻片"、"主演是谁"这些信息,完全不使用。相反,它只用一样东西——"大家过去给出的评分模式"。换句话说,是用集体智慧来做推荐。
🙋
不看内容怎么能知道"给你的推荐"呢?
🎓
简单说就是"找到趣味相近的人,借用他们的意见"。首先,找出过去评分方式与你最相似的人——也就是"趣味相邻的人"。然后,如果那个人对某商品高分评价,就推测你也会喜欢。看左边的评分矩阵。行是用户,列是物品,颜色是评分。黄框标注的单元是"现在要预测的未知评分"。
🙋
明白了!那"趣味相近"具体怎样衡量呢?
🎓
把两个人共同评过的物品列出来,看他们的评分是否一致,用数字表示。代表性的方法是"余弦相似度"——看两个评分向量的夹角。另一个"皮尔逊相关"是先减去各自的平均分再比较,可以补正"所有评分都很高的人"和"评分很严格的人"的习惯差异。左边的下拉框可以切换,你会看到蓝框圈中的邻域用户变化。
🙋
我拖动邻域数 k 的滑块,预测值在变化。k 越大越好吗?
🎓
并非如此。k 是"参与投票的邻域用户人数"。k=1 时只靠最相似的 1 个人决定,如果那个人恰好评分怪异,预测会大幅偏离。k 增大时虽然多数投票更稳定,但不那么相似的人也加入投票,预测变得模糊。在实务中,通过交叉验证找到预测误差最小的 k 值。看"预测误差 vs 邻域数 k"图表,你能直观看到误差最小的 k。
🙋
我把"稀疏度"滑块拉到 70%,预测偏离得很厉害。这是怎回事?
🎓
这就是协同过滤最大的弱点——"稀疏性"。现实的评分矩阵超过 99% 都是空白。大家只对看过的少数商品评分,导致任意两个人共同评过的物品极少,无法可靠地计算相似度。新注册用户更糟——没有任何评分,无法和任何人比较——这叫"冷启动问题"。提高稀疏度,就是在模拟这个困难。

常见问题

基于内容的推荐使用物品本身的特征(电影的类型、演员,商品的材料、价格),找到与你过去喜欢的物品内容相似的物品进行推荐。协同过滤完全不看物品内容,只使用过去的评分模式,找到与你评分趋势相似的其他用户(趣味相近的用户),根据他们的评分来预测。无需了解物品内容就能推荐是协同过滤的优势。
余弦相似度只查看两个评分向量的夹角,计算简单易于实现。皮尔逊相关在减去各用户平均评分后计算相关性,可以补正"总体评分偏高的人"和"评分严格的人"之间的差异。在评分人群评分习惯差异大的真实数据中,皮尔逊相关通常精度更高,但共同评分较少时相关性容易不稳定。本工具可以切换两种方法比较结果。
邻域数 k 是"进行预测投票的相似用户人数"。k 值小时,只有极少数相似用户参与预测,如果该用户恰好是异常值则预测会大幅偏离。k 值大时,虽然多数投票更稳定,但不够相似的用户也加入投票,导致预测变得模糊。在实务中,通过交叉验证寻找预测误差最小的 k 值。本工具的"预测误差 vs 邻域数 k"图表让你直观看到误差最小的 k 值。
冷启动问题是指新用户或新物品没有任何历史评分,无法计算相似度进行推荐的问题。稀疏性(稀疏度)是指真实评分矩阵超过 99% 的单元都是空白的问题。用户只对看过的极少数商品进行评分,导致任意两个用户共同评过的物品极少,难以可靠地计算相似度。这两个问题是影响协同过滤精度的最大现实困难。

实际应用

电商平台商品推荐:Amazon 推广的"购买此商品的用户还购买了"是协同过滤最著名的应用。从海量购买历史这个巨大的评分矩阵中,找到与你购买模式相似的人,推荐他们常买的商品。无需阅读商品说明,直接可用于书籍、电器、食品等完全不同的类别,这是协同过滤的强项。

视频、音乐流媒体服务:Netflix 的推荐、Spotify 的"Discover Weekly"等,都是以观看/播放历史为评分矩阵的协同过滤。Netflix 在 2006 年举办的"Netflix Prize"竞赛,对预测误差改进 10% 的团队奖励 100 万美元,推动了矩阵分解等现代方法的普及。

社交网络"可能认识"推荐:好友申请推荐、关注推荐也是协同过滤的变体,用用户关系模式替代评分矩阵。"与你有共同好友的人"、"关注了相似账户的人"都是通过关系模式而非内容,这正是协同过滤思想的体现。

新闻、职位、广告匹配:新闻应用的文章投放、招聘网站的"为你推荐的职位"、广告定向投放,都使用协同过滤。点击、应聘、停留时间等隐式反馈可视为评分值,无需用户明确给商品打星,协同过滤就能运作。实际服务多采用协同过滤与基于内容推荐的混合方案。

常见误解和注意事项

首先一个大误解是"协同过滤是公平的算法,只推荐热门商品"。实际上恰好相反——评分多的热门商品与更多用户有共同点,越来越容易被推荐。这称为"热门偏差"或"信息茧房"。冷门好作品因评分少而难以上榜,长期下去"畅销品更畅销"的偏离会加剧。实务中会采取降低热度权重、刻意加入意外性推荐等多样性保障措施。

其次,常误认为"相似度高就能精准预测"。本工具提高稀疏度时就能体验到,如果两人只有 1~2 个共同评分,相似度可能只是巧合。共同评分仅 1 个时,余弦相似度总是 1。实务中会采取"只用共同评分数足够多的相似对"或"共同评分少的相似度打折扣(Significance Weighting)"等措施。一定要确认相似度数字背后的共同评分数。

最后,莫认为"光用协同过滤就能建成推荐系统"。协同过滤在冷启动问题上很弱,对新用户、新物品、谁都没评过的小众物品都无能为力。而且当评分矩阵巨大时,计算全体用户间相似度的成本很高,伸缩性成为瓶颈。现实推荐系统要结合内容推荐、矩阵分解、深度学习等多种方法,还要加入对评分注水(Shill Attack)的防护,才能投入应用。把本工具理解为"素朴协同过滤"直觉的入门工具吧。

使用指南

基本步骤

  1. 设置用户数(10~500人)和商品数(5~200件),生成评分矩阵
  2. 选择邻域数 k(3~20),确定相似度指标(余弦相似度或皮尔逊相关系数)
  3. 调整稀疏度参数(5~95%),改变观测评分的比例,模拟有缺失值的现实情况
  4. 点击模拟运行按钮,计算目标用户对未评商品的预测评分值,实时显示与隐藏正确值的误差(MAE)和最近邻用户群的相似度得分

具体计算示例

200 用户、50 商品、k=5、余弦相似度、稀疏度 80% 的设置下实验。评分矩阵中顾客 A 有 15 个观测评分,商品#42 未评分。系统找到相似度最高的 5 个用户(相似度 0.87~0.92),其对商品#42 的评分分别为 4.2、3.8、4.5、3.9、4.1 分,计算加权平均,得出预测评分 4.1 分。若隐藏的真实值为 4.3 分,则预测误差(绝对值)为 0.2 分,判定为高精度。

实务注意事项