余弦相似度、矩阵分解、深度学习物品的复杂、非线性特征
场景:经典的口碑推荐
书店里有三位顾客:你、小明 和 小红。他们最近都对一些书打了分(1-5分,5分最喜欢)。
| 顾客 | 《三体》 | 《小王子》 | 《哈利波特》 | 《经济学原理》 |
|---|---|---|---|---|
| 你 | 5分 | 3分 | ? | 1分 |
| 小明 | 4分 | 2分 | 5分 | 1分 |
| 小红 | 1分 | 5分 | 3分 | 5分 |
现在的问题是:我应该给你推荐《哈利波特》吗?
第一步:找到和你“口味相似”的人(计算用户相似度)
作为店员,你开始观察谁的读书口味和你最像。
你和小明:你们都超级喜欢《三体》,都给《经济学原理》打了低分。这说明你们可能都是科幻迷,对枯燥的理论书不感冒。口味非常相似!
你和小红:你喜欢《三体》,她不喜欢;她喜欢《经济学原理》,你讨厌。口味截然不同!
在算法里,这个“口味相似度”是可以量化的,最常用的就是 余弦相似度。简单理解就是:比较两个用户评分向量的方向是否一致。
你和小明的向量方向很接近,所以相似度高。
你和小红的向量方向几乎相反,所以相似度低。
第二步:利用相似用户的喜好进行预测(生成推荐)
现在要预测你对《哈利波特》的评分。你会更相信谁的意见?毫无疑问是小明,因为他和你口味相似。
小明(和你口味相似)给了《哈利波特》 5分。
小红(和你口味不同)给了《哈利波特》 3分。
算法会做一个加权平均,相似度越高,权重越大:
预测你的评分 = (和小明的相似度 * 小明的评分 + 和小红的相似度 * 小红的评分) / (总权重)
假设:
你和小明的相似度是 0.9
你和小红的相似度是 0.1
计算:
(0.9 * 5 + 0.1 * 3) / (0.9 + 0.1) = (4.5 + 0.3) / 1.0 = 4.8
预测你会给《哈利波特》打4.8分! 这是一个很高的分数,所以系统会把《哈利波特》强烈推荐给你。
这个过程就是 基于用户的协同过滤,它的核心思想是 “物以类聚,人以群分”。
另一个角度:基于物品的协同过滤
现在,我们换一个思路。不找人,我们找相似的物品。
| 书籍 | 你 | 小明 | 小红 |
|---|---|---|---|
| 《三体》 | 5分 | 4分 | 1分 |
| 《流浪地球》 | 4分 | 5分 | ? |
我们发现,几乎所有喜欢《三体》的人(你和小明),也都喜欢《流浪地球》。那么我们可以认为 《三体》和《流浪地球》非常相似(可能因为它们都是刘慈欣的科幻小说)。
现在,小红给《三体》打了1分(她不喜欢),但她还没读过《流浪地球》。我们应该向她推荐《流浪地球》吗?
大概率不会。 因为和她喜欢相似书籍的人,可能也不喜欢《流浪地球》。或者反过来说,一个不喜欢《三体》的人,很可能也不会喜欢相似的《流浪地球》。
它的核心思想是 “喜欢这个物品的人,也喜欢那个物品”。
当你喜欢A物品时,系统会推荐给你与A最相似的B、C、D物品。
亚马逊的 “购买此商品的顾客也购买了...” 就是这个原理最经典的例子。
总结与类比
| 基于用户的协同过滤 (User-CF) | 基于物品的协同过滤 (Item-CF) | |
|---|---|---|
| 核心思想 | 人以群分 | 物以类聚 |
| 推荐逻辑 | 找到和你相似的用户,把他们喜欢而你没看过的推荐给你。 | 找到你喜欢的物品的相似物品,推荐给你。 |
| 好比 | 你的好朋友给你安利东西。 | 一个资深专家(比如音乐发烧友)根据你喜欢的歌,推荐同类型的歌。 |
| 适用场景 | 用户数相对较少,个性化强,社交属性强(如朋友圈)。 | 物品数相对稳定,物品内在联系强(如电商、音乐)。 |
| 例子 | 小明喜欢《三体》和《哈利波特》,你也喜欢《三体》,所以把《哈利波特》推荐给你。 | 很多人同时购买了手机和手机壳,所以当你买手机时,推荐手机壳给你。 |
协同过滤面临的挑战
冷启动问题:
新用户: 他还没任何行为,系统不知道他和谁相似,无法推荐。
新物品: 它还没被任何人评分,系统不知道它和什么物品相似,永远不会被推荐。
解决方案: 用热门推荐、注册信息(年龄、性别)、内容特征(物品标签)等来弥补。
稀疏性问题:
一个大型网站有上百万用户和物品,但一个用户可能只评过几十个。这就导致用户-物品评分矩阵是一个极其稀疏的矩阵(99%以上是空的),很难找到重叠的部分来计算相似度。
流行度偏差:
热门物品会被推荐得越来越多,而一些质量高但小众的物品很难被发掘。
1. 余弦相似度:衡量“方向”上的志同道合
想象一下,我们把两个人的喜好放在一个二维地图上。
你 的喜好向量是:
(喜欢科幻=5, 喜欢经济学=1)小明 的喜好向量是:
(喜欢科幻=4, 喜欢经济学=1)小红 的喜好向量是:
(喜欢科幻=1, 喜欢经济学=5)
现在,我们把这三个点画在坐标轴上:
text
经济学^| 5 + *小红 (1,5)||| 1 + *你 (5,1) *小明 (4,1)|+----+----+----+----+-> 科幻1 4 5
余弦相似度关心的是什么?是这两个向量之间的夹角!
你 和 小明 的向量,指向几乎同一个方向(右下角)。它们之间的夹角θ非常小。
你 和 小红 的向量,指向几乎相反的方向。它们之间的夹角θ非常大。
计算公式(直观理解版):
余弦相似度 = cos(θ)
当夹角为 0° 时,
cos(0°) = 1,表示完全相同。当夹角为 90° 时,
cos(90°) = 0,表示完全不相关。当夹角为 180° 时,
cos(180°) = -1,表示完全相反。
所以:
你和小明的相似度 ≈ 0.99(非常相似)
你和小红的相似度 ≈ 0.20(几乎不相似)
为什么用余弦相似度而不是简单的评分差?
因为它能消除用户评分习惯的影响。比如一个用户普遍喜欢打高分(所有书都打4-5分),另一个用户喜欢打低分(所有书都打1-3分)。虽然他们绝对值不同,但他们的相对喜好趋势是一致的(比如都觉得A书比B书好)。余弦相似度能捕捉到这种“趋势”上的一致性,因为它看的是方向,而不是向量的长度。
2. 矩阵分解:从“评分”到“品味”的抽象
我们还是用那个评分表,但现在我们用“?”代表没评过分。
| 用户 \ 物品 | 《三体》 | 《小王子》 | 《哈利波特》 | 《经济学原理》 |
|---|---|---|---|---|
| 你 | 5 | 3 | ? | 1 |
| 小明 | 4 | 2 | 5 | 1 |
| 小红 | 1 | 5 | 3 | 5 |
这个表格就是一个“评分矩阵”。矩阵分解要做一件非常聪明的事:
它假设存在一些看不见的“隐藏因素”(也叫隐因子/主题),决定了用户为什么喜欢一个物品。
这些因素可能是:
主题1:科幻程度
主题2:童真/浪漫程度
主题3:学术严肃程度
矩阵分解的过程就是:
把这个大表格(评分矩阵),拆解成两个小表格的乘积:
用户-主题矩阵:每个用户对每个隐藏主题的喜好程度。
物品-主题矩阵:每个物品包含每个隐藏主题的多少。
拆解后可能是这样的:
用户-主题矩阵:
| 用户 \ 主题 | 科幻 | 童真 | 学术 |
|---|---|---|---|
| 你 | 0.9 | 0.2 | 0.1 |
| 小明 | 0.8 | 0.1 | 0.1 |
| 小红 | 0.1 | 0.8 | 0.9 |
物品-主题矩阵:
| 物品 \ 主题 | 科幻 | 童真 | 学术 |
|---|---|---|---|
| 《三体》 | 0.9 | 0.0 | 0.1 |
| 《小王子》 | 0.0 | 0.9 | 0.1 |
| 《哈利波特》 | 0.3 | 0.7 | 0.0 |
| 《经济学原理》 | 0.0 | 0.1 | 0.9 |
现在,预测“你”对《哈利波特》的评分怎么算?
看看“你”的品味和《哈利波特》的属性有多匹配:
你的科幻兴趣(0.9) × 书的科幻属性(0.3) = 0.27
你的童真兴趣(0.2) × 书的童真属性(0.7) = 0.14
你的学术兴趣(0.1) × 书的学术属性(0.0) = 0.00
把这些加起来:0.27 + 0.14 + 0.00 = 0.41(再经过一个转换,就可以变成1-5的评分)
矩阵分解的强大之处:
它甚至不需要《哈利波特》和《三体》被同一个用户评分过,只要它们通过“隐藏主题”关联起来就行。
它能从稀疏的数据中学习到深层的关联,解决了协同过滤的稀疏性问题。
3. 深度学习与非线性特征:模拟人脑的复杂决策
传统的模型(如协同过滤、矩阵分解)可以看作是“线性”的。它们做的是加法和乘法,就像用一条直线或一个平面去拟合数据。
但人的喜好是非常复杂、非线性的。
例子:你为什么喜欢一首歌?
不是简单的 摇滚成分 * 0.3 + 流行成分 * 0.5。
可能是:
“我喜欢在周五晚上听带有复古Disco节奏,但歌词又很忧郁的电子音乐。”
“我讨厌大部分民谣,除非它的吉他编排非常复杂,并且主唱的声音有颗粒感。”
这种“除非...并且...”的复杂逻辑,就是非线性关系。线性模型很难捕捉到这种关系。
深度学习(神经网络)如何工作?
输入层:输入用户和物品的特征(比如ID、标签、内容等)。
隐藏层:进行多层的“加权求和 + 非线性变换”。
加权求和:就像矩阵分解,计算不同特征的组合。
非线性变换(激活函数):这是关键!它允许模型学习到这种“跳跃性”的逻辑。它不是一个平滑的直线,而是一个可以弯曲、转折的复杂曲线。每一层都在学习更抽象、更复杂的特征组合。
第一层可能学到“摇滚”、“流行”。
第二层可能学到“节奏感强的摇滚”。
第三层可能学到“适合开车时听的、节奏感强的摇滚”。
输出层:最终输出一个预测的评分或点击概率。
可以把它想象成一个“特征抽象工厂”:
原始原料:用户ID、物品ID、标签、文字描述...
第一层车间:把原料加工成基础零件(“科幻”、“刘慈欣”)。
第二层车间:把基础零件组装成模块(“硬核科幻”、“太空歌剧”)。
第三层车间:把模块组装成复杂产品(“思想深刻、格局宏大的硬核科幻”)。
最终产品:预测用户对这个“复杂产品”的喜爱程度。
深度学习的优势:
能自动学习极其复杂的特征交互,无需人工设计。
可以轻松融合多种信息(用户画像、物品内容、行为序列等)。
模型表达能力极强,上限非常高。
深度学习的劣势:
像一个“黑盒子”,难以解释为什么做出这个推荐。
需要大量的数据和计算资源。
模型复杂,训练和调试难度大。
总结
余弦相似度:一个衡量“趋势一致性”的尺子,看两个人的喜好方向是否一致。
矩阵分解:一个“品味解码器”,把具体的评分抽象成隐藏的品味主题,再用这些主题来预测。
深度学习:一个“超级大脑”,通过多层非线性处理,模拟人类极其复杂和微妙的喜好决策过程,自动学习高级特征。
