线性代数笔记:概率矩阵分解 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 torchY=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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy笔记 linalg
- 下一篇: pytorch笔记: 处理inf和nan