矩陣分解推薦算法(LMF)


首先我們現在有一個矩陣\(R_{mn}\),其中\(R_{ij}\)代表第\(i\)個用戶對第\(j\)個商品的喜愛程度。

\(LMF\)算法認為每個商品上面都有一些隱因子,而顧客的喜愛程度是由這些隱因子來決定的。因此便可以將\(R_{mn}\)分解成\(P_{mF} \times Q_{Fn}\)的形式。
矩陣\(P_{mF}\)代表了這\(m\)個用戶對\(F\)個隱因子的喜愛程度,\(Q_{Fn}\)代表這\(F\)個隱因子在這\(n\)個商品上的分布概率。

\[R'_{ij}=\sum_{f=1}^F {P_{if}Q_{fj}} \]

我們最終的目的是使得\(R_{ij}\)\(R'_ {ij}\)盡可能的相近。因此,損失函數為:

\[f(P,Q)=\sum{(R_{ij}-R'_{ij})^2} \]

為了防止過擬合,需要加上一個正則項來防止\(P_{if},Q_{fj}\)過小或過大。

\[f(P,Q)=\sum{(R_{ij}-R'_{ij})^2}+\lambda(\sum{(P_{if}^2}+\sum{Q_{fj}^2}) \]

接下來就是對這個函數用梯度下降進行擬合,遞推式為:

\[P_{k+1}=P_{k}-\alpha\frac{\partial f(P,Q)}{\partial P_k} \]

\[Q_{k+1}=Q_{k}-\alpha\frac{\partial f(P,Q)}{\partial Q_k} \]

這樣我們采用梯度下降算法即可獲得\(R'\)矩陣

import matplotlib.pyplot as plt
import numpy
##將R_nm分解成P_nk*Q_km
def MF(R,P,Q,K,times=100000,alp=0.0001,lb=0.01):
  #  Q=Q.T
    for steps in range(times):# 迭代次數
        for u in range(len(R)):
            for i in range(len(R[u])):
                if R[u][i]>0:
                    delta=R[u][i]-numpy.dot(P[u,:],Q[:,i])
                for f in range(K):
                    P[u][f]=P[u][f]+2*alp*(delta*Q[f][i]-lb*P[u][f])#遞推運算
                    Q[f][i]=Q[f][i]+2*alp*(delta*P[u][f]-lb*Q[f][i])
    return P,Q
if __name__ == "__main__":
    R=[
        [5,3,0,1],
        [4,0,0,1],
        [1,1,0,5],
        [1,0,0,4],
        [0,1,5,4]
    ]
    K=2
    n=len(R)
    m=len(R[0])
    ##隨機生成P,Q矩陣
    P=numpy.random.rand(n,K)
    Q=numpy.random.rand(K,m)
    ##矩陣分解
    ansp,ansq=MF(R,P,Q,K)
    ansR=numpy.dot(ansp,ansq)
    print(ansR)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM