平均と標準偏差を持つ実数値の配列があります。配列要素が別の要素置き換えられた場合、新しい平均は
このアプローチの利点は、の値に関係なく一定の計算が必要になることです。を使用した計算のように、を使用してを計算する方法はありますか?
平均と標準偏差を持つ実数値の配列があります。配列要素が別の要素置き換えられた場合、新しい平均は
このアプローチの利点は、の値に関係なく一定の計算が必要になることです。を使用した計算のように、を使用してを計算する方法はありますか?
回答:
「分散計算するためのアルゴリズム」のWikipediaの記事のセクションの要素は、あなたの観測に追加された場合は分散を計算する方法を示しています。(標準偏差は分散の平方根であることを思い出してください。)を配列に追加してから、
編集:上記の式は間違っているようです、コメントを参照してください。
現在、要素を置き換えるとは、観測値を追加して別の観測値を削除することを意味します。両方とも上記の式で計算できます。ただし、数値の安定性の問題が発生する可能性があることに注意してください。引用された記事は、数値的に安定したバリアントも提案しています。
、自分で式を導き出す計算するためにサンプル分散及び代替の定義を使用してμをN E wは、あなたが適切な場合が得られた式。これは、得られるσ 2 N E W - σ 2 O のL Dを端に、そしてためしたがって式σ N E W所与σ oをLとDと。私の表記では、要素 x nを x ′ nで置き換えると仮定します。
総和ではの依存何かに変身μ O L Dが、あなたはきちんとした結果を導き出すためにもう少し方程式を作業する必要があります。これにより、一般的なアイデアが得られます。
リンクされたウィキペディアの記事を読んでいると思うものに基づいて、「実行中の」標準偏差を維持できます。
real sum = 0;
int count = 0;
real S = 0;
real variance = 0;
real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
real oldMean;
if (count >= 1)
{
real oldMean = sum / count;
sum = sum + x;
count = count + 1;
real newMean = sum / count;
S = S + (x-oldMean)*(x-newMean)
}
else
{
sum = x;
count = 1;
S = 0;
}
//estimated Variance = (S / (k-1) )
//estimated Standard Deviation = sqrt(variance)
if (count > 1)
return sqrt(S / (count-1) );
else
return 0;
}
記事では彼らは別々のランニングsum
とを維持しませんcount
が、代わりにシングルを持っていmean
ます。私が今日やっていることでは、count
(統計的な目的で)を維持しているため、毎回平均を計算する方が便利です。