★ 時系列データ中の平均値と分散の更新 ★

 18 時系列データ中の平均値と分散の更新  かぜ  2002/04/30 (火) 05:06
  20 Re: 時系列データ中の平均値と分散の更新  青木繁伸  2002/04/30 (火) 12:33
   22 Re^2: 時系列データ中の平均値と分散の更新  かぜ  2002/04/30 (火) 18:16
    23 Re^3: 時系列データ中の平均値と分散の更新  青木繁伸  2002/04/30 (火) 20:23
  19 Re: 時系列データ中の平均値と分散の更新  出口慎二  2002/04/30 (火) 11:52


18. 時系列データ中の平均値と分散の更新  かぜ  2002/04/30 (火) 05:06
1次元のデータが入力された場合に,i番目のときの平均と分散をi-1番目までの平均と分散から求めるにはどうするのでしょうか?
というのも,n番目の入力のときに1〜nまでの入力値を足してnで割って平均値をだし,これをつかって分散を出すということをしているのですが,データが長くなると当然nの値が大きくなり,処理時間が長くなってしまいます。
1次元の入力データは連続でやってくるので,後になればなるほど処理が遅くなってしまいます。単純にn-1までの平均とn番目の入力値を足して2で割るとかじゃだめっぽいのでどうしたものかと。。。

     [このページのトップへ]


20. Re: 時系列データ中の平均値と分散の更新  青木繁伸  2002/04/30 (火) 12:33
学生が来たりで中断していて,出口さんの回答がありましたが,蛇足で(^_^;)

AWK で書いたらこんなふう(一行に一個のデータがあるとして)
{
    n++
    x = $1
    x -= mean
    mean += x/n
    ss += (n-1)*x*x/n # ss は,変動!
}

END {
    variance = ss/(n-1)
    print n, mean, variance
}

このアルゴリズムは,大きさのかなり異なるデータにも柔軟であること,(後で使う必要性がなければ)データを保存しておく必要がないことなどのメリットがある。

これを日本語で書くと

n = mean = ss = 0 とする

データがある限り繰り返し
  読んだデータを x とする
  n を 1 増やす
  x-mean を計算し x とする
  mean に x/n を加える
  ss に (n-1)*x*x/n を加える

データがなくなったらここへ
  データの個数は n,
  平均値は mean,
  不偏分散は ss/(n-1)

     [このページのトップへ]


22. Re^2: 時系列データ中の平均値と分散の更新  かぜ  2002/04/30 (火) 18:16
青木繁伸さん,出口慎二さん,ありがとうございます。
正確には平均と標準偏差が欲しかったので,Cで書くと以下のようになると
いうことですね。
#まだ実行して確認してませんが。。。
x 入力値,i 番目,mean 平均値,ss 平方和,sd 標準偏差

int function(int i, double x, double *mean, double *ss, double *sd) {

 x     = x - *mean;
 *mean = *mean + x/i;
 *ss   = *ss + (i-1)*x*x/i;
 *sd   = sqrt(*ss/(i-1));

 return;
}


int main() {

 while() {
  このループで,ガシガシと時系列データをとります。
  function(i, x, &mean, &ss, &sd);
  ここらへんで,平均値と標準偏差を使っての処理があります。

 }

 return;
}

     [このページのトップへ]


23. Re^3: 時系列データ中の平均値と分散の更新  青木繁伸  2002/04/30 (火) 20:23
>  while() {
>   このループで,ガシガシと時系列データをとります。
>   function(i, x, &mean, &ss, &sd);
>   ここらへんで,平均値と標準偏差を使っての処理があります。
> 
>  }
言うには及ばないと思いますが,わざわざ関数を呼んだりするとそのオーバーヘッドがあるかもしれませんね。直接書いたらいいと思います(長くもないし)。
それと,プログラミングスタイル以前の問題として,代入演算子(っていうんでしたっけ,+=みたいなの)を使うのがいいですよ(別にそれを使ったからと言って計算が速くなるわけではないけど)。

     [このページのトップへ]


19. Re: 時系列データ中の平均値と分散の更新  出口慎二  2002/04/30 (火) 11:52
> 1次元のデータが入力された場合に,i番目のときの平均と分散をi-1番目までの
> 平均と分散から求めるにはどうするのでしょうか?

「[i]番目のときの平均と分散を,[i-1]番目までの平均と"平方和"から求める」
で宜しければ,下記.[i-1]番目の平均値を仮平均とした計算です.

仮の偏差 = データ[i] - 平均[i-1]
平均[i] = 平均[i-1] + ( 仮の偏差 / i )
平方和[i] = 平方和[i-1] + ( i-1 ) * 仮の偏差^2 / i
i番目の分散 = 平方和[i] / ( i-1 )

#間違いありましたらフォローお願いします.>皆様

     [このページのトップへ]


● 「統計学関連なんでもあり」の過去ログ--- 019 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る