- 締切済み
データの系列の平均の求め方のアルゴリズム
100個の数値が並んでいてその平均を求めるという場合、全部足して100で割る、ということしか考えられなかったのですが、そうではないアルゴリズムがあるようです。プログラム的な説明だと以下のようです。 ave=0.0 平均が分かっていると仮定する。 do i=1,100 xx=x(i)-ave あるデータx(i)と、分かっている思っている平均aveとの差をとる。 ave=ave+xx/i その差をそこまでのデータ個数iで割る。新しいデータによる平均の変化量とみてそれを前の平均に加える。 enddo それを十分大きな回数繰り返す。そうすると平均に近づく。 このような考え方はある学問分野では常識なのかもしれませんが、近似ということになると思います。データの数が十分大きくて最初の平均が実際と異なるエラーが相対的に減ってくるとかです。このアルゴリズムにはどのような制約が付くものでしょうか。例えば乱数を発生させてその平均を求めるときに全部発生させてから和を取って個数で割るのではなく、1つ1つ乱数を発生させて発生し終わった時点で平均が計算できてしまっている、ということになります。分散も同じようなアルゴリズムになると思います。実験や理論的な検討を加えることはできると思いますが、あまりにも簡単なので常識であり、かつ性質も調べられているのではないかと思ってお尋ねしました。いかがでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- OKWavex
- ベストアンサー率22% (1222/5383)
99個の平均は以下の通り a99 = x1+x2+x3+・・・+x99)/99 100個の平均は以下の通り a100 =(x1+x2+x3+・・・+x99+x100)/100 = (x1+x2+x3+・・・+x99+x100)/99 ×99/100 = ( (x1+x2+x3+・・・+x99)/99+x100/99 ) ×99/100 = ( a99 + x100/99 ) ×99/100 = a99 ×99/100 + x100/100 = a99×(100-1)/100 +x100/100 = a99 - a99/100 + x100/100 = a99 + (x100-a99)/100 これは近似式ではありません すなわち > xx=x(i)-ave あるデータx(i)と、分かっている思っている平均aveとの差をとる。 > ave=ave+xx/i その差をそこまでのデータ個数iで割る。新しいデータによる > 平均の変化量とみてそれを前の平均に加える。 は正しい平均値の計算方法であり近似式ではありませんので個数が増えるごとにその範囲での正しい平均を計算しています
- f272
- ベストアンサー率46% (8625/18445)
0個の平均は0ですからave[0]=0 (n-1)個までの平均ave[n-1]がわかっていれば,それにn個目のx[n]を加えた平均ave[n]は ave[n]=(ave[n-1]*(n-1)+x[n])/n で求められます。式を変形すると ave[n]=ave[n-1]+(x[n]-ave[n-1])/n ですね。 つまり,あなたの書いたアルゴリズムは正確に平均を求めているのであって,近似ではありません。もちろん数値計算ですから丸目誤差などはあるでしょうが,そういうものを除けば全く正確です。
お礼
なるほど、考えてみると確かにそうですね。過去をメモリに収める必要はないということが分かりました。非常にシンプルなのに気づきませんでした。
お礼
考えてみるとほんとにそうですね。過去をすべて記録しておく必要があると思っていました。これだと過去のデータを保存しておく必要がありませんね。気が付きませんでした。