【问题标题】:Optimization in R: Levenberg-Marquardt using nls.lm in minpack.lm: resetting `maxiter' to 1024R 中的优化:Levenberg-Marquardt 在 minpack.lm 中使用 nls.lm:将“maxiter”重置为 1024
【发布时间】:2021-07-28 21:06:11
【问题描述】:

我正在尝试通过使用 Rosenbrock 函数来了解如何在 R 库 minpack.lm 中使用 nls.lm,以查看算法是否在 f(x,y) = (1,1) 处收敛到全局最小值.无论有没有分析雅可比行列式,我都这样做。在这两种情况下,我都会收到一条警告,告诉我该算法已决定将对 nls.lm 的调用中指定的最大迭代次数恢复为 1024:

Warning messages:
1: In nls.lm(par = initpar, fn = objective_rosenbrock, jac = gradient_rosenbrock,  :
  resetting `maxiter' to 1024!
2: In nls.lm(par = initpar, fn = objective_rosenbrock, jac = gradient_rosenbrock,  :
  lmder: info = -1. Number of iterations has reached `maxiter' == 1024.

由于我最初的猜测是 (-1.2, 1.0),因此算法永远不会达到 (1,1)。我在 GitHub 上找到了该库的源代码,以下代码行与此处相关:

https://github.com/cran/minpack.lm/blob/master/src/nls_lm.c

OS->maxiter = INTEGER_VALUE(getListElement(control, "maxiter"));
if(OS->maxiter > 1024) {
  OS->maxiter = 1024;
  warning("resetting `maxiter' to 1024!");
}

为什么将最大迭代次数限制为 1024 是否有任何逻辑?有位和 2^10 的东西?我想将该库用于不同的应用程序,但这个迭代上限可能会阻止这种情况。任何见解将不胜感激。

【问题讨论】:

  • 有一个(相对)新的包 'nlsr' 旨在用纯 R 实现替换 nls(),并且还应该比例如 'minpack.lm' 更稳定和可靠.我会试一试——尽管对于大型应用程序来说它可能比“minpack.lm”慢。

标签: r mathematical-optimization levenberg-marquardt


【解决方案1】:

Git blame 说这个限制最大迭代的代码是在 2008 年的 1.1-0 版中引入的。NEWS file for the package 只能追溯到 1.1-6 版。除了您指向的那个之外,我在任何公共仓库中都找不到代码(这只是一个 CRAN 镜像;它不包含来自开发人员的任何可能给我们线索的 cmets/commit 消息/等。)

除了联系维护者之外,我认为很难弄清楚这个限制的基本原理是什么。

不过我确实有一些猜测。

maxiter 在代码中实际使用的唯一位置是 herehere - 在 R 代码中,而不是 Fortran 或 C 代码中,因此我们似乎极不可能处理类似 10-位无符号整数类型(无论如何这似乎都是不太可能的选择)。我认为存在限制是因为我们还定义了一个缓冲区来保存跟踪信息here

  double rsstrace[1024];

如您所见,它被硬编码为 1024 的长度。如果我们试图将 1025 次迭代的跟踪信息填充到这个数组中,可能会发生不好的事情......

我的建议:

  • 将代码中“1024”的所有实例更改为更大的值,看看会发生什么。只有四个:
$ find . -type f -exec grep -Hn 1024 {} \;
./src/nls_lm.c:141:    if(OS->maxiter > 1024) {
./src/nls_lm.c:142:      OS->maxiter = 1024;
./src/nls_lm.c:143:      warning("resetting `maxiter' to 1024!");
./src/minpack_lm.h:20:  double rsstrace[1024];
  • 最好在src/minpack_lm.h 中使用#define MAXITER 2048(或其他)并使用它而不是数值。
  • 联系维护者 (maintainer("minpack.lm")) 并询问他们这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多