#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分解
最新推荐文章于 2022-05-25 19:01:54 发布
本文介绍了手写Funk SVD分解的过程,通过迭代更新用户矩阵P和物品矩阵Q,以最小化预测评分与实际评分之间的误差。代码展示了如何使用numpy进行矩阵运算,并给出了一个简单的例子来验证算法的实现,最终输出了预测评分矩阵。

最低0.47元/天 解锁文章
4102

被折叠的 条评论
为什么被折叠?



