随机梯度下降公式实现

请教一下大佬 在做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 np
from 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)
阅读 653
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题