Python 非负矩阵分解

Python 非负矩阵分解,python,numpy,Python,Numpy,我想在Python上实现NMF,下面是我在Google上的发现: def matrix_factorization(R, P, Q, K, steps = 500, 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:

我想在Python上实现NMF,下面是我在Google上的发现:

def matrix_factorization(R, P, Q, K, steps = 500, 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[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 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
当我运行代码时,有些值是负数,这与技术的定义不符

我注意到错误项eij=R[I][j]-numpy.dotP[I,:],Q[:,j]不是绝对值

所以我尝试了eij=numpy.fabseij,它返回RuntimeWarning:double_标量中遇到的溢出

其他返回绝对值的方法(如math.abs等)也不起作用。
请帮我做这个

例如,有可用的NMF库:或者你是作为练习来实现的?谢谢你的建议-我太绝望了,无法实现从Google找到的代码。问题是,当我简单地将示例代码复制并粘贴到主页上时,NIMFA无法正常工作。我认为这个例子有些错误,因为我不得不修改导入部分。。。你试过这个库吗?没有-不幸的是,我确实在某个时候有一个NMF.py库,我不记得它是不是NIMFA,但我已经无法访问该机器,所以我无法确认,抱歉。