【发布时间】:2017-04-30 14:19:26
【问题描述】:
我希望在对数下降曲线上运行梯度下降,如下所示:
y = y0 - a * ln(b + x)。
本例中我的 y0:800
我试图使用关于 a 和 b 的偏导数来做到这一点,但是虽然这显然可以最小化平方误差,但它并没有收敛。我知道这不是矢量化的,我可能完全采用了错误的方法。我是在犯任何简单的错误,还是完全放弃了这个问题?
import numpy as np
# constants my gradient descent model should find:
a = 4
b = 4
# function to fit on!
def function(x, a, b):
y0 = 800
return y0 - a * np.log(b + x)
# Generates data
def gen_data(numpoints):
a = 4
b = 4
x = np.array(range(0, numpoints))
y = function(x, a, b)
return x, y
x, y = gen_data(600)
def grad_model(x, y, iterations):
converged = False
# length of dataset
m = len(x)
# guess a , b
theta = [0.1, 0.1]
alpha = 0.001
# initial error
e = np.sum((np.square(function(x, theta[0], theta[1])) - y))
for iteration in range(iterations):
hypothesis = function(x, theta[0], theta[1])
loss = hypothesis - y
# compute partial deritaves to find slope to "fall" into
theta0_grad = (np.mean(np.sum(-np.log(x + y)))) / (m)
theta1_grad = (np.mean((((np.log(theta[1] + x)) / theta[0]) - (x*(np.log(theta[1] + x)) / theta[0])))) / (2*m)
theta0 = theta[0] - (alpha * theta0_grad)
theta1 = theta[1] - (alpha * theta1_grad)
theta[1] = theta1
theta[0] = theta0
new_e = np.sum(np.square((function(x, theta[0], theta[1])) - y))
if new_e > e:
print "AHHHH!"
print "Iteration: "+ str(iteration)
break
print theta
return theta[0], theta[1]
【问题讨论】:
-
是的,每当我通过标准线性梯度下降并且不知道如何解决这个问题时,我都会遇到麻烦。
-
还没有真正阅读过代码,但是,它不收敛是什么意思?误差是否越来越大,因此它正在发散?还是收敛时间太长?假设您确实对导数进行了正确编码,可能只是您选择了错误的
alpha,或者渐变方向的符号翻转(+而不是-)。 -
如果我的错误发生分歧,我在代码中放置了一个中断。我相信我的 theta[0] (a) 变量的偏导数是正确的,但不是我的 theta[1] (b) 变量。它似乎正确收敛,但仅适用于 theta[0]。
标签: python numpy machine-learning integral gradient-descent