线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)相关的知识,希望对你有一定的参考价值。
概率矩阵分解模型可以解决大规模、稀疏且不平衡的数据。
1 PMF的两点假设
1.1.观测噪声(观测评分矩阵和近似评分矩阵之差)服从高斯噪声的正态分布
观测评分矩阵是ground truth的矩阵,我们记为R;近似评分矩阵是通过矩阵分解的方法求得的矩阵
- 由这一条假设我们知道,R与 之间的差距服从零均值的高斯分布,也即:
- 将 移到右边去,有:
·
- 而在矩阵分解问题里面,观测评分矩阵可以表示为用户潜在特征矩阵P和物品潜在特征矩阵Q的乘积形式,即:
- 将上面两条合并,有:
于是观测评分矩阵对于特征矩阵P、Q,误差σ的条件概率为
其中:
N 用户数 M 物品数 P 用户潜在特征矩阵 Q 物品潜在特征矩阵 R 观测评分矩阵(ground truth的矩阵) 误差项 指示函数,表示如果用户u对物品i有过评分,则其值为1,否则为0 相当于对每一项(u-ζ ),我们都去计算相应的条件概率,然后求和
1.2.用户潜在特征矩阵P和物品潜在特征矩阵Q服从一个均值为0的高斯先验
2 用户和物品的特征矩阵的后验分布
由贝叶斯公式可知用户和物品的特征矩阵的后验分布如下:
因为 不会影响P,Q的后验估计,所以:
对等式两遍同时取ln
复习一下多元高斯分布的概率分布函数:
于是
取完ln之后,有:
同理,有:
代入
有:
最大化上式log的后验概率,等价于最小化如下的目标函数J(p,q):
其中 ,这就是我们熟悉的最小化平方差和正则化项之和的形式
(这里的Fro是Frobenius 范数,见线性代数笔记:Frobenius 范数_UQI-LIUWJ的博客-CSDN博客)
转换成矩阵的形式有:
3 优化目标函数
我们这里采用SGD来进行优化。直到收敛或达到最大迭代次数。
3.1 求解损失函数的负梯度
3.2 根据负梯度变化更新变量
4 PMF优化小trick
由于原来的线性高斯模型做预测时,会产生有效评分范围之外的评分值。因此可以使用一个logistic 函数来代替原来的简单的线性高斯模型,使得预测评分值在有效范围内。
因此可以将评分矩阵的条件概率修改如下
原始评分x∈[1,K]可以通过logistic函数映射到[0,1]区间,然后再去计算
5 Constrained PMF
PMF被拟合后,用户的特征会趋于先验的均值,因而评分也会接近物品的平均评分。Constrained PMF就是对此进行约束
我们引入矩阵 ,其中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的每一个元素:
结合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]])
'''
以上是关于线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)的主要内容,如果未能解决你的问题,请参考以下文章
三十分钟理解:矩阵Cholesky分解,及其在求解线性方程组矩阵逆的应用