【问题标题】:Optimizing the code for error minimization优化代码以最小化错误
【发布时间】:2023-03-19 15:36:01
【问题描述】:

我已经编写了下面的代码,通过更改 alpha 的值(使用迭代方法)来最小化错误。

set.seed(16)
npoints = 10000
Y = round(runif(npoints), 3)
OY = sample(c(0, 1, 0.5), npoints, replace = T)

minimizeAlpha = function(Y, OY, alpha) {
    PY = alpha*Y
    error = OY - PY
    squaredError = sapply(error, function(x) x*x)
    sse = sum(squaredError)
    return(sse)
}
# # Iterate for 10000 values
alphas = seq(0.0001, 1, 0.0001)
sse = sapply(alphas, function(x) minimizeAlpha(Y, OY, x))
print(alphas[sse == min(sse)])

我使用sapply 进行基本优化。但是,如果点数超过 10000,则此代码将永远运行。那么,有没有更好的实现方式或任何标准技术来优化(如Bisection)。如果可以,请帮我优化代码。

注意:我需要至少 4 位小数的 alpha 值。

感谢任何帮助。

【问题讨论】:

  • 使用vapply 并使用返回值,即vapply(alpphas, function(x) minimizeAlpha(Y, OY, x), numeric(1)),您可能会获得一些效率
  • 应该看Code Review
  • for 替换为sapply 不是优化,这是一种误解。
  • @akrun - sse = vapply(alphas, FUN = function(x) minimizeAlpha(Y, OY, x), FUN.VALUE = 0.0)。代码仍然永远运行。这是正确的语法吗?
  • 我对@9​​87654330@ 说了一些效率,但没那么多。否则,一种选择可能是按“Y”、“OY”的长度复制 alpha,反之亦然,并应用该函数并替换函数中的 sapply

标签: r optimization


【解决方案1】:

替换sapply 而不是for 效率并不高,that’s a misconception。它通常只是更简单的代码。

但是,您实际上可以在代码中利用矢量化——而且 更快。

例如,sapply(error, function(x) x*x) 可以简单地替换为 x * x。因此,R 中数字的平方误差之和就是 sum((OY - PY) ** 2)

因此,您的整个功能归结为:

minimizeAlpha = function(Y, OY, alpha)
    sum((OY - alpha * Y) ** 2)

这应该更高效——但首先它是更好的代码和更易读的代码。

【讨论】:

  • 太棒了。这就像一个魅力。只是为了增加我的理解,是sapply(error, function(x) x*x)这条线需要时间吗?此外,如果 npoints 进一步增加,即使这需要时间。所以,我听说有一些像Bisection 这样的标准方法来解决这些问题?我在正确的道路上吗?
  • @KartheekPalepu 是的,sapply 行本质上将一个高效的 C 操作拆分为多个部分,并在 R 中而不是在 C 中运行更多(慢)代码。关于你的第二个问题,你是对的小路。另请查看实现高级策略的 optimizeoptim 函数。
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多