lbfgs:如何找到梯度
lbfgs: how to find gradient
我想使用 lbfgs 方法来最小化函数。问题是该函数是 Svenson 函数(参见:Svenson function),我不知道如何找到此类函数的梯度,其中 tau(时间)从 1:15.
开始
有什么帮助吗?
这是渐变。取每个变量的部分。
我们可以通过数值检查梯度是否正确。
grad=function(t, b0, b1, b2, b3, l1, l2) {
a=1
b=exp(-t/l1)
c=t/l1*exp(-t/l1)
d=t/l2*exp(-t/l2)
e=t*exp(-t/l1)*(b1*l1+b2*(t-l1))/l1^3
f=-b3*t*exp(-t/l2)*(l2-t)/l2^3
return(c(a,b,c,d,e,f))
}
func=function(t, b0, b1, b2, b3, l1, l2) {
return(b0+b1*exp(-t/l1)+b2*t/l1*exp(-t/l1)+b3*t/l2*exp(-t/l2))
}
x0=c(runif(6))
x1=x0+rnorm(6, 0, .01)
f0=func(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f0grd=grad(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f1=func(1, x1[1], x1[2], x1[3], x1[4], x1[5], x1[6])
f1-f0
0.009506896
sum(f0grd * (x1-x0))
0.009467063
我想使用 lbfgs 方法来最小化函数。问题是该函数是 Svenson 函数(参见:Svenson function),我不知道如何找到此类函数的梯度,其中 tau(时间)从 1:15.
开始有什么帮助吗?
这是渐变。取每个变量的部分。
我们可以通过数值检查梯度是否正确。
grad=function(t, b0, b1, b2, b3, l1, l2) {
a=1
b=exp(-t/l1)
c=t/l1*exp(-t/l1)
d=t/l2*exp(-t/l2)
e=t*exp(-t/l1)*(b1*l1+b2*(t-l1))/l1^3
f=-b3*t*exp(-t/l2)*(l2-t)/l2^3
return(c(a,b,c,d,e,f))
}
func=function(t, b0, b1, b2, b3, l1, l2) {
return(b0+b1*exp(-t/l1)+b2*t/l1*exp(-t/l1)+b3*t/l2*exp(-t/l2))
}
x0=c(runif(6))
x1=x0+rnorm(6, 0, .01)
f0=func(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f0grd=grad(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f1=func(1, x1[1], x1[2], x1[3], x1[4], x1[5], x1[6])
f1-f0
0.009506896
sum(f0grd * (x1-x0))
0.009467063