繁体   English   中英

线性回归随机梯度下降

[英]Linear Regression Stochastic Gradient Descent

我正在尝试拟合添加了一些高斯噪声的正弦波(sin(2 pi x))。 我正在使用随机梯度下降算法,我试图拟合的 model 在参数中是线性的。 我使用了[1 x^1 x^2... x^5]的简单基础 function 。 损失 function 是最小二乘损失。

def gradient_descent(phi, Y, W, a):
    N = len(Y)
    for i in range(N):
        dE_dW = (np.matmul(np.array([W]), np.array([phi[i]]).T)[0][0] - Y[i]) * phi[i]
        W = W - a * dE_dW
    return W

对于采样,我正在这样做,

noise_sample = np.random.normal(loc = 0, scale = 0.07, size = sample_size)
for i in range(sample_size):
   x = random.uniform(0.0, 0.5)
   y = sin(x)
   X.append(x), Y.append(y)
X, Y = np.array(X), np.array(Y)
permutation = np.random.permutation(sample_size)
X, Y = X[permutation], Y[permutation]
Y = np.add(Y, noise_sample)

order = 5
phi = np.array([np.ones(sample_size)]).T
for i in range(order):
   phi = np.c_[phi, X ** (i + 1)]
W = np.random.uniform(low=0.0, high=1.0, size=(order+1,))

在这种情况下,我将其作为拟合曲线(橙色)。 罪(2pix)

当我使用封闭式解决方案尝试相同的程度时,

phi_inv = np.matmul(np.linalg.inv(np.matmul(phi.T, phi)), phi.T)
weights = np.matmul(phi_inv, Y.T)

我得到了想要的曲线。 有什么我做错了吗?

这可能是步长/学习率a过大的问题。 您正在计算的梯度只是真实梯度的噪声版本。 如果您的步长太大,您几乎只是随机地跳来跳去。 当然,如果您选择的太小,您将永远无法达到最佳状态,而只会停留在您开始的位置附近。

您可以从较大的步长值开始,然后随着时间的推移减小它。 您还可以多次迭代您的训练集和/或基于小批量计算梯度,即所有样本的一小部分。 在任何情况下,尝试检查梯度是否随着时间的推移而消失,看看你是否正在收敛。 如果它下降,还要检查你的损失 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM