R中的优化:constrOptim约束

时间:2016-06-24 08:57:48

标签: r mathematical-optimization

我习惯使用函数optim,但这次我对其中一个变量有条件。我有三个变量: a b d 。我对 a b 没有任何条件,但 d 必须介于0和1之间:0=<d=<1

我该怎么做?

2 个答案:

答案 0 :(得分:0)

constrOptim()描述写道

The feasible region is defined by 'ui %*% theta - ci >= 0'. 

因此,您需要建立一个带有系数矩阵'ui'的线性方程组和一个解向量'ci',其中'''表示您感兴趣的变量。请注意,您可以将'ui%%theta - ci&gt; = 0'重写为'ui%%theta&gt; = ci'或乘以负数来翻转不等式。

在您的情况下,您可能希望有两个方程式:

有系数('ui')

和解决方案向量('ci')

R

 ui <- rbind(c(0,0,1),c(0,0,-1))
 ci <- c(0,-1)

使用constrOptim帮助文件中的示例:

    ## 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))
 }

修改为x1&lt; = 1,x1&gt; 0

 ui <- rbind(c(-1,0), c(1,0))
 ci <- c(-1,0) 
 constrOptim(c(.5,0), fr, grr, ui = ui, ci = ci)

答案 1 :(得分:0)

您有框限制,可由optim本机处理;你不需要constrOptim。对于无约束变量,将约束设置为+/- Infinity,并使用method="L-BFGS-B"

optim(fn, lower=c(-Inf, -Inf, 0), upper=c(Inf, Inf, 1), method="L-BFGS-B", ...)

一些意见:

  • 您可能需要考虑转换d以使其变得不受约束;例如优化p = log(d/(1-d))。无约束优化总是比约束更容易,所有其他条件都相同。
  • optim这些天真的很老了;尝试使用CRAN上的Optimization Task View中的其他一些软件包。