r - 在 R 中设置非线性优化
问题描述
我有一个函数可以根据输入计算模型的“值”。
ModelValue <- function(x, y, z) {
#long, most likely non-linear stuff
return(Value)}
x 是一个介于 0-1 之间的数字,并且根据我正在测试的模型固定。即,x 恰好是 0.56。
y 和 z 是我想要优化以最大化价值的 4 个阈值组。
y=c(pa, pb, pc, pd) and z=c(ta, tb, tc, td), subject to:
all are => 0.001,
all are =<0.997,
pa + pb + pc + pd == 1; and
ta + tb + tc + td == 1
我试过看 optimx 和 spg;(这是我所能得到的)但无论我做什么,我似乎都无法创建一个优化函数,只要我尝试提及 pa、pb、pc 等,我就不会感到害怕。我没有不明白如何告诉模型它要优化的变量是什么......
OptimizeModel <- function(x) {
p0=1 #initial guess
fn = ModelValue(x, y, z)
lo <- c(0.001, 0.001, 0.001, 0.001,
0.001, 0.001, 0.001, 0.001) # lower limits for parameters
hi <- c(0.997, 0.997, 0.997, 0.997,
0.997, 0.997, 0.997, 0.997) # upper limits for parameters
y<- c(pa, pb, pc, pd)
z<- c(ta, tb, tc, td)
pa + pb + pc + pd = 1
ta + tb + tc + td = 1
# pa > 0.001
# pb > 0.001
# pc > 0.001
# pd > 0.001
# ta > 0.001
# tb > 0.001
# tc > 0.001
# td > 0.001
ans1 <- spg(par=p0,
fn=fn,
lower=lo,
upper=hi,
control=list(maximize=TRUE, trace=FALSE))
return (ans1)
}
当我尝试时:
OptimizeModel(0.56)
#Error in OptimizeModel(0.56) : object 'pa' not found
解决方案
只需将 pa,pb,pc 传递给 spg 并在函数评估中使用它们。spg 的文档显示了执行此操作的示例:
valley.f <- function(x, cons) {
...}
这x
是决策变量,cons
是额外数据(常数)。
对 spg 的调用如下所示:
ans.spg2 <- spg(par=p0, fn=valley.f, cons=k, method=2)
你看到cons=k
的是指定的。这个参数不是为了spg
它自己,而是传递给函数评估(和梯度评估)函数。您需要对 pa、pb、pc 执行相同的操作。
请参阅:https ://www.rdocumentation.org/packages/BB/versions/2019.10-1/topics/spg
推荐阅读
- typescript - 在组件上使用 v-for 的反应式列表
- git - Katalon Studio 和 Git SubModules:如何将外部公共库导入到 katalon 项目中
- jmeter - 为什么 Jmeter RTE 协议不支持后台屏幕?
- regex - 正则表达式,部分表达式的负前瞻
- file - Dart - 如何获得文件的创建时间?
- regex - 正则表达式:在等于单词之间选择多行。记事本++
- excel - 如何将单元格的格式重置为表格中设置的格式?
- web - 在 Weblogic 12.1.3 中部署 Web 应用程序时出现错误消息
- c# - C# POCO(EF Core)中的地理点
- css - 有没有办法将 bootstrap 4 与 Sass 而不是 SCSS 一起使用?