R:constrOptim约束中的优化
我习惯于使用函数R:constrOptim约束中的优化,r,mathematical-optimization,R,Mathematical Optimization,我习惯于使用函数optim,但这次我的一个变量有一个条件。我有三个变量:a、b和d。我对a或b没有任何条件,但d必须介于0和1之间:0=,正如constrOptim()描述所述 The feasible region is defined by 'ui %*% theta - ci >= 0'. 因此,您需要建立一个线性方程组,其中系数矩阵“ui”和解向量“ci”,其中“theta”表示您感兴趣的变量。请注意,您可以将“ui%%theta-ci>=0”重写为“ui%%theta>=ci
optim
,但这次我的一个变量有一个条件。我有三个变量:a、b和d。我对a或b没有任何条件,但d必须介于0和1之间:0=,正如constrOptim()描述所述
The feasible region is defined by 'ui %*% theta - ci >= 0'.
因此,您需要建立一个线性方程组,其中系数矩阵“ui”和解向量“ci”,其中“theta”表示您感兴趣的变量。请注意,您可以将“ui%%theta-ci>=0”重写为“ui%%theta>=ci”,或乘以负数以翻转不等式
在您的情况下,您需要两个方程式:
或
带系数('ui')
和解向量('ci')
在R中:
ui <- rbind(c(0,0,1),c(0,0,-1))
ci <- c(0,-1)
ui您有框约束,可以由optim
本机处理;您不需要constrOptim
。将无约束变量的约束设置为+/-无穷大,并使用method=“L-BFGS-B”
一些评论:
您可能需要考虑转换<代码> d>代码>以使其不受约束;例如,优化p=log(d/(1-d))
。在其他条件相同的情况下,无约束优化总是比有约束优化容易
optim
现在实际上已经很老了;试着尝试一下起重机上的其他一些包装
## from optim
fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
grr <- function(x) { ## Gradient of 'fr'
x1 <- x[1]
x2 <- x[2]
c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
200 * (x2 - x1 * x1))
}
ui <- rbind(c(-1,0), c(1,0))
ci <- c(-1,0)
constrOptim(c(.5,0), fr, grr, ui = ui, ci = ci)
optim(fn, lower=c(-Inf, -Inf, 0), upper=c(Inf, Inf, 1), method="L-BFGS-B", ...)