推荐系统: 问题、算法与研究思路

推荐系统最常见的应用就是商品推荐, 网购的兴起使得这个方向备受关注. 本文描述推荐系统的基础知识与个人想法. 注意事项:

  1. 相关的基础知识、示例, 读者自行到 CSDN 或知乎查找学习.
  2. 这里的符号系统, 只保证内部的完备性. 如果要写论文, 应遵守参考资料的习惯.
  3. 看贴要回, 请在下方留言.

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. 分两种情况讨论:

  1. 如果仅知道用户是否浏览过商品, 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 为浏览矩阵.
  2. 如果用户要给购买的商品过分, 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×RdtR.
优化目标: 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.

说明:

  1. 本问题强行把三个表合成了一个决策表, 对象个数为 ∣ Ω ∣ |\Omega| Ω, 条件属性个数为 d u + d i d_u + d_i du+di, 决策属性取值为 [ 1 , 5 ] [1, 5] [1,5], 即 1 至 5 的实数. 因此为一个经典的回归问题.
  2. 为简便起见, 假设用户信息、商品信息的基础数据均为实型.
  3. 优化目标为最小化训练集上的 MSE, 也可以按 MAE 的方式来写.
  4. 学习到的函数 f f f 既可用于已有用户和商品, 也可用于新用户和新商品, 因此这类推荐适合于冷启动 (cold start recommendation).
  5. 为获得相应的评价指标, 需要将原始的数据集分为训练、测试集, 即将原始评分矩阵的某些非 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. 现在变成了一个二分类问题.
  2. 优化目标为最小化误差 (最大化分类精度). 由于是二分类, 这里使用平方还是绝对值都等价.
  3. 优化目标计算时, 考虑了所有可能用户、项目组合, 共 [ 1.. n ] × [ 1.. m ] [1..n] \times [1..m] [1..n]×[1..m] 种. 然而, 除了为 1 1 1 的值, 其它的值是否正确根本无从考证.
  4. 为获得相应的评价指标, 需要将原始的数据集分为训练、测试集, 即将原始评分矩阵的某些 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)Ω(uivjTrij)2.

说明:

  1. 除了矩阵分解, 我暂时找不到其它模型来描述评分预测. 基于邻域的方法 (lazy learning) 没有模型, 所以无法描述这种预测.
  2. 评价指标的计算与 问题 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.

说明:

  1. 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. 评价指标的计算与 问题 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)

说明:

  1. m 01 m_{01} m01 表示未向用户推荐他喜欢的商品所付出的代价 (未起到促销作用); m 10 m_{10} m10 表示向用户推荐了他不喜欢的商品所付出的代价 (推荐系统的信誉受损).
  2. 一般情况下假设 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)

说明:

  1. 推荐系统的行为现在有三种: 0 表示不推荐, 1 表示推荐, 2 表示发优惠券 (promotion). 这是本问题的特点. 它也是对现实系统更好的建模.
  2. (5) 式与 (4) 式仅有 k k k 的取值范围不同.
  3. 代价敏感推荐本质上是对优化目标的泛化, 它与其它的问题扩展是正交的. 换言的, 只要是推荐问题, 都可以有其代价敏感版本.

问题 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)
说明:

  1. 在对 u i u_i ui 进行推荐的时候, R \mathbf{R} R i i i 行的数据对于推荐系统而言是未知的. 只能随着交互过程逐渐揭晓, 且仅可获得推荐列表的项目评分. 这样才能模拟现实中的推荐过程.
  2. 交互推荐强调的是一种场景, 可以与 问题 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×vjvivj(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)={1km}vik=1 or vjk=1}{1km}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\} kmin{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)uivjTrij(9)
R ′ = U V T \mathbf{R}' = \mathbf{U} \mathbf{V}^{\mathrm{T}} R=UVT.

说明:

  1. 式 (9) 仅最小化在训练集中的误差, 这是机器学习的一般方式. 测试集上的误差只能做为算法效果的评价指标, 而训练集中的误差用于获得预测模型. (2) 式已经说清楚了.
  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 就是相应用户对项目的评分预测. 如果在训练集上拟合得好, 我们就相信在测试数据上也预测得好.
  3. 评分矩阵一般很稀疏, 即 0 占了绝大多数 (可能 99%). 因为用户只会购买所有商品的一小部分.
  4. 这里我们习惯于使用转置的方式来描述 V \mathbf{V} V v i \mathbf{v}_i vi.
  5. 没有除以 ∣ Ω ( 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)(uivjTrij)2+λ(U22+V22)(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 U22=1in,1jkuij2 为 2 范数, ∥ V ∥ 2 2 \|\mathbf{V}\|_2^2 V22 同理. 加上正则项的意思是: 使得 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/413/4=0.
可以发现: 这两个用户的购买物品集合相差很大, 相同物品的评分差异也很大, 其距离居然为 0.
郑梅坚持说自己的实验结果不错, 于是我花了半小时自己把代码实现了一遍. 不是我写得快, 而是代码量太少. 果然她是对的! 所以呢, 机器学习不管什么反例, 效果好就行. 后来我强行解释了一波: 两个学生参考高考, 录取的时候只看总分 (等价于平均分), 而并没考虑其偏科情况.
说明:

  1. 可以先将每个用户的平均分进行预计算, 这时候距离计算的时间复杂度就是 O ( 1 ) O(1) O(1) 而不是 O ( m ) O(m) O(m).
  2. 我们不仅考虑了 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 描述你对本贴的疑问 (也可在本贴留言).


未完待续

你可能感兴趣的:(推荐系统,人工智能)