R中的优化 - 不够准确

时间:2015-08-14 15:26:55

标签: r precision floating-accuracy

假设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的解比优化函数通过比较平方和得到的解更好。我想知道如何通过其优化技术使R更准确。我也尝试过nlm()函数,但没有成功。

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

3 个答案:

答案 0 :(得分:2)

正如评论者所说,这不是optim准确性的问题,而是optim使用的算法可能不适合您的特定问题。 R中有very many个优化包和接口;我使用rgenoud软件包获得了良好的结果,使用fitdist软件包(我认为默认情况下使用optim)来改进基于最大可能性的参数估算。

另一个问题当然是,你所提出的问题实际上是否具有全局最小值,可以与你可以指定/ R可以检测的数值公差内的其他局部最小值区分开来。 6.32e-10和8.20e-17都非常小,远远超出了我认为可以接受的数字公差......但我不知道你的领域。

答案 1 :(得分:2)

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

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

在数值上大约是

115.92829021682383

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

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

答案 2 :(得分:1)

我使用了“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