基于用户和基于物品的协同过滤属于 memory- based 方法,在计算时把评分矩阵加载到内存中,直接计算相似度进而计算预测评分。而矩阵分解的方法则是model-based 的方法,在线下直接计算出用户和物品的稠密向量表示,线上则直接用该稠密向量表示计算出预测评分。
SVD分解是奇异值分解,只有满秩的方阵可以做特征值分解,而任何实矩阵都可以做奇异值分解。公式可以表述如下:
A = U ∑ V T A=U\sum V^{T} A=U∑VT
在推荐系统中A代表item-user矩阵,即行向量是item向量,列向量是user向量。V是变换后的user向量,U是变换后的item向量。取前k维则可得到稠密表示。对于新出现的用户则可得到在变化后的空间中的表示如下:
u = X × U k × ∑ 2 − 1 u=X\times U_{k}\times \sum _{2} ^{-1} u=X×Uk×2∑−1
可以使用压缩后的user向量计算user间的相似度,再通过其他用户对某物品的评分来计算目标用户对该物品的评分。
直接使用SVD分解的一个问题是item-user评分矩阵往往是稀疏的,大部分地方没有评分,即元素是缺失的。奇异值分解要求矩阵是稠密的,也就是说SVD不允许待分解矩阵中存在空白的部分。一个解决的办法是用用户评分的均值去填充这些空白部分,但是这样精度会有所下降,于是有一种改进的矩阵分解的方法提出来了。
改进的方法是直接分解得到矩阵U,V。使得:
A m × n ≈ U m × k V n × k T A_{m\times n}\approx U_{m\times k}V_{n\times k}^{T} Am×n≈Um×kVn×kT
通过将用户和物品都映射到一个k维空间中,对于每个物品都得到一个向量q,每一个用户也都得到一个向量p。通过计算p和q之间的点积得到用户对特定物品的评分预测值。即:
r ^ u i = p u q i T \hat{r}_{ui}=p_{u}q_{i}^{T} r^ui=puqiT
一般损失函数定义为预测评分和实际评分之间的平方误差加上正则项。即:
min q ∗ , p ∗ ∑ ( u , i ) ∈ κ ( r u i − p u q i T ) 2 + λ ( ∣ ∣ q i ∣ ∣ 2 + ∣ ∣ p u ∣ ∣ 2 ) \min_{q^{* },p^{* } } \sum_{(u,i) \in \kappa }{(r_{ui} - p_{u}q_{i}^{T})^{2} + \lambda (||q_{i}||^{2} + ||p_{u}||^{2})} q∗,p∗min(u,i)∈κ∑(rui−puqiT)2+λ(∣∣qi∣∣2+∣∣pu∣∣2)
学习过程为:
给分解后的U矩阵和V矩阵随机初始化元素值;
用U和V计算预测后的分数;
计算损失函数值;
按照梯度下降的方向更新U和V中的元素值;
重复步骤2到4,直到达到停止条件。
对上述SVD算法做一定的改进。首先考虑不同个体评分的差异性,有些用户倾向于给高分,有些用户倾向于给低分,因此可以把这部分抽取出来,将评分表示为:
r ^ u i = μ + b i + b u + p u q i T \hat{r}_{ui}=\mu+b_{i}+b_{u}+p_{u}q_{i}^{T} r^ui=μ+bi+bu+puqiT
从左到右依次表示:全局平均分,物品的评分偏置,用户评分的偏置,用户和物品之间的兴趣偏好。
目标函数变为:
min
q
∗
,
p
∗
∑
(
u
,
i
)
∈
κ
(
r
u
i
−
μ
−
b
i
−
b
u
−
p
u
q
i
T
)
2
+
λ
(
∣
∣
q
i
∣
∣
2
+
∣
∣
p
u
∣
∣
2
+
b
i
2
+
b
u
2
)
\min_{q^{* },p^{* } } \sum_{(u,i) \in \kappa }{(r_{ui} - \mu - b_{i} - b_{u} - p_{u}q_{i}^{T})^{2} + \lambda (||q_{i}||^{2} + ||p_{u}||^{2} + b_{i}^{2} + b_{u}^{2})}
q∗,p∗min(u,i)∈κ∑(rui−μ−bi−bu−puqiT)2+λ(∣∣qi∣∣2+∣∣pu∣∣2+bi2+bu2)
和基本的SVD相比,多学习两个参数:用户偏置和物品偏置。学习算法不变。
除了上述的梯度下降法来优化目标函数外,还有一种求解分解后矩阵的方法,即facebook提出来的交替最小二乘法。即:
要找到矩阵P、Q使得:
R m × n = P m × k × Q n × k T R_{m\times n}=P_{m\times k}\times Q_{n\times k}^{T} Rm×n=Pm×k×Qn×kT
则有;
P m × k = R m × n × Q n × k − 1 P_{m\times k}=R_{m\times n}\times Q_{n\times k}^{-1} Pm×k=Rm×n×Qn×k−1
即R矩阵乘以Q矩阵的逆矩阵就得到了结果。反之知道了P求Q也一样。交替最小二乘法的基本思路为:
- 初始化随机矩阵Q里面的元素值;
- 把Q矩阵当做已知的,直接用线性代数的方法求矩阵P;
- 得到了矩阵P后,把P当做已知的,回去求解矩阵Q;
- 上面两个过程交替进行,一直到误差可以接受为止。
- 即通过一步一步迭代的方式求解。