我知道这是一个很简单的问题,但我不明白
我执行了代码in here,它工作正常
import numpy
def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02):
'''
R: rating matrix
P: |U| * K (User features matrix)
Q: |D| * K (Item features matrix)
K: latent features
steps: iterations
alpha: learning rate
beta: regularization parameter'''
Q = Q.T
for step in range(steps):
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j] > 0:
# calculate error
eij = R[i][j] - numpy.dot(P[i,:],Q[:,j])
for k in range(K):
# calculate gradient with a and beta parameter
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 = 0
for 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))
# 0.001: local minimum
if e < 0.001:
break
return P, Q.T
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)
M = len(R[0])
K = 2
P = numpy.random.rand(N,K)
Q = numpy.random.rand(M,K)
nP, nQ = matrix_factorization(R, P, Q, K)
nR = numpy.dot(nP, nQ.T)
print(nR)
我知道矩阵分解模型背后的数学原理。我不明白的是测试部分
让我举例说明
我给出的R矩阵如下所示:
用户-电影矩阵:(输入)
R = [
[5,3,0,1],
[4,0,0,1],
[1,1,0,5],
[1,0,0,4],
[0,1,5,4],
]
根据矩阵分解模型,我的输出如下
矩阵分解的输出:
array([[5.05061059, 2.76932235, 6.00910081, 0.99918217],
[3.9246345 , 2.15333139, 4.77284691, 0.9999652 ],
[1.12424323, 0.64611747, 3.53300274, 4.96832669],
[0.94119495, 0.53978842, 2.87426388, 3.9788853 ],
[2.71213676, 1.50889704, 4.83895101, 4.0215367 ]])
问题
好的,很酷,用接近原始矩阵的值学习。这个矩阵将为我做什么
矩阵分解如何计算当前用户对新电影的评分?或者新用户对现有电影的评级
在协同过滤中,我们计算用户对一部以前从未看过的电影的得分概率,并根据该概率提出建议。在矩阵分解中,我们如何做到同样的直觉
正如你所说,我们可以看到,对于现有评级,我们的近似值非常接近R矩阵的真实值,我们还得到了一些未知值的“预测”(零值)
在您发送的教程中,您可以很容易地看到U1和U2具有相似的评级,它们都将D1和D2评级为高,而其他用户更喜欢D3、D4和D5。
您使用的算法可以基于不同的特征(K)关联用户(p)和项目(Q),并且预测也遵循这些关联
例如,我们可以看到,D3上U4的预测评级为4.59,因为U4和U5都将D4评级为高,其他用户和项目也是如此。这就是为什么生成的矩阵值与原始矩阵非常接近。我希望这能把事情弄清楚
相关问题 更多 >
编程相关推荐