首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python矩阵分解计算

Python矩阵分解计算
EN

Stack Overflow用户
提问于 2021-01-01 14:20:44
回答 1查看 359关注 0票数 1

我知道这是个很简单的问题,但我没明白。

我执行了代码在这里,它正常工作。

代码语言:javascript
复制
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矩阵:

用户-电影矩阵:(输入)

代码语言:javascript
复制
R = [
     [5,3,0,1],
     [4,0,0,1],
     [1,1,0,5],
     [1,0,0,4],
     [0,1,5,4],
    ]

根据矩阵分解模型,我的输出如下

矩阵分解的输出:

代码语言:javascript
复制
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 ]])

问题

好的酷,学到了接近原始矩阵的值。这个矩阵对我有什么用??

矩阵分解如何计算当前用户给新电影的评分?还是新用户对现有电影的评分?

在协同过滤中,我们计算了用户对一部以前没有看过的电影评分的概率,并根据它提出了建议。在矩阵因式分解中,我们如何做同样的直觉?

EN

回答 1

Stack Overflow用户

发布于 2021-01-01 15:03:06

正如您所说的,我们可以看到,对于现有的评级,我们有非常接近真实值的R矩阵,我们也得到一些未知值的“预测”(值为零)。

在您发送的教程中,您可以很容易地看到U1和U2具有相似的评级,它们都将D1和D2评为很高,而其他用户则更喜欢D3、D4和D5。

您使用的算法可以根据不同的特征(K)将用户(P)和项(Q)关联起来,并且预测也遵循这些关联。

例如,我们可以看到,U4在D3上的预测评分为4.59,因为U4和U5对其他用户和项目的D4评分都很高,等等。这就是为什么生成的矩阵值与原始矩阵如此接近的原因。我希望这能把事情弄清楚!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65530475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档