#矩陣分解在打分預估系統中得到了成熟的發展和應用
# from pylab import *
import matplotlib.pyplot as plt
from math import pow
import numpy
def matrix_factorization(r,p,q,k,steps=5000,alpha=0.0002,beta=0.02):
q=q.t # .t操作表示矩陣的轉置
result=
for step in range(steps):
for i in range(len(r)):
for j in range(len(r[i])):
if r[i][j]>0:
eij=r[i][j]-numpy.dot(p[i,:],q[:,j]) # .dot(p,q) 表示矩陣內積
for k in range(k):
p[i][k]=p[i][k]+alpha*(2*eij*q[k][j]-beta*p[i][k])
q[k][j]=q[k][j]+alpha*(2*eij*p[i][k]-beta*q[k][j])
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:
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=[[4., 3., 0., 5., 0.],
[5., 0., 4., 4., 0.],
[4., 0., 5., 0., 3.],
[2., 3., 0., 1., 0.],
[0., 4., 2., 0., 5.]]
r=numpy.array(r)
n=len(r)
m=len(r[0])
k=2p=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為:\n",r)
r_mf=numpy.dot(np,nq.t)
print("經過mf演算法填充0處評分值後的評分矩陣r_mf為:\n",r_mf)
#-------------損失函式的收斂曲線圖---------------
推薦系統ALS矩陣分解
思想類似線性回歸做 大致如下 定義乙個 模型 數學公式 然後確定乙個損失函式,將已有資料作為訓練集,不斷迭代來最小化損失函式的值,最終確定引數,把引數套到 模型中做 矩陣分解的 模型是 損失函式是 我們就是要最小化損失函式,從而求得引數q和p。矩陣分解模型的物理意義 我們希望學習到乙個p代表user...
推薦系統例項 基於矩陣分解
使用matlab嘗試了隨機梯度下降的矩陣分解方法,實現了乙個比較簡單的推薦系統的原理。常用推薦系統的方法有協同過濾,基於物品內容過濾等等。這次是用的矩陣分解模型屬於協同過濾的一種方法,大致原理是通過一定數量的因子來描述各個使用者的喜好和各個物品的屬性。通過隨機梯度下降法分解後得到兩個矩陣,乙個是使用...
推薦系統 04 矩陣分解演算法
netflix放出的比賽資料是評分資料,它是推薦系統中評分 模式。本次比賽中,矩陣分解模型大放異彩,最著名的是svd以及其各種變體。2.1 為什麼要矩陣分解 矩陣分解演算法,能很好的解決推薦系統中的評分 問題。其中,通常k比m和n小很多。k怎麼取?用k fold確定。2.2.基礎的svd演算法 sv...