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


R nlm 非线性最小化


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

说明

该函数使用Newton-type 算法执行函数f 的最小化。详细信息请参阅引用。

用法

nlm(f, p, ..., hessian = FALSE, typsize = rep(1, length(p)),
    fscale = 1, print.level = 0, ndigit = 12, gradtol = 1e-6,
    stepmax = max(1000 * sqrt(sum((p/typsize)^2)), 1000),
    steptol = 1e-6, iterlim = 100, check.analyticals = TRUE)

参数

f

要最小化的函数,返回单个数值。这应该是一个函数,第一个参数是 p 长度的向量,后跟 ... 参数指定的任何其他参数。

如果函数值具有名为gradient 的属性或同时具有gradienthessian 属性,则这些属性将用于计算更新的参数值。否则,使用数值导数。 deriv 返回具有合适的 gradient 属性和可选的 hessian 属性的函数。

p

最小化的起始参数值。

...

要传递给 f 的附加参数。

hessian

如果 TRUE ,则返回至少 f 的粗麻布矩阵。

typsize

每个参数的最小大小的估计。

fscale

f 的最小大小估计。

print.level

该参数决定了最小化过程中完成的打印级别。默认值 0 表示不进行打印,值 1 表示打印初始和最终详细信息,值 2 表示打印完整跟踪信息。

ndigit

函数 f 中的有效位数。

gradtol

一个正标量,给出了缩放梯度被认为足够接近零以终止算法的容差。缩放梯度是 f 在每个方向 p[i] 的相对变化除以 p[i] 的相对变化的度量。

stepmax

给出最大允许缩放步长的正标量。 stepmax 用于防止导致优化函数溢出的步骤,防止算法离开参数空间中的感兴趣区域,或检测算法中的发散。 stepmax 将选择足够小以防止前两次发生,但应大于任何预期的合理步骤。

steptol

提供最小允许相对步长的正标量。

iterlim

一个正整数,指定程序终止之前要执行的最大迭代次数。

check.analyticals

一个逻辑标量,指定是否应根据初始参数值处的数值导数检查解析梯度和 Hessians(如果提供)。这可以帮助检测错误制定的梯度或 Hessians。

细节

请注意,... 之后的参数必须完全匹配。

如果提供了渐变或粗麻布,但计算结果为错误的模式或长度,并且check.analyticals = TRUE(默认值)带有警告,则它将被忽略。除非梯度存在并且通过健全性检查,否则甚至不会检查粗麻布。

“perturbed” cholesky 的 C 代码,choldc()总共有一个错误R3.4.1之前的版本。

从原始来源中可用的三种方法中,我们始终使用方法“1”,即线搜索。

提供的函数应始终返回有限值(包括非 NA 和非 NaN )值:对于函数值本身,非有限值将被最大正值替换,并带有警告。

包含以下组件的列表:

minimum

f 的估计最小值的值。

estimate

获得f最小值的点。

gradient

f 估计最小值处的梯度。

hessian

估计最小值为 f 的粗麻布(如果需要)。

code

一个整数,指示优化过程终止的原因。

1:

相对梯度接近于零,当前迭代可能是解决方案。

2:

在容差范围内连续迭代,当前迭代可能是解决方案。

3:

最后一个全局步骤未能找到低于 estimate 的点。 estimate 是函数的近似局部最小值,或者 steptol 太小。

4:

超出迭代限制。

5:

最大步长stepmax连续五次超过。或者该函数在下面无界,从上面在某个方向渐近到有限值,或者 stepmax 太小。

iterations

执行的迭代次数。

例子

f <- function(x) sum((x-1:length(x))^2)
nlm(f, c(10,10))
nlm(f, c(10,10), print.level = 2)
utils::str(nlm(f, c(5), hessian = TRUE))

f <- function(x, a) sum((x-a)^2)
nlm(f, c(10,10), a = c(3,5))
f <- function(x, a)
{
    res <- sum((x-a)^2)
    attr(res, "gradient") <- 2*(x-a)
    res
}
nlm(f, c(10,10), a = c(3,5))

## more examples, including the use of derivatives.
## Not run: demo(nlm)

来源

当前代码由 Saikat DebRoy 和 R Core 团队编写,使用 Richard H. Jones 的 Fortran 代码的 C 翻译。

参考

Dennis, J. E. and Schnabel, R. B. (1983). Numerical Methods for Unconstrained Optimization and Nonlinear Equations. Prentice-Hall, Englewood Cliffs, NJ.

Schnabel, R. B., Koontz, J. E. and Weiss, B. E. (1985). A modular system of algorithms for unconstrained minimization. ACM Transactions on Mathematical Software, 11, 419-440. doi:10.1145/6187.6192.

也可以看看

optimnlminb

constrOptim 用于约束优化,optimize 用于一维最小化,uniroot 用于求根。 deriv 计算解析导数。

对于非线性回归,nls 可能更好。

相关用法


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