线性代数笔记:概率矩阵分解 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)的主要内容,如果未能解决你的问题,请参考以下文章

概率统计笔记:高斯分布的等高线

李宏毅线性代数笔记13:SVD分解

人工智能数学基础 | 目录 | 00

三十分钟理解:矩阵Cholesky分解,及其在求解线性方程组矩阵逆的应用

三十分钟理解:矩阵Cholesky分解,及其在求解线性方程组矩阵逆的应用

概率矩阵分解的损失函数为多少比较正常