随机梯度下降公式实现
请教一下大佬 在做funksvd 中的梯度下降代码中,如何理解这个2 * rij * q[k][j] - b * p[i][k]
这个是引入随机的扰动么,感觉这个跟梯度下降公式不符合啊。
p[i][k] = p[i][k] + a * (2 * rij * q[k][j] - b * p[i][k]) q[k][j] = q[k][j] + a * (2 * rij * p[i][k] - b * q[k][j])
import numpy as npfrom math import pow
def rect(R, K, p, q, step=3000, a=0.002, b=0.01):
q = q.T
for t in range(step):
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j] > 0:
rij = R[i][j] - np.dot(p[i, :], q[:, j])
for k in range(K):
p[i][k] = p[i][k] + a * (2 * rij * q[k][j] - b * p[i][k])
q[k][j] = q[k][j] + a * (2 * rij * p[i][k] - b * q[k][j])
e = 0
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j] > 0:
e = e + pow(R[i][j] - np.dot(p[i, :], q[:, j]), 2)
for k in range(K):
e = e + (b / 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, 5, 3, 0, 5, 5],
[5, 0, 4, 0, 4, 4],
[0, 3, 0, 5, 4, 5],
[5, 4, 3, 3, 5, 5]
]
R = np.array(R)
k = 3
P = np.random.rand(len(R), k)#这个是4行 3列的
Q = np.random.rand(len(R[0]), k)#这个是 6行 3列的
print("zhanggg")
print(Q)
print("fffffffffffffffff")
ep, eq = rect(R, k, P, Q)
print(ep)
Rf = np.dot(ep, eq.T)
print(Rf)
以上是 随机梯度下降公式实现 的全部内容, 来源链接: utcz.com/p/938446.html