目前推薦系統中用的最多的就是矩陣分解方法,在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 將原始的評...