我已经编写了下面的代码,通过更改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值。
感谢任何帮助。
答案 0 :(得分: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)
这应该更有效 - 但首先它是更好的代码,更具可读性。