用于推荐算法的矩阵分解实现

原理见:推荐算法——基于矩阵分解的推荐算法

python实现:

运行指令:

$ python mf.py

源代码:

from numpy import *

def gradAscent(dataMat, K):
    dataMat = array(dataMat)
    print "original matrix:"
    print dataMat

    m, n = shape(dataMat)
    p = mat(random.random((m, K)))
    q = mat(random.random((K, n)))

    alpha = 0.0002
    beta = 0.02
    maxCycles = 100000

    for step in xrange(maxCycles):
        for i in xrange(m):
            for j in xrange(n):
                if dataMat[i,j] > 0:
                    error = dataMat[i,j]
                    for k in xrange(K):
                        error = error - p[i,k]*q[k,j]
                    for k in xrange(K):
                        p[i,k] = p[i,k] + alpha * (2 * error * q[k,j] - beta * p[i,k])
                        q[k,j] = q[k,j] + alpha * (2 * error * p[i,k] - beta * q[k,j])

        loss = 0.0
        for i in xrange(m):
            for j in xrange(n):
                if dataMat[i,j] > 0:
                    error = 0.0
                    for k in xrange(K):
                        error = error + p[i,k]*q[k,j]
                    loss = (dataMat[i,j] - error) * (dataMat[i,j] - error)
                    for k in xrange(K):
                        loss = loss + beta * (p[i,k] * p[i,k] + q[k,j] * q[k,j]) / 2

        if loss < 0.001:
            break
        '''if step % 1000 == 0:
            print("loss = %f" % loss)'''

    return p, q

if __name__ == "__main__":
    data = [
     [5,3,0,1,1],
     [4,0,0,1,1],
     [1,1,0,5,0],
     [1,0,0,4,1],
     [0,1,5,4,1],
    ]
    p, q = gradAscent(data, 5)
    '''print "p="
    print p
    print "q="
    print q'''
    result = p * q
    print "marix factorization:"
    print result

猜你喜欢

转载自blog.csdn.net/u013431916/article/details/80330329
今日推荐