【问题标题】:Optimization in R - not accurate enoughR中的优化 - 不够准确
【发布时间】:2015-11-07 22:00:25
【问题描述】:

假设 f(k) = exp(k/200) - 1,我们想要最小化 ( f(a) + f(b) + f(c) + f(d) - pi )^2。解应该是 a = 6, b = 75, c = 89, d = 226。这个解的平方和约为 8e-17。

sumsq <- function(theta, n=200) {
     f <- function(k) exp(k/n) - 1
     (f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2
}
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq)
# theta$par = 62.97 106.89, 78.64, 189.82
# theta$value = 6.32e-10
# sumsq(c(6,75,89,226)) = 8.20e-17

很明显,a = 6, b = 75, c = 89, d = 226 的解比 optim 函数通过比较平方和给出的解要好。我想知道如何使用其优化技术使 R 更准确。我也试过nlm()函数,没有成功。

使用的 pi 值是 3.1415926535897931 - 我认为 pi 的准确性不是 optim 函数没有产生最优解的原因

【问题讨论】:

  • 我并不真正关心这个特殊的问题,而是关心如何提高 R 优化技术的准确性
  • R 认为这些数字没有什么不同:all.equal(theta$value, sumsq(c(6,75,89,226))) 并且等于零 all.equal(theta$value,0)。您能否缩放函数以使数值求解器的差异更加明显?
  • 我猜这个问题有几个解决方案。我怀疑如果您采用不同的起始条件,您会发现不同的最小值。这将是数值优化问题的特征,与 R 无关。
  • 但这很奇怪——我可以暴力破解自然数的解决方案,226^4 次迭代并得到结果(一个简单的解决方案)。肯定有一种方法可以提高 optim 寻找的准确性吗?
  • 基本上你正在尝试寻找 f(a)+f(b)+f(c)+f(d)=pi 的解决方案。我不是数学家,但我认为可以安全地假设有无限数量的组合(a、b、c、d)可以满足这个条件。鉴于此,找到您正在寻找的一个组合只是一个巧合。

标签: r precision floating-accuracy


【解决方案1】:

正如评论者所说,这不是optim 的准确性问题,而是optim 使用的算法可能不适合您的特定问题。 R中有very many优化包和接口;我使用rgenoud 包改善了使用fitdist 包(我相信默认使用optim)的基于最大似然性的参数估计的良好结果。

当然,另一个问题是您提出的问题是否实际上具有一个全局最小值,该全局最小值在您可以指定/R 可以检测到的数值容差范围内与其他局部最小值有区别。 6.32e-10 和 8.20e-17 都非常小,远远超出了我认为在我的工作中可以接受的数值公差......但我不了解你的领域。

【讨论】:

  • 好的,谢谢 - 我会将问题标记为已解决。我意识到使用 BFGS 方法的 optim 函数实际上可以提供比我以前使用的更好的优化。所以我认为你是对的 - 可能是 optim 不适合我的特定问题。
【解决方案2】:

我使用了“BFGS”方法:

sumsq <- function(theta, n=200) {
  f <- function(k) exp(k/n) - 1
  (f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2
}
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq, method="BFGS")

看结果:

> theta
$par
[1]  -2.629695  71.159586  52.952260 246.174513

$value
[1] 4.009243e-22

$counts
function gradient 
      19        8 

$convergence
[1] 0

【讨论】:

  • 好的,谢谢。当使用其他方法时,知道 optim 实际上会产生更准确的解决方案会很有帮助。事实上,我的解决方案只是整数上最准确的。
【解决方案3】:

这不是一个适定的最小化问题。有无数种可能的解决方案。其中之一是

a=b=c=d=200*log(1+pi/4)

数值近似

115.92829021682383

如果插入数字,则在这种情况下,残差 sumsq 为零(在数值精度范围内)。

如果强加例如只允许自然数或只允许整数的限制,则该问题可能要解决起来要复杂得多。在这种情况下,您的组合(及其排列)可能是最好的,但目前我不知道如何验证这一点。在存在这种约束的情况下进行最小化将是一个性质不同的问题,这对数学家来说可能很有趣。在任何情况下,通常的数值优化算法都不允许引入这样的约束。

【讨论】:

  • 是的,我同意,我现在意识到这个问题应该在别处问过。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
相关资源
最近更新 更多