r语言 - 查找梯度出错:x[3] 中的错误:类型 'closure' 的对象不可子集



我想找到函数的梯度,其中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]可以设置为-无穷大。所以,我怀疑这个函数有一些不正确的地方,你试图最小化。

如果你仍然关心,梯度如下。但我不能百分之百肯定它是正确的。在任何情况下,它在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。同意只是一个三维抛物面碗。我们使用三种最小化方法,对于每种方法,我们期望最小化方法在大约(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)

相关内容

最新更新