當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。