推薦系統之矩陣分解 MF 及其python實現

2021-09-25 15:23:33 字數 3210 閱讀 6424

目前推薦系統中用的最多的就是矩陣分解方法,在netflix prize推薦系統大賽中取得突出效果。以使用者-專案評分矩陣為例,矩陣分解就是**出評分矩陣中的缺失值,然後根據**值以某種方式向使用者推薦。今天以「使用者-專案評分矩陣r(m×n)」說明矩陣分解方式的原理以及python實現。

有如下r(5,4)的打分矩陣:(「-」表示使用者沒有打分)

其中打分矩陣r(n,m)是n行和m列,n表示user個數,m行表示item個數

那麼,如何根據目前的矩陣r(5,4)如何對未打分的商品進行評分的**(如何得到分值為0的使用者的打分值)?

——矩陣分解的思想可以解決這個問題,其實這種思想可以看作是有監督的機器學習問題(回歸問題)。

矩陣分解的過程中,,矩陣r可以近似表示為矩陣p與矩陣q的乘積:

矩陣p(n,k)表示n個user和k個特徵之間的關係矩陣,這k個特徵是乙個中間變數,矩陣q(k,m)的轉置是矩陣q(m,k),矩陣q(m,k)表示m個item和k個特徵之間的關係矩陣,這裡的k值是自己控制的,可以使用交叉驗證的方法獲得最佳的k值。為了得到近似的r(n,m),必須求出矩陣p和q,如何求它們呢?

首先令:

對於式子1的左邊項,表示的是r^ 第i行,第j列的元素值,對於如何衡量,我們分解的好壞呢,式子2,給出了衡量標準,也就是損失函式,平方項損失,最後的目標,就是每乙個元素(非缺失值)的e(i,j)的總和最小值

使用梯度下降法獲得修正的p和q分量:

不停迭代直到演算法最終收斂(直到sum(e^2) <=閾值,即梯度下降結束條件:f(x)的真實值和**值小於自己設定的閾值)

為了防止過擬合,增加正則化項

通常在求解的過程中,為了能夠有較好的泛化能力,會在損失函式中加入正則項,以對引數進行約束,加入正則l2範數的損失函式為:

對正則化不清楚的,公式可化為:

使用梯度下降法獲得修正的p和q分量:

-求解損失函式的負梯度

**利用上述的過程,我們可以得到矩陣和,這樣便可以為使用者 i 對商品 j 進行打分:

以下是根據上文的評分例子做的乙個矩陣分解演算法,並且附有**詳解。

from math import *

import numpy

import matplotlib.pyplot as plt

def matrix_factorization(r,p,q,k,steps=5000,alpha=0.0002,beta=0.02): #矩陣因子分解函式,steps:梯度下降次數;alpha:步長;beta:β。

q=q.t # .t操作表示矩陣的轉置

result=

for step in range(steps): #梯度下降

for i in range(len(r)):

for j in range(len(r[i])):

eij=r[i][j]-numpy.dot(p[i,:],q[:,j]) # .dot表示矩陣相乘

for k in range(k):

if r[i][j]>0: #限制評分大於零

p[i][k]=p[i][k]+alpha*(2*eij*q[k][j]-beta*p[i][k]) #增加正則化,並對損失函式求導,然後更新變數p

q[k][j]=q[k][j]+alpha*(2*eij*p[i][k]-beta*q[k][j]) #增加正則化,並對損失函式求導,然後更新變數q

er=numpy.dot(p,q)

e=0for i in range(len(r)):

for j in range(len(r[i])):

if r[i][j]>0:

e=e+pow(r[i][j]-numpy.dot(p[i,:],q[:,j]),2) #損失函式求和

for k in range(k):

e=e+(beta/2)*(pow(p[i][k],2)+pow(q[k][j],2)) #加入正則化後的損失函式求和

if e<0.001: #判斷是否收斂,0.001為閾值

break

return p,q.t,result

if __name__ == '__main__': #主函式

r=[ #原始矩陣

[5,3,0,1],

[4,0,0,1],

[1,1,0,5],

[1,0,0,4],

[0,1,5,4]

]r=numpy.array(r)

n=len(r) #原矩陣r的行數

m=len(r[0]) #原矩陣r的列數

k=3 #k值可根據需求改變

p=numpy.random.rand(n,k) #隨機生成乙個 n行 k列的矩陣

q=numpy.random.rand(m,k) #隨機生成乙個 m行 k列的矩陣

np,nq,result=matrix_factorization(r,p,q,k)

print(r) #輸出原矩陣

r_mf=numpy.dot(np,nq.t)

print(r_mf) #輸出新矩陣

#畫圖plt.plot(range(len(result)),result)

plt.xlabel("time")

plt.ylabel("loss")

plt.show()

推薦系統ALS矩陣分解

思想類似線性回歸做 大致如下 定義乙個 模型 數學公式 然後確定乙個損失函式,將已有資料作為訓練集,不斷迭代來最小化損失函式的值,最終確定引數,把引數套到 模型中做 矩陣分解的 模型是 損失函式是 我們就是要最小化損失函式,從而求得引數q和p。矩陣分解模型的物理意義 我們希望學習到乙個p代表user...

推薦系統之矩陣分解模型注(三)

這個看起來高大上的系列註解文章,到這個階段便是最重要的部分了。有人說,人工智慧就是概率論與統計學,實際上我也認為差不多,只是實現人工智慧的工具,內部的原理是概率論的知識。科普篇 推薦系統之矩陣分解模型 原理篇 推薦系統之矩陣分解模型 實踐篇 推薦系統之矩陣分解模型 1.1 殘差 1.2 殘差平方和 ...

DAY 1(推薦系統之矩陣分解)

給出如上乙個打分矩陣r 5,4 表示未打分,n行m列,n表示user個數,m表示item個數 問題是 如何得到未打分的商品進行有效的 矩陣分解的思想可以解決這個問題,其實這種思想可以看作是有監督的機器學習問題 回歸問題 矩陣r可以近似表示為p與q的乘積 r n,m p n,k q k,m 將原始的評...