当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R constrOptim 线性约束优化


R语言 constrOptim 位于 stats 包(package)。

说明

使用自适应障碍算法最小化受线性不等式约束的函数。

用法

constrOptim(theta, f, grad, ui, ci, mu = 1e-04, control = list(),
            method = if(is.null(grad)) "Nelder-Mead" else "BFGS",
            outer.iterations = 100, outer.eps = 1e-05, ...,
            hessian = FALSE)

参数

theta

数字(向量)起始值(长度为 ):必须位于可行区域内。

f

函数最小化(见下文)。

grad

f(也是function)或NULL(见下文)的梯度。

ui

约束矩阵( ),见下文。

ci

长度为 的约束向量(见下文)。

mu

(小)调整参数。

control, method, hessian

传递给optim

outer.iterations

障碍算法的迭代。

outer.eps

非负数;障碍算法的相对收敛容差。

...

要传递给 fgrad 的其他命名参数:需要通过 optim 传递,因此不应与其参数名称匹配。

细节

可行区域由 ui %*% theta - ci >= 0 定义。起始值必须在可行区域的内部,但最小值可能在边界上。

添加对数屏障来强制执行约束,然后调用optim。选择障碍函数以使目标函数在每次外迭代时应减小。可行区域内部的最小值通常很快就能找到,但边界上的最小值可能需要大量的外部迭代。

调整参数mu 乘以势垒项。它的精确值通常相对不重要。随着mu 的增加,增强目标函数变得更接近原始目标函数,但在可行区域边界附近也不太平滑。

任何允许目标函数取无限值的optim方法都可以使用(目前除了"L-BFGS-B"之外的所有方法)。

目标函数 f 将要进行最小化的参数向量作为第一个参数。它应该返回一个标量结果。可选参数 ... 将传递给 optim ,然后(如果 optim 未使用)传递给 f 。与 optim 一样,默认值是最小化,但可以通过将 control$fnscale 设置为负值来执行最大化。

除了 method = "Nelder-Mead" 之外,必须提供梯度函数 grad 。它应该采用与 f 匹配的参数并返回包含梯度的向量。

至于 optim ,但有两个额外的组件: barrier.value 给出最佳势垒函数的值, outer.iterations 给出外部迭代的次数(调用 optim )。 counts 组件包含所有 optim()$counts 的总和。

例子


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

optim(c(-1.2,1), fr, grr)
#Box-constraint, optimum on the boundary
constrOptim(c(-1.2,0.9), fr, grr, ui = rbind(c(-1,0), c(0,-1)), ci = c(-1,-1))
#  x <= 0.9,  y - x > 0.1
constrOptim(c(.5,0), fr, grr, ui = rbind(c(-1,0), c(1,-1)), ci = c(-0.9,0.1))


## Solves linear and quadratic programming problems
## but needs a feasible starting value
#
# from example(solve.QP) in 'quadprog'
# no derivative
fQP <- function(b) {-sum(c(0,5,0)*b)+0.5*sum(b*b)}
Amat       <- matrix(c(-4,-3,0,2,1,0,0,-2,1), 3, 3)
bvec       <- c(-8, 2, 0)
constrOptim(c(2,-1,-1), fQP, NULL, ui = t(Amat), ci = bvec)
# derivative
gQP <- function(b) {-c(0, 5, 0) + b}
constrOptim(c(2,-1,-1), fQP, gQP, ui = t(Amat), ci = bvec)

## Now with maximisation instead of minimisation
hQP <- function(b) {sum(c(0,5,0)*b)-0.5*sum(b*b)}
constrOptim(c(2,-1,-1), hQP, NULL, ui = t(Amat), ci = bvec,
            control = list(fnscale = -1))

参考

K. Lange Numerical Analysis for Statisticians. Springer 2001, p185ff

也可以看看

optim ,尤其是 method = "L-BFGS-B" ,它进行框约束优化。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Linearly Constrained Optimization。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。