推荐系统最常见的应用就是商品推荐, 网购的兴起使得这个方向备受关注. 本文描述推荐系统的基础知识与个人想法. 注意事项:
- 相关的基础知识、示例, 读者自行到 CSDN 或知乎查找学习.
- 这里的符号系统, 只保证内部的完备性. 如果要写论文, 应遵守参考资料的习惯.
- 看贴要回, 请在下方留言.
0. 符号表
本节给出符号表, 便于后面查阅.
表 1. 符号表
符号 | 含义 |
---|---|
n n n | 用户数 |
m m m | 项目数 |
R \mathbf{R} R | 评分表 |
Ω ( R ) \Omega(\mathbf{R}) Ω(R) | R \mathbf{R} R 中非零元素对应的位置集合. |
¬ Ω ( R ) \neg \Omega(\mathbf{R}) ¬Ω(R) | R \mathbf{R} R 中零元素对应的位置集合. |
1. 数据
推荐系统有一些基础数据与附加信息.
1.1 基础数据
令用户数量为 n n n, 产品数量为 m m m. 基础数据为一个二维表 R = ( r i j ) n × m \mathbf{R} = (r_{ij})_{n \times m} R=(rij)n×m. 分两种情况讨论:
- 如果仅知道用户是否浏览过商品, r i j r_{ij} rij 的取值范围为 { 0 , 1 } \{0, 1\} {0,1}. r i j = 0 r_{ij} = 0 rij=0 表示浏览过, r i j r_{ij} rij 表示未浏览过. 浏览也可称为隐式评分 implicit rating, 因为浏览表示感兴趣. 这时称 R R R 为浏览矩阵.
- 如果用户要给购买的商品过分, r i j r_{ij} rij 的取值范围一般为 { 0 , 1 , 2 , 3 , 4 , 5 } \{0, 1, 2, 3, 4, 5\} {0,1,2,3,4,5}. r i j = 0 r_{ij} = 0 rij=0 表示没购买, 1 分表示最不喜欢, 5 分表示最喜欢, 该评分为显示评分 (explicit rating). 这时称 R R R 为评分矩阵.
1.2 用户与商品信息
用户有自身信息, 如: 性别、国籍、信仰、年龄、职业等等.
商品有自身信息, 以电影为例, 包括: 出品时间、导演、主演、类型 (爱情片、动画片、喜剧片、悬疑片等,可多选)、片长等等.
以饭店为例, 有位置 (城市、街道)、营业时间、类别 (川菜、粤菜、鲁菜)
1.3 评论信息
用户不仅要给商品打分, 还会写一些评论. 这些评论可能比分数提供更丰富的语义信息.
1.4 其它信息
没想清楚, 以后补充.
2. 问题
推荐系统的核心问题是: 每个未知数据 (如 1.1 节所述, 它们都用 0 来表示) 的实际值应该是多少?
从机器学习的角度, 每个具体问题应说明其场景, 以及输入、输出、优化目标、约束条件. 由于推荐系统数据的特殊性, 以下由简到难进行分析.
2.1 基于用户与商品信息的推荐
问题 2.1.1 基于用户、商品信息的评分预测
输入: 评分矩阵
R
\mathbf{R}
R, 用户信息表
X
=
[
x
1
,
…
,
x
n
]
T
=
[
x
i
j
]
n
×
d
u
\mathbf{X} = [\mathbf{x}_1, \dots, \mathbf{x}_n]^{\mathrm{T}} = [x_{ij}]_{n \times d_u}
X=[x1,…,xn]T=[xij]n×du, 商品信息表
T
=
[
t
1
,
…
,
t
m
]
T
=
[
t
i
j
]
m
×
d
t
\mathbf{T} = [\mathbf{t}_1, \dots, \mathbf{t}_m]^{\mathrm{T}} = [t_{ij}]_{m \times d_t}
T=[t1,…,tm]T=[tij]m×dt, 其中
d
u
d_u
du 是用户的属性数,
d
t
d_t
dt 是商品属性数.
输出: 函数
f
:
R
d
u
×
R
d
t
→
R
f: R^{d_u} \times R^{ d_t} \rightarrow R
f:Rdu×Rdt→R.
优化目标:
min
∑
(
i
,
j
)
∈
Ω
(
f
(
x
i
,
t
j
)
−
r
i
j
)
2
\min \sum_{(i, j) \in \Omega} (f(\mathbf{x}_i, \mathbf{t}_j) - r_{ij})^2
min∑(i,j)∈Ω(f(xi,tj)−rij)2.
说明:
- 本问题强行把三个表合成了一个决策表, 对象个数为 ∣ Ω ∣ |\Omega| ∣Ω∣, 条件属性个数为 d u + d i d_u + d_i du+di, 决策属性取值为 [ 1 , 5 ] [1, 5] [1,5], 即 1 至 5 的实数. 因此为一个经典的回归问题.
- 为简便起见, 假设用户信息、商品信息的基础数据均为实型.
- 优化目标为最小化训练集上的 MSE, 也可以按 MAE 的方式来写.
- 学习到的函数 f f f 既可用于已有用户和商品, 也可用于新用户和新商品, 因此这类推荐适合于冷启动 (cold start recommendation).
- 为获得相应的评价指标, 需要将原始的数据集分为训练、测试集, 即将原始评分矩阵的某些非 0 元素拿出来. 这样, 评分矩阵的数据有三种情况: a) 训练集中非 0 元素 (学习器知道); b) 测试集中非 0 元素 (裁判员知道); c) 一直为 0 的元素 (没人知道).
问题 2.1.2 基于用户、商品信息与隐式评分的推荐
输入: 浏览矩阵
R
\mathbf{R}
R, 用户信息表
X
=
[
x
i
j
]
n
×
d
u
\mathbf{X} = [x_{ij}]_{n \times d_u}
X=[xij]n×du, 商品信息表
T
=
[
t
i
j
]
m
×
d
t
\mathbf{T} = [t_{ij}]_{m \times d_t}
T=[tij]m×dt, 其中
d
u
d_u
du 是用户的属性数,
d
t
d_t
dt 是商品属性数.
输出: 函数
f
:
R
d
u
×
R
d
t
→
{
0
,
1
}
f:R^{d_u} \times R^{ d_t} \rightarrow \{0, 1\}
f:Rdu×Rdt→{0,1}.
优化目标:
min
∑
(
i
,
j
)
∈
[
1..
n
]
×
[
1..
m
]
(
f
(
x
i
,
t
j
)
−
r
i
j
)
2
\min \sum_{(i, j) \in [1..n] \times [1..m]} (f(\mathbf{x}_i, \mathbf{t}_j) - r_{ij})^2
min∑(i,j)∈[1..n]×[1..m](f(xi,tj)−rij)2
说明:
- 现在变成了一个二分类问题.
- 优化目标为最小化误差 (最大化分类精度). 由于是二分类, 这里使用平方还是绝对值都等价.
- 优化目标计算时, 考虑了所有可能用户、项目组合, 共 [ 1.. n ] × [ 1.. m ] [1..n] \times [1..m] [1..n]×[1..m] 种. 然而, 除了为 1 1 1 的值, 其它的值是否正确根本无从考证.
- 为获得相应的评价指标, 需要将原始的数据集分为训练、测试集, 即将原始评分矩阵的某些 1 元素拿出来. 这样, 评分矩阵的数据有三种情况: a) 训练集中 1 元素 (学习器知道); b) 测试集中 1 元素 (裁判员知道); c) 一直为 0 的元素 (没人知道).
2.2 基于评分矩阵的评分预测
问题 2.2.1 评分预测
输入: 评分矩阵
R
=
[
r
i
j
]
n
×
m
\mathbf{R} = [r_{ij}]_{n \times m}
R=[rij]n×m.
输出: 子矩阵
U
=
[
u
1
,
…
,
u
n
]
T
=
[
u
i
j
]
n
×
k
\mathbf{U} = [\mathbf{u}_1, \dots, \mathbf{u}_n]^{\mathrm{T}} = [u_{ij}]_{n \times k}
U=[u1,…,un]T=[uij]n×k,
V
=
[
u
1
,
…
,
v
m
]
T
=
[
v
i
j
]
m
×
k
\mathbf{V} = [\mathbf{u}_1, \dots, \mathbf{v}_m]^{\mathrm{T}} = [v_{ij}]_{m \times k}
V=[u1,…,vm]T=[vij]m×k.
优化目标:
min
∑
(
i
,
j
)
∈
Ω
(
u
i
v
j
T
−
r
i
j
)
2
\min \sum_{(i, j) \in \Omega} (\mathbf{u}_i \mathbf{v}_j^{\mathrm{T}} - r_{ij})^2
min∑(i,j)∈Ω(uivjT−rij)2.
说明:
- 除了矩阵分解, 我暂时找不到其它模型来描述评分预测. 基于邻域的方法 (lazy learning) 没有模型, 所以无法描述这种预测.
- 评价指标的计算与 问题 2.1.1 相同.
问题 2.2.2 考虑用户评论的评分预测
在 问题 2.2.1 的基础上, 考虑用户评论.
2.3 基于浏览矩阵的推荐
问题 2.1.1 基于浏览矩阵的推荐
输入: 浏览矩阵
R
=
[
r
i
j
]
n
×
m
\mathbf{R} = [r_{ij}]_{n \times m}
R=[rij]n×m.
输出: 子矩阵
U
\mathbf{U}
U 与
V
\mathbf{V}
V, 阈值
α
\alpha
α.
优化目标:
min
∑
(
i
,
j
)
∈
[
1..
n
]
×
[
1..
m
]
(
I
(
u
i
v
j
T
−
α
)
−
r
i
j
)
2
\min \sum_{(i, j) \in [1..n] \times [1..m]} (I(\mathbf{u}_i \mathbf{v}_j^{\mathbf{T}} - \alpha) - r_{ij})^2
min∑(i,j)∈[1..n]×[1..m](I(uivjT−α)−rij)2.
说明:
- I I I 为指示函数, 如果 x > = 0 x>=0 x>=0, 则 I ( x ) = 1 I(x) = 1 I(x)=1; 否则 I ( x ) = 0 I(x) = 0 I(x)=0.
- 评价指标的计算与 问题 2.1.2 相同.
2.4 推荐系统的魔法边界
机器学习通常面临的是不确定性问题, 不能保证 100% 准确. 在分类问题中, 最小误差被称为 Bayes 误差. 参见: https://zhuanlan.zhihu.com/p/114609537. 例如, 整个论域中, 长发的 90% 是女人, 短头发的 80% 是男人. 长发和短发各占 50%. 如果只知道是否长发来建立分类器, 有如下几种:
A. 长发
⇒
\Rightarrow
⇒ 女人; 短发
⇒
\Rightarrow
⇒ 男人. 误差 (1 - 90%) * 50% + (1 - 80%) * 50% = 15%.
B. 长发
⇒
\Rightarrow
⇒ 女人; 短发
⇒
\Rightarrow
⇒ 女人. 误差 45%.
C. 长发
⇒
\Rightarrow
⇒ 男人; 短发
⇒
\Rightarrow
⇒ 男人. 误差 55%.
D. 长发
⇒
\Rightarrow
⇒ 男人; 短发
⇒
\Rightarrow
⇒ 女人. 误差 85%.
获得 长发 => 男人 这样的规则是可能的. 例如: 随机采样 7 人, 其中 3 人长发, 4 人短发. 长发的 3 人中, 2 个为男人. 这时, 根据采样 (训练集) 来看, 长发的应为男人.
训练集与测试集分布不一致, 是机器学习普遍面临的问题.
在推荐系统中, 则称之为魔法边界 (magic barrier).
问题 2.4.1 魔法边界评估
输入: 训练矩阵
R
t
=
(
r
i
j
t
)
n
×
m
\mathbf{R}^t = (r^t_{ij})_{n \times m}
Rt=(rijt)n×m.
输出: 魔法边界估计值 (应指定 MAE 或 RSME).
说明: 这并非一个典型的机器学习问题, 所以并没有优化目标. 在实际中如何判断这个 magic barrier 是否靠谱呢? 如果找到一个算法, 它的 MAE 比 magic barrier 的值还低, 就说明这个 magic barrier 有问题. 如果当前最优算法的 MAE 比 magic barrier 的值高, 但高得很有限, 就可能间接说明 magic barrier 是靠谱的.
2.5 代价敏感推荐
问题 2.5.1 误分类代价敏感的推荐
输入: 训练矩阵 (浏览数据)
R
t
=
(
r
i
j
t
)
n
×
m
\mathbf{R}^t = (r^t_{ij})_{n \times m}
Rt=(rijt)n×m, 完备矩阵
R
=
(
r
i
j
)
n
×
m
\mathbf{R} = (r_{ij})_{n \times m}
R=(rij)n×m, 误分类代价矩阵
M
=
(
m
i
j
)
2
×
2
M = (m_{ij})_{2 \times 2}
M=(mij)2×2.
输出: 预测矩阵
R
′
=
(
r
i
j
′
)
n
×
m
\mathbf{R}' = (r'_{ij})_{n \times m}
R′=(rij′)n×m.
优化目标: 最小化平均误分类代价
min
c
o
s
t
(
R
t
,
R
′
,
R
)
=
∑
k
,
l
∈
{
0
,
1
}
m
k
l
∣
{
(
i
,
j
)
∈
¬
Ω
(
R
t
)
∣
r
i
j
′
=
k
,
r
i
j
=
l
}
∣
∣
¬
Ω
(
R
t
)
∣
(4)
\min cost(\mathbf{R}^t, \mathbf{R}', \mathbf{R}) = \frac{\sum_{k, l \in \{0, 1\}}m_{kl}|\{(i, j) \in \neg \Omega(\mathbf{R}^t) | r'_{ij} = k,r_{ij} = l\}|}{|\neg \Omega(\mathbf{R}^t)|} \tag{4}
mincost(Rt,R′,R)=∣¬Ω(Rt)∣∑k,l∈{0,1}mkl∣{(i,j)∈¬Ω(Rt)∣rij′=k,rij=l}∣(4)
说明:
- m 01 m_{01} m01 表示未向用户推荐他喜欢的商品所付出的代价 (未起到促销作用); m 10 m_{10} m10 表示向用户推荐了他不喜欢的商品所付出的代价 (推荐系统的信誉受损).
- 一般情况下假设 m 00 = m 11 = 0 m_{00} = m_{11} = 0 m00=m11=0. (4) 式可以应对这两个值非 0 的情况. 有没有感觉特别简洁?
问题 2.5.2 三支推荐
输入: 训练矩阵 (浏览数据)
R
t
=
(
r
i
j
t
)
n
×
m
\mathbf{R}^t = (r^t_{ij})_{n \times m}
Rt=(rijt)n×m, 完备矩阵
R
=
(
r
i
j
)
n
×
m
\mathbf{R} = (r_{ij})_{n \times m}
R=(rij)n×m, 分类代价矩阵
M
=
(
m
i
j
)
3
×
2
M = (m_{ij})_{3 \times 2}
M=(mij)3×2.
输出: 预测矩阵
R
′
=
(
r
i
j
′
)
n
×
m
\mathbf{R}' = (r'_{ij})_{n \times m}
R′=(rij′)n×m.
优化目标: 最小化平均误分类代价
min
c
o
s
t
(
R
t
,
R
′
,
R
)
=
∑
k
∈
{
0
,
1
,
2
}
,
l
∈
{
0
,
1
}
m
k
l
∣
{
(
i
,
j
)
∈
¬
Ω
(
R
t
)
∣
r
i
j
′
=
k
,
r
i
j
=
l
}
∣
∣
¬
Ω
(
R
t
)
∣
(5)
\min cost(\mathbf{R}^t, \mathbf{R}', \mathbf{R}) = \frac{\sum_{k \in \{0, 1, 2\}, l \in \{0, 1\}}m_{kl}|\{(i, j) \in \neg \Omega(\mathbf{R}^t) | r'_{ij} = k,r_{ij} = l\}|}{|\neg \Omega(\mathbf{R}^t)|} \tag{5}
mincost(Rt,R′,R)=∣¬Ω(Rt)∣∑k∈{0,1,2},l∈{0,1}mkl∣{(i,j)∈¬Ω(Rt)∣rij′=k,rij=l}∣(5)
说明:
- 推荐系统的行为现在有三种: 0 表示不推荐, 1 表示推荐, 2 表示发优惠券 (promotion). 这是本问题的特点. 它也是对现实系统更好的建模.
- (5) 式与 (4) 式仅有 k k k 的取值范围不同.
- 代价敏感推荐本质上是对优化目标的泛化, 它与其它的问题扩展是正交的. 换言的, 只要是推荐问题, 都可以有其代价敏感版本.
问题 2.5.3 基于回归的三支推荐
综合 问题 2.2.2 与 问题 2.4.2 即可.
2.6 交互式推荐
实际的推荐系统都是交互式的: 系统向用户推荐一系列项目, 如 20 个; 用户选择其中的一些来购买, 或翻到下一页; 系统再根据用户的行为来改进推荐列表. 这就好像用户在与系统对话, 因此交互式推荐在英文中为 conversational recommendation.
场景描述:
对每个用户
Step 1. 登录系统;
Step 2. Repeat
Step 2.1 获得系统推荐的一组项目 (固定为
N
N
N 个);
Step 2.2 用户在其中选择喜欢的所有项目;
until 喜欢的项目为
0
0
0 个.
问题 2.6.1 交互式推荐
输入: 完备矩阵
R
=
(
r
i
j
)
n
×
m
\mathbf{R} = (r_{ij})_{n \times m}
R=(rij)n×m.
输出: 推荐列表构成的预测矩阵
R
′
=
(
r
i
j
′
)
n
×
m
\mathbf{R}' = (r'_{ij})_{n \times m}
R′=(rij′)n×m.
优化目标: 最大化准确率
max
a
c
c
(
R
t
,
R
′
,
R
)
=
∣
{
(
i
,
j
)
∈
¬
Ω
(
R
t
)
∣
r
i
j
′
=
r
i
j
}
∣
∣
¬
Ω
(
R
t
)
∣
(6)
\max acc(\mathbf{R}^t, \mathbf{R}', \mathbf{R}) = \frac{|\{(i, j) \in \neg \Omega(\mathbf{R}^t) | r'_{ij} = r_{ij}\}|}{|\neg \Omega(\mathbf{R}^t)|} \tag{6}
maxacc(Rt,R′,R)=∣¬Ω(Rt)∣∣{(i,j)∈¬Ω(Rt)∣rij′=rij}∣(6)
说明:
- 在对 u i u_i ui 进行推荐的时候, R \mathbf{R} R 第 i i i 行的数据对于推荐系统而言是未知的. 只能随着交互过程逐渐揭晓, 且仅可获得推荐列表的项目评分. 这样才能模拟现实中的推荐过程.
- 交互推荐强调的是一种场景, 可以与 问题 2.2.2, 问题 2.5.2 等结合, 产生新的问题.
2.7 去噪
数据噪音在每个领域都存在, 所以去噪也是个机器学习永恒的话题.
有两种评价去噪效果的方式:
a) 将原始评分数据当成是干净的, 随机加入噪音 (修改数据), 计算去噪后数据与原始数据的差距. 具体计算参见 (2) 式与 (3) 式.
b) 将原始数据随机分成训练集与测试集, 训练集中去除噪音获得修正后训练集. 用训练集与修正后训练集分别获得推荐模型 (用已有的算法), 并在测试集中获得预测效果. 效果提升越明显, 则表示去噪效果越好.
优劣对比:
方式 a) 的优势在于直接获得去噪效果; 缺点是需要干净的数据. 如果原始数据本身不是干净的, 就尴尬了. 有些工作让同一个人对同一个项目多次打分, 并将其平均分当作是干净数据, 这种做法有一定道理, 但对于人类来说, 做重复工作就会很烦.
方式 b) 的优势在于不需要干净数据, 更加客观; 缺点在于测试集也是有噪音的.
3. 经典的算法
这里描述一些经典的算法. 它们也是很难被超越的.
3.1 基于相似性的算法
相似性是物理世界的一个本源: 相似的东西在未知的方面也相似. 例如, 两个人的各项体检指标都相似 (体温 37.5 vs. 37.6, 血压 112 vs. 113, 等等), 则其中一个感冒, 另一个也很可能感冒.
3.1.1 k k kNN 基本方案: 针对浏览用户的推荐
k
k
kNN 是最常用的基于相似性的方法, 其思想是使用
k
k
k 个相似对象 (即邻居) 为当前实例提供参考. 它是推荐系统的一种基准方法.
具体而言, 要想知道某位用户喜欢什么, 可以分析相似用户喜欢什么. 以 问题 2.2.1 为例, 可分解为三个子问题:
a) 如何计算用户相似性?
这是 kNN 的核心问题.
以输入数据
R
t
\mathbf{R}^t
Rt 为例, 每个用户的浏览记录都是一个长度为
m
m
m 的向量. 两个用户的相似度通常根据相应两个向量来计算. 令两个向量为
v
i
,
v
j
∈
{
0
,
1
}
m
\mathbf{v}_i, \mathbf{v}_j \in \{0, 1\}^m
vi,vj∈{0,1}m, cosine 相似度为
c
o
s
(
v
i
,
v
j
)
=
v
i
⋅
v
j
∥
v
i
∥
×
∥
v
j
∥
(7)
cos(\mathbf{v}_i, \mathbf{v}_j) = \frac{\mathbf{v}_i \cdot \mathbf{v}_j}{\|\mathbf{v}_i\| \times \|\mathbf{v}_j\|} \tag{7}
cos(vi,vj)=∥vi∥×∥vj∥vi⋅vj(7)
Jaccard 相似度为
J
a
c
c
a
r
d
(
v
i
,
v
j
)
=
∣
{
1
≤
k
≤
m
}
∣
v
i
k
=
1
,
v
j
k
=
1
}
∣
∣
{
1
≤
k
≤
m
}
∣
v
i
k
=
1
or
v
j
k
=
1
}
∣
(8)
Jaccard(\mathbf{v}_i, \mathbf{v}_j) = \frac{|\{1 \le k \le m\} | v_{ik} = 1, v_{jk} = 1\}|}{|\{1 \le k \le m\} | v_{ik} = 1 \textrm{ or } v_{jk} = 1\}|} \tag{8}
Jaccard(vi,vj)=∣{1≤k≤m}∣vik=1 or vjk=1}∣∣{1≤k≤m}∣vik=1,vjk=1}∣(8)
其中,
v
i
k
v_{ik}
vik 为
v
i
\mathbf{v}_i
vi 的第
k
k
k 个分量. 很多文献也用集合的并、交来表示, 道理是一样的.
b) 如何设置合适的
k
k
k?
做实验吧.
k
k
k 越大越稳定,
k
k
k 越小针对性越强. 给定了
k
k
k 值和相似度计算方式, 邻居的确定也是一个问题. 参见 kNN 的数学表达式.
c) 如何选择推荐项目?
投票. 当前邻居没浏览过的项目, 按邻居浏览量递减排序 (最大值为
k
k
k, 表示所有邻居都看过; 最小值为
0
0
0). 从前往后选即可.
如果要解决 问题 2.2.2, 只需要将邻居用户对该项目的评分取均值即可 (注意, 0 不要考虑). 从这里可以看出, kNN 的适应性相当强.
3.1.2 用二部图来计算相似性
用户集合的每个元素、项目集合的每个元素都作为一个节点. 如果用户浏览了项目, 则在它们之间画一条边. 这样就构成了二部图. 通过传递函数, 可以计算任意两个用户、任意两个项目之间的相似性.
论文:
Shang MS, Jin CH, Zhou T, Zhang YC (2009) Collaborative fil-tering based on multi-channel diffusion. Phys A Stat Mech Appl 388(23):4867–4871
3.1.3 用形式概念来确定邻居
形式概念是一个对
⟨
U
,
T
⟩
\langle U, T\rangle
⟨U,T⟩, 其中
U
U
U 为一个用户集合,
T
T
T 为一个项集合. 该概念表示同时浏览
T
T
T 中项目的用户在且仅在
U
U
U 里面.
已有的方法通过建立概念格来进行推荐.
3.1.4 user-based vs. item-based
3.1.1 节中, 计算的是用户相似度, 这被称为 user-based recommendation. 是否通过计算项目的相似度来进行推荐呢? 答案是肯定的, 而且 item-based recommendation 的效果通常比前者要好. 这多少有点让人意外, 但我们让数据说话, 它就告诉了我们这个事实.
从矩阵的角度, 将
R
\mathbf{R}
R 转置一下, 用户与项目的位置就互换了. 因此, user-based 还是 item-based 都可以使用同一个算法.
论文:
Linden, G., et al. “Amazon.Com Recommendations: Item-to-Item Collaborative Filtering.” IEEE Internet Computing, vol. 7, no. 1, 2003, pp. 76–80.
3.2 矩阵分解
矩阵分解是一种神奇的操作. 它本身是数学上的一个问题, 即缺失值填补, 用于推荐系统简直不要太适合.
点击 推荐系统代码分析 2: 矩阵分解 查看源代码及分析.
3.2.1 基本方案
考虑 问题 2.2.1, 我们要根据
R
t
\mathbf{R}^t
Rt 来计算
R
′
\mathbf{R}'
R′. 我们转而求两个矩阵
U
=
(
u
1
,
…
,
u
n
)
T
=
(
u
i
j
)
n
×
k
\mathbf{U} = (\mathbf{u}_1, \dots, \mathbf{u}_n)^{\mathrm{T}} = (u_{ij})_{n \times k}
U=(u1,…,un)T=(uij)n×k 和
V
=
(
v
1
,
…
,
v
m
)
T
=
(
v
i
j
)
m
×
k
\mathbf{V} = (\mathbf{v}_1, \dots, \mathbf{v}_m)^{\mathrm{T}} = (v_{ij})_{m \times k}
V=(v1,…,vm)T=(vij)m×k, 其中
k
≪
min
{
m
,
n
}
k \ll \min\{m, n\}
k≪min{m,n}. 并使用如下优化目标:
min
e
r
r
o
r
=
∑
(
i
,
j
)
∈
Ω
(
R
t
)
∣
u
i
v
j
T
−
r
i
j
∣
(9)
\min error = \sum_{(i, j) \in \Omega(\mathbf{R}^t)} |\mathbf{u}_i \mathbf{v}^{\mathrm{T}}_j - r_{ij}|\tag{9}
minerror=(i,j)∈Ω(Rt)∑∣uivjT−rij∣(9)
R
′
=
U
V
T
\mathbf{R}' = \mathbf{U} \mathbf{V}^{\mathrm{T}}
R′=UVT.
说明:
- 式 (9) 仅最小化在训练集中的误差, 这是机器学习的一般方式. 测试集上的误差只能做为算法效果的评价指标, 而训练集中的误差用于获得预测模型. (2) 式已经说清楚了.
- 从物理意义 (强行解释) 上, u i \mathbf{u}_i ui 可以看作第 i i i 个用户的特征向量, v j \mathbf{v}_j vj 可以看作第 j j j 个项目的特征向量. 因此, u i v j T \mathbf{u}_i \mathbf{v}^{\mathrm{T}}_j uivjT 就是相应用户对项目的评分预测. 如果在训练集上拟合得好, 我们就相信在测试数据上也预测得好.
- 评分矩阵一般很稀疏, 即 0 占了绝大多数 (可能 99%). 因为用户只会购买所有商品的一小部分.
- 这里我们习惯于使用转置的方式来描述 V \mathbf{V} V 和 v i \mathbf{v}_i vi.
- 没有除以 ∣ Ω ( R t ) ∣ |\Omega(\mathbf{R}^t)| ∣Ω(Rt)∣, 反正不影响结果.
3.2.2 加正则项
过拟合 (overfitting) 是机器学习的一个核心困难. 很多算法对训练集拟合得好, 但测试集却预测得不好. 这就好比一个学生平时成绩好, 但考试成绩不好.
加正则项是应对过拟合的一种常用方式.
min
e
r
r
o
r
=
∑
(
i
,
j
)
∈
Ω
(
R
t
)
(
u
i
v
j
T
−
r
i
j
)
2
+
λ
(
∥
U
∥
2
2
+
∥
V
∥
2
2
)
(10)
\min error = \sum_{(i, j) \in \Omega(\mathbf{R}^t)} (\mathbf{u}_i \mathbf{v}^{\mathrm{T}}_j - r_{ij})^2 + \lambda (\|\mathbf{U}\|_2^2 + \|\mathbf{V}\|_2^2) \tag{10}
minerror=(i,j)∈Ω(Rt)∑(uivjT−rij)2+λ(∥U∥22+∥V∥22)(10)
其中,
∥
U
∥
2
2
=
∑
1
≤
i
≤
n
,
1
≤
j
≤
k
u
i
j
2
\|\mathbf{U}\|_2^2 = \sum_{1 \leq i \leq n, 1 \leq j \leq k} u_{ij}^2
∥U∥22=∑1≤i≤n,1≤j≤kuij2 为 2 范数,
∥
V
∥
2
2
\|\mathbf{V}\|_2^2
∥V∥22 同理. 加上正则项的意思是: 使得
U
\mathbf{U}
U 和
V
\mathbf{V}
V 的元素绝对值更小, 避免过拟合.
我使用一个 (不恰当的) 例子来理解过拟合: 为了称一个质量为 4g 的物品, 我们有两种方案:
A. 使用质量为 1007g 和 1003g 的砝码, 它们放在天平两端, 这时把物品放在 1003g 砝码这边, 完美拟合. 但是, 为了拟合 6g, 7g 的物品, 这两个砝码就做不到. 换言之, 它们对 4g 物品进行了过拟合.
B. 使用质量 2g 与 5g 的砝码. 它们不能完美拟合 4g 物品, 但它们对于 2g 到 7g 的物品都有较好的拟合能力.
从这个例子可以看出, 我们还是用质量小的砝码好点.
3.2.3 概率矩阵分解
使用概率与最大似然对矩阵分解进行了改进, 就获得了好得多的效果.
论文:
Mnih, Andriy, and Ruslan R. Salakhutdinov. “Probabilistic Matrix Factorization.” Advances in Neural Information Processing Systems 20, vol. 20, 2007, pp. 1257–1264.
4. 我们的工作
本节尽量按照第 2 节相同的节奏来介绍我们的工作.
4.1 基于浏览矩阵的推荐
在 3.1.2 节所描述方案的基础上, 每个通道单独计算.
论文:
Heng-Ru Zhang, Fan Min, Zhi-Heng Zhang, Song Wang, Efficient collaborative filtering recommendations with multi-channel feature vectors. International Journal of Machine Learning & Cybernetics. (2019)1165–1172.
点击下载
4.2 基于相似性的评分预测
4.2.1 新的距离度量
郑梅想到一个简单到爆的距离度量: 两个用户 (项目) 的距离, 就是其平均分的差值 (0 不参与计算). 我听到她的想法时, 根本不敢相信, 并举出如下例子:
x
1
=
(
0
,
3
,
5
,
0
,
2
,
3
)
\mathbf{x}_1 = (0, 3, 5, 0, 2, 3)
x1=(0,3,5,0,2,3) 的平均分为
13
/
4
13/4
13/4;
x
2
=
(
5
,
0
,
2
,
2
,
0
,
4
)
\mathbf{x}_2 = (5, 0, 2, 2, 0, 4)
x2=(5,0,2,2,0,4) 的平均分为
13
/
4
13/4
13/4, 他们的距离为
∣
13
/
4
−
13
/
4
∣
=
0
|13/4 - 13/4| = 0
∣13/4−13/4∣=0.
可以发现: 这两个用户的购买物品集合相差很大, 相同物品的评分差异也很大, 其距离居然为 0.
郑梅坚持说自己的实验结果不错, 于是我花了半小时自己把代码实现了一遍. 不是我写得快, 而是代码量太少. 果然她是对的! 所以呢, 机器学习不管什么反例, 效果好就行. 后来我强行解释了一波: 两个学生参考高考, 录取的时候只看总分 (等价于平均分), 而并没考虑其偏科情况.
说明:
- 可以先将每个用户的平均分进行预计算, 这时候距离计算的时间复杂度就是 O ( 1 ) O(1) O(1) 而不是 O ( m ) O(m) O(m).
- 我们不仅考虑了
k
k
kNN 方案, 还考虑了半径方案, 两个用户 (物品) 被认为是相似, 当且仅当其 M-distance 不超过给定的阈值 (如
ϵ
=
0.3
\epsilon = 0.3
ϵ=0.3).
论文:
Mei Zheng, Fan Min, Heng-Ru Zhang, Wen-Bin Chen, Fast recommendations with the M-distance, IEEE Access 4 (2016) 1464–1468.
点击下载
代码见 推荐系统代码分析 1: 基于相似度的评分预测.
孙爽博和董新玲想到了将两种距离度量进行结合的方法, 效果也不错.
论文:
Shuang-Bo Sun, Zhi-Heng Zhang, Xin-Ling Dong, Heng-Ru Zhang, Tong-Jun Li, Lin Zhang, Fan Min, Integrating Triangle and Jaccard similarities for recommendation, PLOS ONE 12 (8) (2017) 1–16.
4.2.2 评论带来的信息
沈蓉萍比较独立, 是能够自己想出 idea 的少数学生之一. 她毕业后到西南交通大学继续读博士.
评论对评分有印证作用. 如果评分低评论却好, 证明是手滑了.
论文:
Rong-Ping Shen, Heng-Ru Zhang, Hong Yu, Fan Min. Sentiment based matrix factorization with reliability for recommendation. Expert Systems with Applications. (2019) 249-258.
4.3 基于用户与商品信息的推荐
4.5 节的第一篇论文也属于本方向. 由于那边更重要, 就不在这里描述了.
4.4 推荐系统的魔法边界
2015 年出差参加学术会议, 在飞机上我和 Henry 谈到了这篇论文的可能性, 他觉得很神奇: 这玩艺儿也能评估? 然后他就把论文写出来并发表了. 投稿的道路很漫长, 因为搞这个问题的人很少, 审稿人总想问: 这个算法的精度如何呀? 拜托, 我们不是想做推荐算法, 而是评估数据的质量.
在正态分布假设下, 做了三个模型: 第一个模型假设用户的评分都服从相同的正态分布. 第二个模型假设不同的评分级别有不同的适当标准差设置. 第三个将用户分成不同的组, 并假设标准差的设置与评级级别和用户组有关.
论文:
Heng-Ru Zhang, Fan Min, Yan-Xue Wu, Zhuo-Lin Fu, Lei Gao. Magic barrier estimation models for recommended systems under normal distribution. Applied Intelligence. (2018-12) 4678-4693.
点击下载
当前我们的进一步工作在 Applied Soft Computing (现在是一区) 上卡住了, 修改稿上传了半年没动静. 唉.
4.5 代价敏感推荐
三支推荐是我们提出来的. 由于首次把三支决策理论与推荐系统应用结合, 所以受到比较多的关注. 两篇论文都为 ESI 高被引, 而且都被引 100 次以上.
第一个工作针对的是浏览矩阵和用户、项目信息. 由于可用的属性比较少, 我们建了随机森林进行分类.
论文:
Heng-Ru Zhang, Fan Min, Three-way recommender systems based on random forests, Knowledge-Based Systems 91 (2016) 275–286.
点击下载
第二个工作针对的是评分矩阵, 讨论了推荐阈值的问题: 在训练集上最优的阈值, 在测试集上也几乎是最优的. 这是真个好消息.
论文:
Heng-Ru Zhang, Fan Min, Bing Shi, Regression-based three-way recommendation, Information Sciences 378 (2017) 444–461.
点击下载
4.6 交互式推荐
Henry 早期作品. 期刊一般, 但引用也不错, google scholar 显示有 35 次.
论文:
Heng-Ru Zhang, Fan Min, Xu He, Yuan-Yuan Xu, A hybrid recommender system based on user-recommender interaction, Mathematical Problems in Engineering 2015 (2015) 1–11.
我们将自适应学习的方式用于交互推荐. 其实这篇论文投 IEEE Access 挺可惜的 (这个期刊收稿太多声誉变差), 但硕士生要毕业, 时间太紧没办法.
论文:
Qi Huang, Yuan-Yuan Xu, Yong Chen, Heng-Ru Zhang, Fan Min. An Adaptive Mechanism for Recommendation Algorithm Ensemble. IEEE Access. (2019-01)10331-10342.
点击下载
5. 进一步工作思路
本节列出一些工作思路. 你可以认为很有价值, 也可以认为很不靠谱, 反正两者是相近的.
5.7 去噪与样本选择
Title: Self-paced matrix factorization for recommendation
说明: 与去噪相反, 从简单数据开始进行拟合, 逐步增加.
Step 1. 生成两个子矩阵
U
\mathbf{U}
U 和
V
\mathbf{V}
V, 它们比较简单 (平滑), 且仅需要对少量数据进行良好的拟合;
Step 2. 将拟合得比较好的数据挑出来 (简单样本);
Step 3. 使用当前的简单样本更新
U
\mathbf{U}
U 和
V
\mathbf{V}
V, 增加其复杂性, 且增加拟合的能力;
Step 4. if (简单样本集合足够大) 结束; else goto Step 2;
如何控制模型复杂度, 这些关键细节就不透露了.
Title: Matrix factorization with limited loss for recommendation
说明: 现在的损失函数, 大多用 1 范数、2 范数之类. 其中, 2 范数对少量预测效果比较差的点惩罚更大. 可以设计其它的损失函数, 例如, 有限损失函数.
优点:
a) 预测效果很差的样本 (评分) 并不能对模型造成很大的影响;
b) 并不需要去除或改变样本.
如何选择损失函数, 这些关键细节就不透露了.
6. 作业
所有作业均写到 CSDN, 交链接即可.
6.1 画一个思维导图, 描述你对推荐系统的理解.
6.2 找到并运行推荐系统代码, 进行结果分析.
6.3 描述你自己的新想法.
6.4 描述你对本贴的疑问 (也可在本贴留言).
未完待续