目录
推荐系统
- 信息处理的系统,用于预测用户对物品的偏好。
- 推荐系统可以应用在诸多领域:
2.1. 推荐个性化的新闻,视频,音乐,图书,游戏,食品,衣服以及其它各种商品 ;
2.2. 在社交网络里面为你推荐可能会志同道合趣味相同的朋友;
2.3. 在金融市场为客户推荐合适的股票,基金证券等理财产品;
2.3. 婚恋市场里为单身朋友推荐合适的另一半。
推荐系统已经成为许多网站和手机App不可或缺的一部分,他们依靠推荐系统提高商品销量,吸引用户注意力,提高用户活跃度,吸引新用户。
推荐系统类型
- 人工手动生成推荐系统
- 简单的聚合推荐系统:如音乐排行榜,最新上架等
- 真正的个性化,千人千面的推荐系统
如亚马逊(Amazon),淘宝,京东的商品推荐,Netflix的电影推荐
推荐系统模型
-
U:所有的用户集合
-
P:所有的物品集合
-
推荐系统模型 U ∗ P − > R U*P-> R U∗P−>R
-
R:用户对物品的喜好程度,许多信息系统喜欢使用1-5分的评价值来表达,也可以使用喜欢(点赞)或者不喜欢(鄙视)来表达。
推荐值矩阵
可以看出推荐值矩阵是一个不完整的矩阵(稀疏矩阵),因为在大多数情况下一个用户不可能对每个商品的每个属性均作评价。
推荐系统的关键问题
- 收集数据,建立推荐值矩阵:数据具有时效性。一个用户的喜好会随着时间的变化而变化
- 从推荐值矩阵中已知的数据预测未知的数据:这是推荐系统的核心功能
- 建立一个评价体系,用于检验推荐系统的推荐效果:如何知道已建立的推荐系统是不是一个好的推荐系统
1. 收集数据
- 显式收集:
1.1. 请用户为商品打分,点赞和评论
2.2. 挑战在于数据经常不完整,许多用户可能从来不或者很少主动打分,点赞或者留言的方式表达自己的喜好 - 隐式收集
2.1. 有的用户对某个物品的喜爱可能是隐形的,可以通过用户行为来推断用户的喜爱度:
2.1.1 视频网站:用户的行为特征,快进,重播
2.1.2 购物网站:购买行为表达了用户的喜爱,退货行为表达了不喜爱
2. 从推荐值矩阵中已知的数据预测未知的数据
关键的挑战:
- 当用户和物品数量都比较大的情况下,推荐值矩阵通常是一个稀疏矩阵,矩阵中大多数值是未知的。大多数用户可能没有为大多数物品表达喜好
- 冷启动问题
2.1. 新的物品还没有任何用户为它打分
2.2. 新的用户没有任何的打分行为
解决方法:(稀疏)矩阵分解
3. 评估推荐系统
- 离线评估
- 问卷调查
同一个问题,两种形式
所言非所意 - 用户学习(User Study)
不只是算法,针对整个系统,包括用户界面几十人用户的小范围测试能够发现90%左右的大问题 - 在线测试(A/B测试)
基于矩阵分解的推荐系统
- 推荐值矩阵R里有一些值是已知的,如果我们将R分解为两个矩阵U和P,U的每一行代表一个用户画像向量,P的每一行代表一个物品的画像向量
- 如果U和P能够分别准备表达用户和物品画像向量,那么U和 P T P^T PT的乘积R*中的值就应该是推荐值
- 假设用户对物品的喜好的值是取决于几个(假设是k个)因素,我们不知道这些因素是什么,所以我们命名它们为隐性因子
- 假设用户 U i U_i Ui对物品 P j P_j Pj的喜好 R i j R_{ij} Rij是用户画像向量在k个因子上的值与物品画像向量在k个因子上的值的点积 R i j = U i ⋅ P j R_{i j}=\mathrm{U}_{i} \cdot \mathrm{P}_{\mathrm{j}} Rij=Ui⋅Pj
- 如果能够通过分解推荐值矩阵,使得以上的假设在所有已知的推荐值上面是成立的,我们期望这个方式也可以用于预测未知的推荐值
- 如下图
理解推荐系统中的矩阵分解
1. 算法假设
评分( Rating)矩阵
R
∈
R
m
×
n
\mathrm{R} \in R^{m \times n}
R∈Rm×n包含了m个用户(user)对n个物品的评分.假设评分矩阵可以分解为用户矩阵
U
∈
R
m
×
k
\mathrm{U} \in R^{m \times k}
U∈Rm×k和
P
∈
R
n
×
k
P \in R^{n \times k}
P∈Rn×k,使得
R
≈
U
×
P
T
\mathrm{R} \approx U \times \mathrm{P}^{\mathrm{T}}
R≈U×PT
其中k是矩阵分解的秩,决定了U,P的维度;
R
i
j
≈
U
i
⋅
P
j
R_{i j} \approx U_{i} \cdot P_{j}
Rij≈Ui⋅Pj;
R
i
j
R_{i j}
Rij为评分( Rating)矩阵第i行,第j列的元素;
U
i
U_i
Ui为用户矩阵第i行的向量;
P
j
P_j
Pj为物品矩阵第j行的向量;
假设一个评分是由用户和物品的k个影响因子决定的。
2. 算法理解
R
i
j
≈
U
i
⋅
P
j
R_{i j} \approx U_{i} \cdot P_{j}
Rij≈Ui⋅Pj;
使用电影举例,一部电影是有多个演员,导员,风格,故事情节等构成,任何一个观众都对不同的演员,导演,风格,故事情节有不同的喜好;
如果一部电影的演员,导演,风格,故事情节与某一个观众喜好的演员,导演,风格,故事情节比较吻合(类似),那么理论上观众的打分就会高;
通过矩阵分解,我们并没有显式地找出电影的演员,导演,风格,故事情节,但是我们假设
U
i
U_i
Ui就是代表了第i个用户k个这种隐含的喜好特征,
P
j
P_j
Pj就是代表了第j个电影的k个这种隐含特征.
损失函数
目标函数:
(1)
arg
min
U
,
P
∑
(
i
,
j
)
∈
Z
1
2
(
R
i
j
−
U
i
⋅
P
j
)
2
\begin{aligned} \arg \min _{U, P} \sum_{(i, j) \in Z} \frac{1}{2}\left(R_{i j}-U_{i} \cdot P_{j}\right)^{2}\tag{1} \end{aligned}
argU,Pmin(i,j)∈Z∑21(Rij−Ui⋅Pj)2(1)
其中Z = {(i,j):
r
i
j
r_{ij}
rij已知}
损失函数:
(2)
L
i
j
=
1
2
(
R
i
j
−
U
i
⋅
P
j
)
2
\begin{aligned} L_{i j}=\frac{1}{2}\left(R_{i j}-U_{i} \cdot P_{j}\right)^{2}\tag{2} \end{aligned}
Lij=21(Rij−Ui⋅Pj)2(2)
损失函数的梯度
(3) ∂ L i j ∂ U i = ∂ ∂ U i [ 1 2 ( R i j − U i ⋅ P j ) 2 ] = − P j ( R i j − U i ⋅ P j ) ∂ L i j ∂ P j = ∂ ∂ P j [ 1 2 ( R i j − U i ⋅ P j ) 2 ] = − U i ( R i j − U i ⋅ P j ) \begin{aligned} \begin{array}{l}{\frac{\partial L_{i j}}{\partial U_{i}}=\frac{\partial}{\partial U_{i}}\left[\frac{1}{2}\left(R_{i j}-U_{i} \cdot P_{j}\right)^{2}\right]=-P_{j}\left(R_{i j}-U_{i} \cdot P_{j}\right)} \\ {\frac{\partial L_{i j}}{\partial P_{j}}=\frac{\partial}{\partial P_{j}}\left[\frac{1}{2}\left(R_{i j}-U_{i} \cdot P_{j}\right)^{2}\right]=-U_{i}\left(R_{i j}-U_{i} \cdot P_{j}\right)}\end{array}\tag{3} \end{aligned} ∂Ui∂Lij=∂Ui∂[21(Rij−Ui⋅Pj)2]=−Pj(Rij−Ui⋅Pj)∂Pj∂Lij=∂Pj∂[21(Rij−Ui⋅Pj)2]=−Ui(Rij−Ui⋅Pj)(3)
改进的目标函数:加入正则化
(4)
arg
min
U
,
P
∑
(
i
,
j
)
∈
Z
1
2
(
R
i
j
−
U
i
⋅
P
j
)
2
+
λ
[
∑
i
=
1
m
∥
U
i
∥
2
+
∑
i
=
1
n
∥
P
j
∥
2
]
\begin{aligned} \arg \min _{U, P} \sum_{(i, j) \in Z} \frac{1}{2}\left(R_{i j}-U_{i} \cdot P_{j}\right)^{2}+\lambda\left[\sum_{i=1}^{m}\left\|U_{i}\right\|^{2}+\sum_{i=1}^{n}\left\|P_{j}\right\|^{2}\right]\tag{4} \end{aligned}
argU,Pmin(i,j)∈Z∑21(Rij−Ui⋅Pj)2+λ[i=1∑m∥Ui∥2+i=1∑n∥Pj∥2](4)
λ
>
0
\lambda>0
λ>0是正则化参数,添加正则化
λ
[
∑
i
=
1
m
∥
U
i
∥
2
+
∑
i
=
1
n
∥
P
j
∥
2
]
\lambda\left[\sum_{i=1}^{m}\left\|U_{i}\right\|^{2}+\sum_{i=1}^{n}\left\|P_{j}\right\|^{2}\right]
λ[∑i=1m∥Ui∥2+∑i=1n∥Pj∥2]的目的是防止过拟合(在训练集上误差小,在测试集上误差大)
新的梯度下降更新
- 设定k的值,设定学习步长 λ \lambda λ(learning rate),初始化U和P
- 重复以下步骤直到均方差满意为止:遍历Z中的(i,j),Z = {(i,j): r i j r_{ij} rij已知}
(5)
U
i
←
U
i
−
γ
∂
L
i
j
∂
U
i
P
j
←
P
j
−
γ
∂
L
i
j
∂
P
j
\begin{aligned} \begin{array}{l}{U_{i} \leftarrow U_{i}-\gamma \frac{\partial L_{i j}}{\partial U_{i}}} \\ {P_{j} \leftarrow P_{j}-\gamma \frac{\partial L_{i j}}{\partial P_{j}}}\end{array}\tag{5} \end{aligned}
Ui←Ui−γ∂Ui∂LijPj←Pj−γ∂Pj∂Lij(5)
其中
∂
L
i
j
∂
U
i
=
−
P
j
(
R
i
j
−
U
i
⋅
P
j
)
+
λ
U
i
∂
L
i
j
∂
P
j
=
−
U
i
(
R
i
j
−
U
i
⋅
P
j
)
+
λ
P
j
\begin{aligned} \begin{array}{l}{\frac{\partial L_{i j}}{\partial U_{i}}=-P_{j}\left(R_{i j}-U_{i} \cdot P_{j}\right)+\lambda U_{i}} \\ {\frac{\partial L_{i j}}{\partial P_{j}}=-U_{i}\left(R_{i j}-U_{i} \cdot P_{j}\right)+\lambda P_{j}}\end{array} \end{aligned}
∂Ui∂Lij=−Pj(Rij−Ui⋅Pj)+λUi∂Pj∂Lij=−Ui(Rij−Ui⋅Pj)+λPj
基于矩阵分解的推荐系统:关于k
- 假设推荐系统里面有m个用户,n个物品,那么推荐值矩阵的大小为m行n列
- 矩阵分解以后,用户矩阵U的大小为m行k列,物品矩阵P的大小为n行k列
- k决定了U和P的列数.
- 从原理上讲,k是我们直觉上认为有多少个隐含的因素决定了一个用户为什么要喜好某个物品.
- 在现实中,我们无法直接推导出合适的k值,我们一般采用交叉验证(cross validation),通过实验,测试不同的k值产生的平均绝对离差来找到合适的k值.
基于矩阵分解的推荐系统:优点和缺点
优点
- 相对于协同过滤KNN,矩阵分解后预测一个值的计算量比较小.预测的计算就是求两个向量的点积,预测时的计算复杂度和用户以及物品数量无关.
- 相对于基于内容的推荐系统,矩阵分解很好的利用了其它用户对物品打分的数据.
缺点
- 类似于协同过滤KNN,矩阵分解也具有冷启动问题,对于一个新用户,或者一个新物品,因为没有相关的喜好数据,无法做出推荐.
- 假设了用户画像向量和物品画像向量是通过点积得到推荐值,相当于默认了是线性的关系,事实上可能是更加复杂的非线性关系.
补充
评估推荐系统1:离线测试
- 给定一个推荐系统数据集合,可以把这个数据集合按照3/7开分为测试数据集合T和训练数据集合U.可以使用U来训练一个推荐系统,然后在测试集T上面做出预测,比较预测值和真实的值.
- 平均绝对误差:(Mean-Absolute-Error
)
=
∑
(
u
,
p
)
∈
r
∣
r
u
p
−
r
u
p
∗
∣
N
)=\frac{\sum_{(u, p) \in r}\left|r_{u p}-r_{u p}^{*}\right|}{N}
)=N∑(u,p)∈r∣rup−rup∗∣
其中
N: 测试集中推荐值的总数量
r u p r_{up} rup:真实的用户u对物品p的推荐值
r u p ∗ r^*_{up} rup∗:预测的用户u对物品p的推荐值
评估推荐系统2:使用平均绝对离差的问题
忽略了如下情况:
- 预测的多样性
以新闻网站为例,如果一个用户最喜欢的新闻是体育新闻,难道我们就只应该给此用户推荐体育新闻吗?也许不会有用户喜欢自己的新闻App只出现体育新闻.偶尔加入一些金融,八卦也许更合理. - 预测的上下文
对推荐值的预测需要根据用户当前的行为调整,例如一用户相对于<<甄嬛传>>更喜欢<<纸牌屋>>,但是如果用户正在看<<甄嬛传>>的21集,在这个上下文里面需要给<<甄嬛传>>22集的推荐值高于<<纸牌屋>>. - 预测的结果排序
预测的物品在呈现给用户的时候总是需要排序的.平均绝对离差是没有考虑排序的情况.实际上,我们可能最关注的是那些推荐值比较高的情况.因为物品太多了,我们可能只会给用户显示前10个推荐值比较大的物品。
如果一个系统在前10个推荐值大的物品的情况下很准确,而对其余1万个推荐值小的物品情况下不太准确,使用平均绝对离差这种评价方法可能会认为这个系统不好,但是真实世界里面这种系统很可能是我们喜欢的好系统
另一种方式:只考虑排名靠前的k个预测值的误差
评估推荐系统3
- 并不需要预测一个绝对的推荐值,更在意推荐的物品的排序
- 对于测试集中的物品,两两配对,如果预测值的大小比较与实际打分大小顺序一样,则认为是“正确”的预测,否则是“错误的”.最后“正确”的预测占的比例越高则推荐越准确.
代码示例
书籍商品推荐系统:https://github.com/JackUCASer/8.-Recommender-and-MatrixFactorization
参考
[1]. 贪心科技-机器学习特训营课程
[2]. https://surprise.readthedocs.io/en/stable/prediction_algorithms_package.html