PMF:概率矩陣分解

概率矩陣分解(Probabilistic Matrix Factorization)是推薦系統的基礎演算法之一,在這篇文章中我們將回顧PMF的模型推導,並給出python版演算法實現。

假設有N個用戶和M個物品,那麼就形成了一個N	imes M評分矩陣	extbf{R},通常	extbf{R}非常稀疏,只有不到1%的元素是已知的,而我們要估計出缺失元素的值。PMF假設評分矩陣中的元素	extbf{R}_{i,j}是由用戶的潛在偏好向量U_i和物品的潛在屬性向量V_j的內積決定的,即:

[  	extbf{R}_{i,j}sim mathbf{N}(U_i^TV_j,sigma^2)      ]

其中	extbf{N}表示正態分布。則觀測到的評分矩陣條件概率為:

[p(	extbf{R}|U,V,sigma^2)sim prod_{i=1}^{N}prod_{j=1}^{M}	ext{N}(U_i^TV_j,sigma^2)^{I_{ij}} ]

I_{i,j}是指示函數,若觀測到	extbf{R}_{i,j}則其值為1,否則為0。再假設用戶偏好向量和物品偏好向量也都服從正態分布,即:

[p(U|sigma_U)sim prod_{i=1}^N	ext{N}(0,sigma_U^2	extbf{I}),  p(V|sigma_V)sim  prod_{j=1}^M	ext{N}(0,sigma_V^2	extbf{I})     ]

根據 後驗=先驗 X 似然,可以得出潛變數U,V的後驗概率為:

p(U,V|	extbf{R},sigma_U^2,sigma_V^2,sigma^2)propto p(	extbf{R}|U,V,sigma^2)p(U|sigma_U^2)p(V|sigma_V^2)

兩邊取對數得到:ln{p(U,V|	extbf{R},sigma_U^2,sigma_V^2,sigma^2)}=-frac{1}{2sigma^2}sum_{i=1}^Nsum_{j=1}^MI_{i,j}(	extbf{R}_{i,j}-U_i^TV_j)^2-frac{1}{2sigma_U^2}sum_{i=1}^MU_i^TU_i-frac{1}{2sigma_V^2}sum_{j=1}^NV_j^TV_i

-frac{1}{2}((sum_{i=1}^Nsum_{j=1}^MI_{i,j})lnsigma^2-NKlnsigma_U^2-MKlnsigma_V^2)+C

其中K是潛變數的維度,C是無關常數。最大後驗概率等價最大化目標函數:

E=-frac{1}{2}sum_{i=1}^Nsum_{j=1}^MI_{i,j}(	extbf{R}_{i,j}-U_i^TV_j)^2-frac{lambda_U}{2}sum_{i=1}^MU_i^TU_i-frac{lambda_V}{2}sum_{j=1}^NV_j^TV_i

其中lambda_U=frac{sigma^2}{sigma_U^2},lambda_V=frac{sigma^2}{sigma_V^2},這就變成我們熟悉的最小化平方差和正則化項之和的形式。

U_i,V_j求導:

frac{partial E}{ partial U_i}=(	extbf{R}_{i,j}-U_i^TV_j)V_j-lambda_UU_i

frac{partial E}{ partial V_j}=(	extbf{R}_{i,j}-U_i^TV_j)U_i-lambda_VV_j

用SGD更新U_i,V_j

U_i=U_i+alphafrac{partial E}{ partial U_i}\V_j=V_j+alphafrac{partial E}{ partial V_j}

直到收斂或達到最大迭代次數.

以下是python實現核心代碼:

def train(self,num_user,num_item,train,test,learning_rate,K,regu_u,regu_i,maxiter): U=np.random.normal(0,0.1,(num_user,K)) V = np.random.normal(0, 0.1, (num_item, K)) pre_rmse=100.0 endure_count=3 patience=0 for iter in range(maxiter): loss=0.0 for data in train: user=data[0] item=data[1] rating=data[2] predict_rating=np.dot(U[user],V[item].T) error=rating-predict_rating loss+=error**2 U[user]+=learning_rate*(error*V[item]-regu_u*U[user]) V[item]+=learning_rate*(error*U[user]-regu_i*V[item]) loss+=regu_u*np.square(U[user]).sum()+regu_i*np.square(V[item]).sum() loss=0.5*loss

完整代碼和數據地址:recsys


推薦閱讀:

利用Python,四步掌握機器學習
基於不平衡樣本的推薦演算法研究
SVM推導筆記(一)
從零開始實現KNN分類演算法
word embedding之GLOVE代碼

TAG:機器學習 | 推薦系統 |