我有一个模型,y=f(x,z,a)。我想优化该模型(最终受到约束)。当具有梯度函数时,R 中的数值优化器要快得多。但是我已经非参数地拟合了我的模型,因此我不能轻易地分析得到梯度。是否有某种方法可以从拟合模型中获取梯度函数——类似于我想的拟合模型对象,并为其定义了预测方法?
这是一些虚拟代码:
定义变量:
x = runif(1000)*10-5
z = runif(1000)*10-5
a = runif(1000)*10-5
y = x^2+a^2+z^2 + (x*z)^2 (x*a)^2 +rnorm(1000)
拟合模型:
library(mgcv)
m = gam(y~s(a)+te(a,z)+te(x,z))
summary(m)
par(mfrow=c(1,3))
plot(m,scheme=2)
最小化以获得最小的 y:
f = function(par){
predict(m,newdata = data.frame(x=par[1],z=par[2],a=par[3]))
}
o = optim(par=c(0,0,0),fn=f)
我想要的是一个渐变对象,这样我就可以定义
g = function(par){
predict(MY.HYPOTHETICAL.GRADIENT.OBJECT,newdata = data.frame(x=par[1],z=par[2],a=par[3]))
}
然后运行
o = optim(par=c(0,0,0),fn=f,gr=g,method="BFGS")
...考虑到大量数据以及复杂的模型和目标函数,这会快得多。
我想做的事可能吗?