#coding=utf-8
import numpy as np
"""手写FunkSVD
"""
def svd(M,P,Q,K,steps = 1000,alpha = 0.1,beta = 0.02):
for step in range(steps):
for i in range(M.shape[0]):
for j in range(M.shape[1]):
#有评分
if(M[i][j] > 0):
P[i] = P[i] + alpha * ((M[i][j] - np.dot(P[i],Q[j].T))*Q[j] - beta * P[i])
Q[j] = Q[j] + alpha * ((M[i][j] - np.dot(P[i],Q[j].T))*P[i] - beta * Q[j])
loss = 0
num = 0
for i in range(M.shape[0]):
for j in range(M.shape[1]):
#对有评分的项目,计算损失
if(M[i][j] > 0):
num += 1
loss += np.power(M[i][j] - np.dot(P[i],Q[j].T),2)
loss = loss / num
if(loss < 0.01):
print("converge")
break
return P,Q
手写FunkSVD分解
最新推荐文章于 2021-07-06 14:53:06 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)