渐变下降变化不起作用

时间:2016-10-24 12:37:21

标签: python numpy gradient-descent

我尝试实现随机梯度下降算法。 第一个解决方案有效:

def gradientDescent(x,y,theta,alpha):
    xTrans = x.transpose()
    for i in range(0,99):
        hypothesis = np.dot(x,theta)
        loss = hypothesis - y
        gradient = np.dot(xTrans,loss)
        theta = theta - alpha * gradient

    return theta

此解决方案提供了正确的theta值,但是以下算法 不起作用:

def gradientDescent2(x,y,theta,alpha):
    xTrans = x.transpose();
    for i in range(0,99):
        hypothesis = np.dot(x[i],theta)
        loss = hypothesis - y[i]
        gradientThetaZero= loss * x[i][0]
        gradientThetaOne = loss * x[i][1]
    theta[0] = theta[0] - alpha * gradientThetaZero
    theta[1] = theta[1] - alpha * gradientThetaOne
    return theta

我不明白为什么解决方案2不起作用,基本上它 和第一种算法一样。

我使用以下代码生成数据:

def genData():
    x = np.random.rand(100,2)
    y = np.zeros(shape=100)
    for i in range(0, 100):
        x[i][0] = 1
        # our target variable
        e = np.random.uniform(-0.1,0.1,size=1)
        y[i] = np.sin(2*np.pi*x[i][1]) + e[0]
    return x,y

并按以下方式使用:

x,y = genData()
theta = np.ones(2)
theta = gradientDescent2(x,y,theta,0.005)
print(theta)

我希望你能帮助我! 最好的问候,菲利克斯

1 个答案:

答案 0 :(得分:2)

您的第二个代码示例将覆盖您观察数据上每次迭代的渐变计算。

在第一个代码段中,您可以根据错误(丢失函数)在每个循环迭代中正确调整参数。

在第二个代码段中,您计算​​每次迭代中的逐点渐变计算,但之后不做任何事情。这意味着您的最终更新只能在最后一个数据点上进行训练。

如果你通过求和(+ =)积累循环内的渐变,它应该更接近你正在寻找的(作为损失函数的梯度相对于你的参数的表达式)整个观察集)。