协同过滤-矩阵分解算法
《深度学习/推荐系统》读书笔记
(其实矩阵分解和协同过滤已经没有特别大的联系了)
2006年,在Netfilx举办的推荐算法竞赛中Netflix Prize Challenge中,以矩阵分解为主的推荐算法大放异彩,拉开了矩阵分解算法在业界流行的序幕。
Netflix 推荐场景–利用用户的行为历史,在Netflix视屏应用中为用户推荐喜欢的电影、电视剧或者纪录片。
矩阵分解算法基本思路–将用户和视频都表示成一个隐向量,计算每个用户隐藏向量和所有视频隐向量之间内积,将内积最大的topK的视屏推荐给目标用户。
m
∗
n
m*n
m∗n维共现矩阵
R
R
R,分解成
m
∗
k
m*k
m∗k维用户矩阵U,和
k
∗
n
k*n
k∗n维物品矩阵
V
V
V
R
=
U
∗
V
R=U * V
R=U∗V
则用户
u
u
u对物品i的重构评分为(
p
u
p_u
pu-U矩阵的行向量,
q
i
q_i
qi-V矩阵的列向量):
r
^
u
i
=
q
i
T
p
u
(2.6)
\hat{r}_{ui}=q^T_ip_u\tag{2.6}
r^ui=qiTpu(2.6)
- 迷惑点1:用户隐藏向量和所有视频隐向量之间内积,其实就是重构用户对每一部电影的品评分,推荐重构评分高的电影 是如何 实现了用户对未评分电影的预测的呢?
- 矩阵分解中缺失值该怎么处理呢?就是用户没有评分的项目。
矩阵分解的方法:特征值分解、奇异值分解、梯度下降
特征值分解–只能作用于方阵,不适用于分解用户-物品矩阵
1.奇异值分解
Singular Value Decomposition-SVD
M
=
U
m
∗
m
Σ
m
∗
n
V
n
∗
n
M= U_{m*m}\Sigma_{m*n} V_{n*n}
M=Um∗mΣm∗nVn∗n
近似分解:
M
≈
U
m
∗
k
Σ
k
∗
k
V
k
∗
n
M\approx U_{m*k}\Sigma_{k*k} V_{k*n}
M≈Um∗kΣk∗kVk∗n
缺点:不适用于大规模稀疏矩阵的分解
- SVD要求原始共现矩阵是稠密的,需要对缺失的元素进行填充。
- SVD时间复杂度高( O ( m n 2 ) O(mn^2) O(mn2))
2.梯度下降
SVD的缺点使得研究者门另求他路–梯度下降法(矩阵分解的主要方法)
基本思路–参数化
q
i
T
p
u
q^T_ip_u
qiTpu,使其和原始评分
r
u
i
r_{ui}
rui的差距尽量小
正则化目标函数:
min
q
∗
,
p
∗
∑
(
u
,
i
)
∈
K
(
r
u
i
−
q
i
T
p
u
)
2
+
λ
(
∣
∣
q
i
∣
∣
2
+
∣
∣
p
u
∣
∣
2
)
(2.8)
\min_{q^*,p^*}\sum_{(u,i)\in K}(r_{ui}-q^T_ip_u)^2+\lambda(||q_i||^2+||p_u||^2)\tag{2.8}
q∗,p∗min(u,i)∈K∑(rui−qiTpu)2+λ(∣∣qi∣∣2+∣∣pu∣∣2)(2.8)
为了消除用户和物品打分的偏差,修正目标函数:
min
q
∗
,
p
∗
∑
(
u
,
i
)
∈
K
(
r
u
i
−
μ
−
b
u
−
b
i
−
q
i
T
p
u
)
2
+
λ
(
∣
∣
q
i
∣
∣
2
+
∣
∣
p
u
∣
∣
2
+
b
u
2
+
b
i
2
)
\min_{q^*,p^*}\sum_{(u,i)\in K}(r_{ui}-\mu-b_u-b_i-q^T_ip_u)^2+\lambda(||q_i||^2+||p_u||^2+b_u^2+b_i^2)
q∗,p∗min(u,i)∈K∑(rui−μ−bu−bi−qiTpu)2+λ(∣∣qi∣∣2+∣∣pu∣∣2+bu2+bi2)
其中: μ \mu μ是全局偏差常数, b i b_i bi是物品偏差系数(物品i收到的平均评分), b u b_u bu用户偏差系数(用户u给出评分的均值)
3.矩阵分解方法的优缺点
优点:
- 泛化能力强–数据稀疏时的相似度也能衡量
- 空间复杂度低
- 扩展性和灵活性–用户物品隐向量,与Embedding的思想相似,可以与其他特征进行拼接。
缺点:
矩阵分解还是下共现矩阵的基础下进行的。共现矩阵缺点–一个矩阵只能表征用户和物品之间的一种作用关系(点击,购买,评分),特征表示能力弱。不便加入用户、物品的上下文相关特征。