首先我們現在有乙個矩陣\(r_\),其中\(r_\)代表第\(i\)個使用者對第\(j\)個商品的喜愛程度。
\(lmf\)演算法認為每個商品上面都有一些隱因子,而顧客的喜愛程度是由這些隱因子來決定的。因此便可以將\(r_\)分解成\(p_ \times q_\)的形式。
矩陣\(p_\)代表了這\(m\)個使用者對\(f\)個隱因子的喜愛程度,\(q_\)代表這\(f\)個隱因子在這\(n\)個商品上的分布概率。
\[r'_=\sum_^f q_}
\]我們最終的目的是使得\(r_\)和\(r'_ \)盡可能的相近。因此,損失函式為:
\[f(p,q)=\sum-r'_)^2}
\]為了防止過擬合,需要加上乙個正則項來防止\(p_,q_\)過小或過大。
\[f(p,q)=\sum-r'_)^2}+\lambda(\sum^2}+\sum^2})
\]接下來就是對這個函式用梯度下降進行擬合,遞推式為:
\[p_=p_-\alpha\frac
\]\[q_=q_-\alpha\frac
\]這樣我們採用梯度下降演算法即可獲得\(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)
推薦演算法 矩陣分解
相關位址 矩陣分解是乙個非常優雅的推薦演算法,因為當設計到矩陣分解時,我們通常不會太多地區思考哪些專案將停留在所得到矩陣的列和行中。但是其使用這個推薦引擎,我們清楚地看到,u是第i個使用者的興趣向量,v是第j個電影的引數向量。所以我們可以通過u和v的點積來估算x 第i個使用者對第j個電影的評分 我們...
推薦系統 04 矩陣分解演算法
netflix放出的比賽資料是評分資料,它是推薦系統中評分 模式。本次比賽中,矩陣分解模型大放異彩,最著名的是svd以及其各種變體。2.1 為什麼要矩陣分解 矩陣分解演算法,能很好的解決推薦系統中的評分 問題。其中,通常k比m和n小很多。k怎麼取?用k fold確定。2.2.基礎的svd演算法 sv...
轉推薦演算法 基於矩陣分解的推薦演算法
其中,u1 u5 表示的是5 個不同的使用者,d1 d4 表示的是4 個不同的商品,這樣便構成了使用者 商品矩陣,在該矩陣中,有使用者對每一件商品的打分,其中 表示的是使用者未對該商品進行打分。在推薦系統中有一類問題是對未打分的商品進行評分的 目前推薦系統中用的最多的就是矩陣分解方法,在netfli...