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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。