梯度下降变化不起作用
Gradient Descent Variation doesn't work
我尝试实现随机梯度下降算法。
第一个解决方案有效:
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)
希望你能帮帮我!
最好的问候,菲利克斯
您的第二个代码示例覆盖了对您的观察数据的每次迭代的梯度计算。
在第一个代码片段中,您根据错误(损失函数)在每次循环迭代中正确调整参数。
在第二个代码片段中,您计算了每次迭代中的逐点梯度计算,但随后不对其执行任何操作。这意味着您的最终更新实际上只训练最后一个数据点。
相反,如果您通过求和 ( += ) 在循环内累积梯度,它应该更接近您要查找的内容(作为损失函数梯度的表达式,相对于您的参数整个观察集)。
我尝试实现随机梯度下降算法。 第一个解决方案有效:
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)
希望你能帮帮我! 最好的问候,菲利克斯
您的第二个代码示例覆盖了对您的观察数据的每次迭代的梯度计算。
在第一个代码片段中,您根据错误(损失函数)在每次循环迭代中正确调整参数。
在第二个代码片段中,您计算了每次迭代中的逐点梯度计算,但随后不对其执行任何操作。这意味着您的最终更新实际上只训练最后一个数据点。
相反,如果您通过求和 ( += ) 在循环内累积梯度,它应该更接近您要查找的内容(作为损失函数梯度的表达式,相对于您的参数整个观察集)。