2016-08-26 17 views
1

私は、反復法を使用してアルファの値を変更することによって、エラーの最小化のために以下のコードを書いています。エラー最小化のためのコードの最適化

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小数のアルファ値が必要です。

何か助けていただければ幸いです。

+0

'vapply'で効率を得ることができます。返り値' vapply(alpphas、function(x)minimizeAlpha(Y、OY、x)、numeric(1)) ' – akrun

+0

[codereview.se ] –

+0

'for 'を' sapply'に置き換えることは最適化ではなく、誤解です。 –

答えて

1

forの代わりにsapplyを置き換えると、効率的ではありません。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) 

これは、より効率的にする必要があります - しかし、何よりもまず、それは良いコードと、より読みやすいです。

+0

これは魅力のように機能します。私の理解を高めるために、これはサプライズ(エラー、関数(x)x * x) 'この行に時間がかかっていましたか?また、さらにnポイントを増やしてもこれには時間がかかります。だから、私は、このような問題を解決するための「二分法」のような標準があると聞いたことがありますか?私は正しい道にいますか? –

+0

@KartheekPalepuはい、 'sapply'行は本質的に効率的なC操作を部品に裂き、CではなくRでより遅いコードを実行します。あなたの2番目の質問に関して、あなたは正しい道を進んでいます。このための高度な戦略を実装する 'optimize'関数と' optim'関数も見てください。 –