Finding gradient got error: Error in x[3] : object of type 'closure' is not subsettable

Finding gradient got error: Error in x[3] : object of type 'closure' is not subsettable

我想求函数的梯度,其中 o 来自 1:15。我的代码是:

  g<-function(x){
  j<-(x[1]+x[2]*((1-exp(-o/x[3]))/(o/x[3]))+
                x[4]*((1-exp(-o/x[3]))/(o/x[3])-exp(-(o/x[3])))+ 
                x[5]*((1-exp(-o/x[6]))/(o/x[6])-exp(-(o/x[6]))))
  }
gradient(g)

但是我得到了错误:

Error in x[3] : object of type 'closure' is not subsettable

有人可以帮忙吗?

该函数没有全局最小值。这是因为 x[1] 可以设置为 -infinity。所以,我怀疑你试图最小化的这个功能有问题。

如果你还关心的话,渐变是这样的。但我不是 100% 确定它是正确的。无论如何,它在 lbfgs、optim 或梯度下降中都没有用。

grad=function(x) {
  a=x[1]; b=x[2]; c=x[3]; f=x[4]; g=x[5]; h=x[6]
  p=1
  q=c*(1-exp(-o/c))/o
  r=exp(-o/c)*((f+b)*c^2*exp(o/c)+(-f-b)*c^2+(-f-b)*o*c-f*o^2)/o/c^2
  s=c*(1-exp(-o/c))/o-exp(-o/c)
  t=h*(1-exp(-o/h))/o-exp(-h/o)
  u=g*((1-exp(-o/h))/o-exp(-o/h)/h+exp(-h/o)/o)
  return(c(p,q,r,s,t,u))
}

设f为函数(x-1)^2+y^2+5。当 x=1 和 y=0 时,全局最小值为 5。同意?只是一个 3-D 抛物面碗。我们使用三种最小化方法,对于每一种我们都希望最小化方法在大约 (1,0) 处找到最小值,并且梯度将是最小值处的零向量。

# function is (x-1)^2+y^2+5
func=function(x) {
  return((x[1]-1)^2+x[2]^2+5)
}
# gradient is (2(x-1), 2y)
grad=function(x) {
  return(c(2*(x[1]-1), 2*x[2]))
}

#Method 1: optim
op=optim(c(1,1), func, method="BFGS")
op$par
1.000000e+00 1.100231e-13 # about (1, 0)
grad(op$par)
0.000000e+00 2.200462e-13 # about (0, 0)

# Method 2: gradient descent
x=c(1,1)
for (i in 1:100000) {
  x=x-.01*grad(x)
}
x
1.000000e+00 1.185758e-322 # about (1, 0)
grad(x)
0.000000e+00 2.371515e-322 # about (0, 0)

# Method 3: lbfgs
l=lbfgs(func, grad, vars=c(1,1))
l$par
1 0 # exactly (1, 0)
grad(l$par)
0 0 # exactly (0, 0)