FunkSVD
FunkSVD方法是Simon Funk在Netflix电影推荐比赛中使用并取得良好效果,因此得名。
不同传统SVD分解成3个矩阵,FunkSVD为了简化运算,只分解为2个矩阵:
M
m
×
n
=
P
m
×
k
T
Q
k
×
n
M_{m \times n} = P_{m \times k}^T Q_{k \times n}
Mm×n=Pm×kTQk×n
那么怎么得到矩阵P和Q呢?这里巧妙地利用了优化的思想:
假设函数:
y
=
q
j
T
p
i
y = q_j^Tp_i
y=qjTpi
损失函数:
L
=
∑
i
,
j
(
m
i
,
j
−
q
j
T
p
i
)
2
L = \sum_{i,j} (m_{i,j} - q_j^Tp_i)^2
L=i,j∑(mi,j−qjTpi)2
求导:
∂
L
∂
p
i
=
−
2
∑
i
,
j
(
m
i
j
−
q
j
T
p
i
)
q
j
∂
L
∂
q
j
=
−
2
∑
i
,
j
(
m
i
j
−
q
j
T
p
i
)
p
i
\frac{\partial L}{\partial p_i} = -2\sum_{i,j} (m_{ij} - q_j^Tp_i)q_j \\ \frac{\partial L}{\partial q_j} = -2\sum_{i,j} (m_{ij} - q_j^Tp_i)p_i
∂pi∂L=−2i,j∑(mij−qjTpi)qj∂qj∂L=−2i,j∑(mij−qjTpi)pi
随机梯度下降迭代公式(其中
α
\alpha
α是学习率):
p
i
=
p
i
+
α
(
m
i
j
−
q
j
T
p
i
)
q
j
q
j
=
q
j
+
α
(
m
i
j
−
q
j
T
p
i
)
p
i
p_i = p_i + \alpha (m_{ij} - q_j^Tp_i)q_j \\ q_j = q_j + \alpha (m_{ij} - q_j^Tp_i)p_i
pi=pi+α(mij−qjTpi)qjqj=qj+α(mij−qjTpi)pi
以一个实际例子进行说明:
假设用户商品矩阵 M 4 × 3 M_{4 \times 3} M4×3为:
Item 1 | Item 2 | Item 3 | |
---|---|---|---|
User 1 | 1 | 4 | |
User 2 | 5 | ||
User 3 | 1 | 2 | |
User 4 | 4 | 3 |
随机初始化矩阵 P 4 × 2 T P_{4 \times 2}^T P4×2T和 Q 2 × 3 Q_{2 \times 3} Q2×3
Factor 1 | Factor 2 | |
---|---|---|
User 1 | 0.1 | 0.2 |
User 2 | 0.9 | 0.7 |
User 3 | 0.3 | 0.5 |
User 4 | 0.4 | 0.1 |
Item 1 | Item 2 | Item 3 | |
---|---|---|---|
Factor 1 | 0.1 | 0.2 | 0.1 |
Factor 2 | 0.5 | 0.7 | 0.3 |
根据随机梯度下降迭代公式,一次迭代,学习率 α \alpha α设定为0.01:
p
i
p_i
pi:
p
11
=
0.1
+
0.01
×
[
1
−
(
0.1
×
0.1
+
0.2
×
0.5
)
]
×
0.1
=
0.10089
p
12
=
0.2
+
0.01
×
[
1
−
(
0.1
×
0.1
+
0.2
×
0.5
)
]
×
0.5
=
0.20445
p_{11} =0.1 + 0.01 \times [1- (0.1 \times 0.1 + 0.2 \times 0.5)] \times 0.1 = 0.10089 \\ p_{12} =0.2 + 0.01 \times [1- (0.1 \times 0.1 + 0.2 \times 0.5)] \times 0.5 = 0.20445 \\
p11=0.1+0.01×[1−(0.1×0.1+0.2×0.5)]×0.1=0.10089p12=0.2+0.01×[1−(0.1×0.1+0.2×0.5)]×0.5=0.20445
q
j
q_j
qj:
q
11
=
0.1
+
0.01
×
[
1
−
(
0.1
×
0.1
+
0.2
×
0.5
)
]
×
0.1
q
21
=
0.5
+
0.01
×
[
1
−
(
0.1
×
0.1
+
0.2
×
0.5
)
]
×
0.2
q_{11} =0.1 + 0.01 \times [1- (0.1 \times 0.1 + 0.2 \times 0.5)] \times 0.1 \\ q_{21} =0.5 + 0.01 \times [1- (0.1 \times 0.1 + 0.2 \times 0.5)] \times 0.2 \\
q11=0.1+0.01×[1−(0.1×0.1+0.2×0.5)]×0.1q21=0.5+0.01×[1−(0.1×0.1+0.2×0.5)]×0.2
可以看到,User 1对Item 1的评分数据,就可以更新矩阵P的第一行和矩阵Q的第一列。
BiasSVD
BiasSVD考虑了用户的偏好。比如某些用户可能
SVD++
SVD++考虑了用户的隐式行为。比如用户对商品虽然没有评分,但有浏览、加入购物车的行为。
总结
1、上述SVD类方法都面临"冷启动"问题,比如新用户、新商品,也就是说,如果评分矩阵出现了整行或者整列都没有评分的情况下,则这些方法都是不可行的。
参考文章:
[1] 《现代推荐算法》矩阵分解系列(SVD,FunkSVD,BiasSVD)原理
[2] How Does the Funk Singular Value Decomposition Algorithm work in Recommendation Engines?
[3] 推荐系统中的矩阵分解