
首先對Probabilistic Matrix Factorization這篇論文的核心公式進行講解和推導;然后用Python代碼在Movielens數據集上進行測試實驗。
一、 背景知識
文中作者提到,傳統的協同過濾算法有兩個不足:
1).不能很好地處理規模非常大的數據;
2). 不能很好地處理那些只給出極少評分的用戶。
概率矩陣分解則能很好的解決上述提到的這兩個問題。
二、算法推導
2.1 定義和描述
假設有

假設關于已知評分數據的條件分布滿足高斯分布:
其中,
再假設用戶潛在特征向量和商品潛在特征向量都服從均值為0的高斯先驗分布,即:
注意公式(2)中的
然后,計算
等式兩邊取對數
2.2 關鍵處推導
此處插入取對數收到得到公式(3)的詳細推導過程(對其中
其中
2.3 最優化目標函數
求等式(3)的最大值,等價于最小化目標函數:
其中,
等式
然后用隨機梯度下降法(SGD)更新
其中
令
直到滿足收斂條件或迭代至最大的迭代次數。
2.4 改進和優化
論文中還提到,用
原始評分
三、程序實現
3.1 代碼及實現
偽代碼如下所示:
Input: the number of latent factor K, the learning rata eta,
regularization parameters lambda_1,lambda_2, the max iteration Step,
and the rating matrix RInitialization: Initialize a random matrix for user matrix U and item matrix Vfor t = 1, 2,...Step dofor (u,i,r) in Rmake prediction pr=Ui^T*Vjerror e=r-prupdate Ui and Vj by (5) and (6)the algorithm suffers a loss (Ui, Vj, r)end for
end for
下面用python,在 MovieLens 100K 這個數據集上實現PMF算法。
核心代碼如下所示:
def update(p, q, r, learning_rate=0.001, lamda_regularizer=0.1):error = r - np.dot(p, q.T) p = p + learning_rate*(error*q - lamda_regularizer*p)q = q + learning_rate*(error*p - lamda_regularizer*q)loss = 0.5 * (error**2 + lamda_regularizer*(np.square(p).sum() + np.square(q).sum()))return p,q,loss
3.2 實驗結果
當訓練集:測試集=8:2時,可得到最終的RMSE為0.92左右,實驗曲線如下所示:


完整項目下載地址:
https://github.com/XiuzeZhou/Recommender-Systems?github.com更多 矩陣分解內容和程序,請看我的最新博文:
周秀澤:推薦系統系列之二:矩陣分解家族?zhuanlan.zhihu.com
參考資料:
[1] 小木,推薦系統之概率矩陣分解的詳細推導過程(Probabilistic Matrix Factorization,PMF)
[2] 追溯星霜,PMF:概率矩陣分解