R 中的优化 - 不够准确
Optimization in R - not accurate enough
假设 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 函数没有产生最优解的原因
正如评论者所说,这不是 optim
的准确性问题,而是 optim
使用的算法可能不适合您的特定问题。有 very many optimization packages and interfaces available in R; I have had good results using the rgenoud
包可以使用 fitdist
包改进基于最大似然的参数估计(我相信默认情况下使用 optim
)。
当然,另一个问题是您提出的问题是否实际上具有全局最小值,该全局最小值在您可以 specify/R 可以检测到的数值公差范围内与其他局部最小值区分开来。 6.32e-10 和 8.20e-17 都非常小,远远超出了我认为在我的工作中可以接受的数值公差......但我不知道你的领域。
我使用了"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
这不是适定的最小化问题。有无数种可能的解决方案。其中之一是
a=b=c=d=200*log(1+pi/4)
在数值上大约是
115.92829021682383
如果插入数字,本例中的残差 sumsq
为零(在数值精度内)。
如果有人强加,例如,只允许自然数或整数的限制,解决这个问题可能会复杂得多。在那种情况下,您的组合(及其排列)可能是最好的,但目前我不知道如何验证这一点。在存在这种约束的情况下进行最小化将是一个性质不同的问题,这可能对数学家很有趣。无论如何,通常的数值优化算法不允许引入这样的约束。
假设 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 函数没有产生最优解的原因
正如评论者所说,这不是 optim
的准确性问题,而是 optim
使用的算法可能不适合您的特定问题。有 very many optimization packages and interfaces available in R; I have had good results using the rgenoud
包可以使用 fitdist
包改进基于最大似然的参数估计(我相信默认情况下使用 optim
)。
当然,另一个问题是您提出的问题是否实际上具有全局最小值,该全局最小值在您可以 specify/R 可以检测到的数值公差范围内与其他局部最小值区分开来。 6.32e-10 和 8.20e-17 都非常小,远远超出了我认为在我的工作中可以接受的数值公差......但我不知道你的领域。
我使用了"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
这不是适定的最小化问题。有无数种可能的解决方案。其中之一是
a=b=c=d=200*log(1+pi/4)
在数值上大约是
115.92829021682383
如果插入数字,本例中的残差 sumsq
为零(在数值精度内)。
如果有人强加,例如,只允许自然数或整数的限制,解决这个问题可能会复杂得多。在那种情况下,您的组合(及其排列)可能是最好的,但目前我不知道如何验证这一点。在存在这种约束的情况下进行最小化将是一个性质不同的问题,这可能对数学家很有趣。无论如何,通常的数值优化算法不允许引入这样的约束。