线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)

本文详细介绍了概率矩阵分解(PMF)模型,包括其两大假设:观测噪声服从高斯分布和用户及物品特征矩阵的高斯先验。通过贝叶斯公式推导出特征矩阵的后验分布,并提出最小化平方差和正则化项的目标函数。此外,还讨论了如何使用SGD优化目标函数,以及PMF模型的改进策略,如使用logistic函数限制评分范围和ConstrainedPMF来约束用户特征,确保评分更接近真实。最后,利用Einstein乘积实现约束条件,确保用户特征向量的计算准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概率矩阵分解模型可以解决大规模、稀疏且不平衡的数据。

1 PMF的两点假设

1.1.观测噪声(观测评分矩阵和近似评分矩阵之差)服从高斯噪声的正态分布

        观测评分矩阵是ground truth的矩阵,我们记为R;近似评分矩阵是通过矩阵分解的方法求得的矩阵

  •         由这一条假设我们知道,R与 之间的差距服从零均值的高斯分布,也即:

         

  •         将 移到右边去,有:

        ·

  •          而在矩阵分解问题里面,观测评分矩阵可以表示为用户潜在特征矩阵P和物品潜在特征矩阵Q的乘积形式,即:

                \hat{R}=PQ^T

  •          将上面两条合并,有:

          

 于是观测评分矩阵对于特征矩阵P、Q,误差σ的条件概率为

 其中:

N用户数
M物品数
P用户潜在特征矩阵
Q物品潜在特征矩阵
R 观测评分矩阵(ground truth的矩阵)
\sigma^2误差项
I_{ui}指示函数,表示如果用户u对物品i有过评分,则其值为1,否则为0

相当于对每一项(u-ζ ),我们都去计算相应的条件概率,然后求和

1.2.用户潜在特征矩阵P和物品潜在特征矩阵Q服从一个均值为0的高斯先验

                                

                                 

2 用户和物品的特征矩阵的后验分布

由贝叶斯公式可知用户和物品的特征矩阵的后验分布如下:

p(P,Q|R,\sigma^2,\sigma_p^2,\sigma_Q^2)=\frac{p(P,Q,R,\sigma^2,\sigma_p^2,\sigma_Q^2)}{p(R,\sigma^2,\sigma_p^2,\sigma_Q^2)}

                                    =\frac{p(R|P,Q,\sigma^2,\sigma_p^2,\sigma_Q^2)}{p(R,\sigma^2,\sigma_p^2,\sigma_Q^2)}

                                   =\frac{p(R|P,Q,\sigma^2) \times p(P,Q|\sigma_p^2,\sigma_Q^2) \times p(\sigma^2) \times p(\sigma_p^2,\sigma_Q^2)}{p(R,\sigma^2,\sigma_p^2,\sigma_Q^2)}

因为 p(\sigma^2), p(\sigma_p^2,\sigma_Q^2), p(R,\sigma^2,\sigma_p^2,\sigma_Q^2)不会影响P,Q的后验估计,所以:

p(P,Q|R,\sigma^2,\sigma_p^2,\sigma_Q^2) \propto [p(R|P,Q,\sigma^2) \times p(P,Q|\sigma_p^2,\sigma_Q^2)]

                                    \propto [p(R|P,Q,\sigma^2) \times p(P|\sigma_p^2) \times p(Q|\sigma_Q^2)]

对等式两遍同时取ln

 

 复习一下多元高斯分布的概率分布函数:

 于是

 取完ln之后,有:

 同理,有:

lnN(q_i|0,\sigma_Q^2I)=-\frac{N}{2}ln(\sigma_Q^2)-\frac{q_i^Tq_i}{2\sigma_Q^2}+C_Q

lnN(r_{ui}|p_u^Tq_i,\sigma^2)=-\frac{1}{2}ln(\sigma^2)-\frac{(r_{ui}-p_uq_i)^T(r_{ui}-p_uq_i)}{2\sigma^2}+C_R

 代入

有: 

 最大化上式log的后验概率,等价于最小化如下的目标函数J(p,q):

 其中 ,这就是我们熟悉的最小化平方差和正则化项之和的形式

(这里的Fro是Frobenius 范数,见线性代数笔记:Frobenius 范数_UQI-LIUWJ的博客-CSDN博客

 转换成矩阵的形式有:

min( ||I \otimes (R-P^TQ)||_{Fro}+\lambda_p ||P||_{Fro} + \lambda_Q ||Q||_{Fro})

3 优化目标函数 

我们这里采用SGD来进行优化。直到收敛或达到最大迭代次数。

3.1 求解损失函数的负梯度

3.2 根据负梯度变化更新变量

 4 PMF优化小trick

        由于原来的线性高斯模型做预测时,会产生有效评分范围之外的评分值。因此可以使用一个logistic 函数来代替原来的简单的线性高斯模型,使得预测评分值在有效范围内。

        

        因此可以将评分矩阵的条件概率修改如下

         原始评分x∈[1,K]可以通过logistic函数映射到[0,1]区间,然后再去计算

5 Constrained PMF

        PMF被拟合后,用户的特征会趋于先验的均值,因而评分也会接近物品的平均评分。Constrained PMF就是对此进行约束

        我们引入矩阵 W \in R^{K \times M} , Y \in R^{K \times N},其中W表示一个潜在的相似性约束矩阵,Y表示用户潜在特征的一个补偿矩阵(先验分布均值之上,属于各个用户的偏移量)

        于是每个用户对应的特征向量为:

        

        这里I还是指示矩阵(P的每一列还是用户的特征)

 于是条件分布为:

同样根据PMF,此时的目标函数为

 

 

5.1 爱因斯坦乘积实现constrain

 

这一部分怎么实现,我想了一段时间

 我们先定义几个数据:

import torch

Y=torch.arange(12).reshape(3,4)
'''
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
'''
W=torch.arange(6).reshape(3,2)
'''
tensor([[0, 1],
        [2, 3],
        [4, 5]])
'''
i=torch.arange(8).reshape(4,2)
'''
tensor([[0, 1],
        [2, 3],
        [4, 5],
        [6, 7]])
'''

根据要求,Yi表示Y的第i列,Yi受到以下部分的影响第二个式子的分布是I第i列的和,我们记为sum(I,i)

Y_i \leftarrow (I_{i1}W_1+I_{i2}W_2+ \dots +I_{iM}W_M)/sum(I,i)

对于Y的每一个元素:

Y_{ji} \leftarrow (I_{i1}W_{j1}+I_{i2}W_{j2}+ \dots +I_{iM}W_{jM})/sum(I,i)

结合python 笔记:爱因斯坦求和 einsum_UQI-LIUWJ的博客-CSDN博客的知识,我们可以用如下形式表示之

np.einsum('bc,ac->ab',i,W)/torch.sum(i,axis=1)
'''
tensor([[1.0000, 0.6000, 0.5556, 0.5385],
        [3.0000, 2.6000, 2.5556, 2.5385],
        [5.0000, 4.6000, 4.5556, 4.5385]], dtype=torch.float64)
'''

与之对比,我们就最暴力的方法来计算这个,结果是一样的:

a0=(W[:,1]*i[0,1]+W[:,0]*i[0,0])/(0+1)
a1=(W[:,1]*i[1,1]+W[:,0]*i[1,0])/(2+3)
a2=(W[:,1]*i[2,1]+W[:,0]*i[2,0])/(4+5)
a3=(W[:,1]*i[3,1]+W[:,0]*i[3,0])/(6+7)
torch.cat((a0.reshape(3,1),
           a1.reshape(3,1),
           a2.reshape(3,1),
           a3.reshape(3,1)),1
'''
tensor([[1.0000, 0.6000, 0.5556, 0.5385],
        [3.0000, 2.6000, 2.5556, 2.5385],
        [5.0000, 4.6000, 4.5556, 4.5385]])
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值