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


R nlminb 使用 PORT 例程進行優化


R語言 nlminb 位於 stats 包(package)。

說明

使用 PORT 例程進行無約束和框約束優化。

為了曆史兼容性。

用法

nlminb(start, objective, gradient = NULL, hessian = NULL, ...,
       scale = 1, control = list(), lower = -Inf, upper = Inf)

參數

start

數值向量,要優化的參數的初始值。

objective

要最小化的函數。必須返回標量值。 objective 的第一個參數是要優化的參數向量,其初始值通過 start 提供。也可以指定 objective 的其他參數(在優化過程中固定)(請參閱 ... )。

gradient

可選函數,采用與 objective 相同的參數,並在第一個參數處計算 objective 的梯度。必須返回一個與 start 一樣長的向量。

hessian

可選函數,采用與 objective 相同的參數,並在第一個參數處計算 objective 的 hessian 矩陣。必須返回階數為 length(start) 的方陣。僅使用下三角形。

...

要提供給 objective 的更多參數。

scale

請參閱 PORT 文檔(或不理會)。

control

控製參數列表。詳情請參閱下文。

lower, upper

下限和上限向量,複製為與 start 一樣長。如果未指定,則假定所有參數均不受約束。

細節

start 的任何名稱都會傳遞給 objective 以及 gradienthessian(如果適用)。參數向量將被強製加倍。

如果任何函數返回 NANaN,則這是梯度和 Hessian 的錯誤,並且函數評估的此類值將替換為 +Inf 並帶有警告。

包含組件的列表:

par

找到的最佳參數集。

objective

objective 對應於 par 的值。

convergence

整數代碼。 0表示收斂成功。

message

給出優化器返回的任何附加信息的字符串,或 NULL 。有關詳細信息,請參閱 PORT 文檔。

iterations

執行的迭代次數。

evaluations

目標函數和梯度函數評估的數量

控製參數

control 列表中可能的名稱及其默認值是:

eval.max

允許的目標函數評估的最大數量。默認為 200。

iter.max

允許的最大迭代次數。默認為 150。

trace

每次跟蹤迭代都會打印目標函數和參數的值。默認為 0,表示不打印跟蹤信息。

abs.tol

絕對的寬容。默認為 0,因此不使用絕對收斂測試。如果已知目標函數是非負的,則之前的默認值 1e-20 會更合適。

rel.tol

相對耐受性。默認為 1e-10

x.tol

X 公差。默認為 1.5e-8

xf.tol

錯誤收斂容限。默認為 2.2e-14

step.min, step.max

最小和最大步長。兩者都默認為 1.

sing.tol

奇異收斂容差;默認為 rel.tol

scale.init

...

diff.g

目標函數值相對誤差的估計界限。

例子


x <- rnbinom(100, mu = 10, size = 10)
hdev <- function(par)
    -sum(dnbinom(x, mu = par[1], size = par[2], log = TRUE))
nlminb(c(9, 12), hdev)
nlminb(c(20, 20), hdev, lower = 0, upper = Inf)
nlminb(c(20, 20), hdev, lower = 0.001, upper = Inf)

## slightly modified from the S-PLUS help page for nlminb
# this example minimizes a sum of squares with known solution y
sumsq <- function( x, y) {sum((x-y)^2)}
y <- rep(1,5)
x0 <- rnorm(length(y))
nlminb(start = x0, sumsq, y = y)
# now use bounds with a y that has some components outside the bounds
y <- c( 0, 2, 0, -2, 0)
nlminb(start = x0, sumsq, lower = -1, upper = 1, y = y)
# try using the gradient
sumsq.g <- function(x, y) 2*(x-y)
nlminb(start = x0, sumsq, sumsq.g,
       lower = -1, upper = 1, y = y)
# now use the hessian, too
sumsq.h <- function(x, y) diag(2, nrow = length(x))
nlminb(start = x0, sumsq, sumsq.g, sumsq.h,
       lower = -1, upper = 1, y = y)

## Rest lifted from optim help page

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))
}
nlminb(c(-1.2,1), fr)
nlminb(c(-1.2,1), fr, grr)


flb <- function(x)
    { p <- length(x); sum(c(1, rep(4, p-1)) * (x - c(1, x[-p])^2)^2) }
## 25-dimensional box constrained
## par[24] is *not* at boundary
nlminb(rep(3, 25), flb, lower = rep(2, 25), upper = rep(4, 25))
## trying to use a too small tolerance:
r <- nlminb(rep(3, 25), flb, control = list(rel.tol = 1e-16))
stopifnot(grepl("rel.tol", r$message))

作者

R port: Douglas Bates and Deepayan Sarkar.

Underlying Fortran code by David M. Gay

來源

https://netlib.org/port/

參考

David M. Gay (1990), Usage summary for selected optimization routines. Computing Science Technical Report 153, AT&T Bell Laboratories, Murray Hill.

也可以看看

optim (首選)和 nlm

optimize 用於一維最小化,constrOptim 用於約束優化。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Optimization using PORT routines。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。