0

LFM(潜在因子モデル)を使ったおもちゃレコメンドシステムを学び、構築しようとしていました。だから私はこのページで行列因数分解について何かを見つけます( http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/ )

そのページ内のコードは完全に実行できます。しかし、私の仕事では、初期化後に多くの要素が空白のままになるため、マトリックスは疎なものにする必要があります。だから私は辞書を使って書き直すと、すべてが台無しになります。

Webページに記載されているコードは次のとおりです。

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()

これらの 2 つのセクションは同じ機能を持つ必要があり、構造はまったく同じです。しかし!私のコードが返すものは次のとおりです:

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]}

理由がわかりませんが、非常に悲しいことに、この方法を使用して推奨システムを完成させました。これが起こった理由を見つけるのを手伝ってもらえますか? お時間をいただきありがとうございました!

4

1 に答える 1