まずは最小限に抑えるために、誤差関数を定義してみましょう:
MultError <- function(constant, predictions, actuals) {
return(sum((constant*predictions - actuals)^2))
}
これは、二乗誤差の合計である...あなたは別のものを使用することができます!
optimize()
は、関数、検索する間隔(最小値と最大値を調べることによって得ることができます)(predictions
/actuals
)と追加のパラメータが必要です。これは、デフォルトでは最小限に抑えられます
optimize(MultError, interval=c(0, 5), predictions=predictions, actuals=actuals)
これは、それぞれ最小の値と誤差関数の値が、ある
$minimum
[1] 2
$objective
[1] 0
を返します。
おそらく、あなたの試合は完璧ではありませんので、私はまた、人工的なノイズで
set.seed(1)
actuals <- rnorm(length(predictions), 2, 0.4) * predictions
それを試してみましたそして、それはかなり良い
$minimum
[1] 2.087324
$objective
[1] 22.21434
を返します!
EDIT:
ため、私はタイトルとOPが行っていたが、難しく考えでは、それはそれはやり過ぎかもしれないように思えた方向の最適化使用して、この質問に答えました。 mean(actuals/predictions)
をとるだけで何が問題になりますか?私は...万可能なデータセットのために
set.seed(1)
arithmetic <- opt <- numeric(10000)
for (trial in 1:10000) {
actuals <- rnorm(length(predictions), 2, 0.4) * predictions
arithmetic[trial] <- mean(actuals/predictions)
opt[trial] <- optimize(MultError, interval=c(0, 5), predictions=predictions, actuals=actuals)$minimum
}
をそれらの両方をテストすることを決めたので、私たちは平均して二乗誤差の和を最小化することによりを使用して定数を回復してきました
。推定値の平均値と分散は何ですか?
> mean(arithmetic)
[1] 1.999102
> mean(opt)
[1] 1.998695
両方とも平均でかなり良好です。
> var(arithmetic)
[1] 0.0159136
> var(opt)
[1] 0.02724814
しかし、算術平均推定量はより厳密に広がります。だから私はあなたが平均を取るべきだと主張するだろう!
フォーミュラに '+ 0'を追加すると、インターセプトに適合しないので、' predictions'を掛け合わせる単一の係数(つまり、OPが要求するもの)があります。 – Gregor
良い点、OPは前提条件としてそれを入れました。 (私は-1を使用して傍受を取り除き、+0は同じことを達成したことを知らなかった)。数式(たとえば、actuals〜predictions + predictions^2)を使って遊ぶことができます。あなたは基本的に数学的関係を推測しようとしています。 – rdodhia