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