使用字典进行矩阵分解和“nan”出现在dictionary.values()中(Using dictionary for matrix factorization and “nan” came up

编程入门 行业动态 更新时间:2024-10-23 11:24:19
使用字典进行矩阵分解和“nan”出现在dictionary.values()中(Using dictionary for matrix factorization and “nan” came up in dictionary.values())

我正在学习并尝试使用LFM(潜在因子模型)构建玩具推荐系统。 所以我在这个页面中找到了关于矩阵分解的一些内容( http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/ )

该页面内的代码可以完美运行。 但是在我的工作中,矩阵应该是稀疏的,因为在初始化之后许多元素仍然是空白的。 所以我用字典重写它,一切搞砸了。

以下是网页中给出的代码:

import numpy def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): Q = Q.T for step in xrange(steps): for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[k][j] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[k][j] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2) for k in xrange(K): e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) if e < 0.001: break return P, Q.T 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) 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)

这段代码可以正常工作。 所以我写下面的代码:

import random def matrix_factorization(R, P, Q, K,steps=5000, alpha=0.0002, beta=0.02): for step in xrange(steps): print 'step',step step += 1 for i in R.keys(): for j in R[i].keys(): eij = R[i][j] - sum([x * y for x in P[i] for y in Q[j]]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[j][k] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[k][j] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in R.keys(): for j in R[i].keys(): e += pow(R[i][j] - sum([x * y for x in P[i] for y in Q[j]]), 2) for k in xrange(K): e += (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) if e < 0.001: break return P,Q if __name__ == '__main__': R = {0:{0:5,1:3,3:1}, 1:{0:4,3:1}, 2:{0:1,1:1,3:5}, 3:{0:1,3:4}, 4:{1:1,2:5,3:4} } N = len(R.keys()) M = 4 K = 4 P = dict() Q = dict() for i in xrange(N): P[i] = [random.random() for x in xrange(K)] for j in xrange(M): Q[j] = [random.random() for x in xrange(K)] P,Q = matrix_factorization(R,P,Q,K) Rij = dict()

这两个部分应该具有相同的功能,结构也是一样的。 但是!我的代码返回的是:

OverflowError: (34, 'Result too large')

或计算P和Q后显示:

P Out[5]: {0: [nan, nan, nan, nan], 1: [nan, nan, nan, nan], 2: [nan, nan, nan, nan], 3: [nan, nan, nan, nan], 4: [nan, nan, nan, nan]} Q Out[6]: {0: [nan, nan, nan, nan], 1: [nan, nan, nan, nan], 2: [nan, nan, nan, nan], 3: [nan, nan, nan, nan]}

我只是无法弄明白为什么而且非常可悲的事实是我已经使用这种方法完成了我推荐的系统。 你能帮我找到发生这种情况的原因吗? 非常感谢您的宝贵时间!

I was learning and trying to build a toy recommend system using LFM(latent factor model). So I find something about matrix factorization in this page (http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/)

The code inside that page can run perfectly. But in my work the matrix should be a sparse one since lots of element remain blank after initializing. So I rewrite it using dictionary and everything screws up.

Here is the codes given in the web page:

import numpy def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): Q = Q.T for step in xrange(steps): for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[k][j] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[k][j] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in xrange(len(R)): for j in xrange(len(R[i])): if R[i][j] > 0: e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2) for k in xrange(K): e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) if e < 0.001: break return P, Q.T 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) 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)

This code works all right. So I write the following code:

import random def matrix_factorization(R, P, Q, K,steps=5000, alpha=0.0002, beta=0.02): for step in xrange(steps): print 'step',step step += 1 for i in R.keys(): for j in R[i].keys(): eij = R[i][j] - sum([x * y for x in P[i] for y in Q[j]]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[j][k] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[k][j] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in R.keys(): for j in R[i].keys(): e += pow(R[i][j] - sum([x * y for x in P[i] for y in Q[j]]), 2) for k in xrange(K): e += (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) if e < 0.001: break return P,Q if __name__ == '__main__': R = {0:{0:5,1:3,3:1}, 1:{0:4,3:1}, 2:{0:1,1:1,3:5}, 3:{0:1,3:4}, 4:{1:1,2:5,3:4} } N = len(R.keys()) M = 4 K = 4 P = dict() Q = dict() for i in xrange(N): P[i] = [random.random() for x in xrange(K)] for j in xrange(M): Q[j] = [random.random() for x in xrange(K)] P,Q = matrix_factorization(R,P,Q,K) Rij = dict()

These two sections should have same function and the structures are just the same. BUT!What my code returns is:

OverflowError: (34, 'Result too large')

or after calculating P and Q shows:

P Out[5]: {0: [nan, nan, nan, nan], 1: [nan, nan, nan, nan], 2: [nan, nan, nan, nan], 3: [nan, nan, nan, nan], 4: [nan, nan, nan, nan]} Q Out[6]: {0: [nan, nan, nan, nan], 1: [nan, nan, nan, nan], 2: [nan, nan, nan, nan], 3: [nan, nan, nan, nan]}

I just can't figure it out why and the very sad fact is I have finish my recommend system using this method. Could you help me find the reason why this happened? Thank you very much for your time!

最满意答案

我在函数matrix_factorization更改了以下行 Q [k] [j] = Q_temp + alpha *(2 * eij * P_temp - beta * Q_temp) Q [j] [k] = Q_temp + alpha *(2 * eij * P_temp - beta * Q_temp) 然后修改后的代码似乎运行良好。

我修改了函数matrix_factorization如下,然后结果似乎正确。

def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): for step in xrange(steps): for i in R.keys(): for j in R[i].keys(): eij = R[i][j] - sum([P[i][k] * Q[j][k] for k in xrange(K)]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[j][k] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[j][k] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in R.keys(): for j in R[i].keys(): e += pow(R[i][j] - sum([P[i][k] * Q[j][k] for k in xrange(K)]), 2) for k in xrange(K): e += (beta/2) * (pow(P[i][k], 2) + pow(Q[j][k], 2)) if e < 0.001: break return P,Q

I changed the following line in the function matrix_factorization Q[k][j] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) to Q[j][k] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) Then the modified code seems to work well.

I modified the function matrix_factorization as follows, then the result seems right.

def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): for step in xrange(steps): for i in R.keys(): for j in R[i].keys(): eij = R[i][j] - sum([P[i][k] * Q[j][k] for k in xrange(K)]) for k in xrange(K): P_temp = P[i][k] Q_temp = Q[j][k] P[i][k] = P_temp + alpha * (2 * eij * Q_temp - beta * P_temp) Q[j][k] = Q_temp + alpha * (2 * eij * P_temp - beta * Q_temp) e = 0 for i in R.keys(): for j in R[i].keys(): e += pow(R[i][j] - sum([P[i][k] * Q[j][k] for k in xrange(K)]), 2) for k in xrange(K): e += (beta/2) * (pow(P[i][k], 2) + pow(Q[j][k], 2)) if e < 0.001: break return P,Q

更多推荐

本文发布于:2023-07-24 20:08:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1250564.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:出现在   矩阵   分解   字典   matrix

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!