这是一个我们可以用来说明uiand的示例,ci为简洁起见,删除了一些无关的输出。它使正态分布的对数似然最大化。在第一部分中,我们使用带有框约束的 optim 函数,在第二部分中,我们使用带有相同框约束版本的 constrOptim 函数。
# function to be optimized
> foo.unconstr <- function(par, x) -sum(dnorm(x, par[1], par[2], log=TRUE))
> x <- rnorm(100,1,1)
> optim(c(1,1), foo.unconstr, lower=c(0,0), upper=c(5,5), method="L-BFGS-B", x=x)
$par
[1] 1.147652 1.077654
$value
[1] 149.3724
>
> # constrOptim example
>
> ui <- cbind(c(1,-1,0,0),c(0,0,1,-1))
> ui
[,1] [,2]
[1,] 1 0
[2,] -1 0
[3,] 0 1
[4,] 0 -1
> ci <- c(0, -5, 0, -5)
>
> constrOptim(c(1,1), foo.unconstr, grad=NULL, ui=u1, ci=c1, x=x)
$par
[1] 1.147690 1.077712
$value
[1] 149.3724
... blah blah blah ...
outer.iterations
[1] 2
$barrier.value
[1] -0.001079475
>
如果您查看 ui 矩阵并想象乘以要优化的参数向量,将其称为,您会看到结果有四行,第一行是,第二,第三行和第四个。减去 ci 向量并对每一行、、和。显然,将第二个和第四个约束乘以 -1 并将常数移动到右侧可以得到和θθ1−θ1θ2−θ2≥0θ1≥0−θ1+5≥0θ2≥0−θ2+5≥0θ1≤5θ2≤5,上限约束。
只需将您自己的值替换为 ci 向量并将适当的列(如果有)添加到 ui 向量即可获得所需的框约束集。