• 締切済み

単純移動平均について

単純移動平均について 時系列に無限に発生するデータのうち、最近の何個かの平均を求め続けたい。例えば最近の10個の移動平均を求めるなら 移動平均=(Pm+Pm-1+Pm-2+・・・・・+Pm-9)/10 で求められますが、これを計算するためにはPmからPm-9まで10個のデータを記憶しておく場所が必要になります。 マイコンでは連続して沢山の記憶域を確保するのが困難なので、これを連続域を使用しないように手抜きして 新10個の合計=現10個の合計ー現10個の平均+新データ 新10個の平均=新10個の合計/10 で計算できれば大きな記憶域が不要になるので、10個ではなくて1000個の移動平均でもマイコンで計算できるようになるはずです。 そこでお聞きしたいのは、このような手法で本来の単純移動平均と同等の効果が期待できるかということです。 私が欲しいのは時系列データの長時間変化の傾向が知りたいのです。そのために短時間の変化は大きな流れの中に埋没させてしまいたい。それだけの要求なので、これでも何とか使い物になるかと期待しているのですが。 工学部系でして数学に弱いもので、よろしくお願いします。

みんなの回答

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.4

> どんな分野で使い物になるのか興味があります。 > もし、私のデータがそのような傾向があればと予想する材料にもなります。 > よろしければ、再度どのような分野かご教示ください。 ネットワーク分野です。 ネットワークで用いられるTCPでは、 データを転送する時に転送データをある程度小さな塊に分割し、 その塊を転送します。 この塊のうち、いくつかがデータ受信者に届かなかった場合は 届かなかったデータを再転送します。 しかしデータが届かないという事はネットワークが過負荷になっている可能性があります。 そんな時にすぐ再転送してしまうとネットワークがさらに過負荷になりますし、 再びデータの塊が消失してしまうかもしれません。 適切な時間待機して再転送を行うため、 TCPでは往復時間(RTT)というものを用いて再転送時間を決めています。 TCPでは受信者がデータの塊を受け取ると、受信者は送信者に応答を返します。 この時、送信者がデータの塊を送ってから応答が帰ってくるまでにかかる時間がRTTです。 RTTが短くなってくれば、その時はネットワーク負荷が軽い可能性があります。 この場合はすぐに再転送しても問題ないかも知れません。 RTTが長くなってくれば、その時はネットワーク負荷が高い可能性があります。 この場合は少し時間をおいてから再転送した方が良いかも知れません。 TCPではRTTの平均値(のようなもの)を求めるために、次の計算式を使っています。 (最新RTT平均値) = t(旧RTT平均値) + (1-t)(計測RTT値) 元のTCPではtの値は0.9が推奨されていたと思います。 他にもt = 1/8を用いる場合もあります (t = 1/8ならシフト演算で割り算ができるため)。 この再転送の話では「全時間のネットワーク負荷」よりも 「最近の時間のネットワーク負荷」の方が大事になってくると思います。 なのである程度旧データの傾向が弱くなっても良いのかもしれません。

uran2048
質問者

お礼

懐かしいお話をありがとうございます。昔、TAOという組織に属していた頃にネットワークの勉強をしていた頃に再転送までの時間はランダムに決定すると聞いていた記憶がありますが、そんな実情があったとは。 それでも私との違いは0.9の重み付けをしている点ですね。大変参考になりました。

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.3

その時系列に、誤差を乗っけてみます。 P[m] = (1 + ε[m]) (0.85) P[m-1] , ε[m] は -0.5 ~ 0.5 くらいの大きさで 何かランダムっぽい感じのデータ である場合を考えましょう。 m が大きめの値のとき、P[m] に対する影響は、 ε[m] と ε[1] のどちらが大きいですか?

uran2048
質問者

お礼

色々とヒントをいただけるのですが、そのセンスがないのでピンときません。 一般に雑音が大きくなれば信号が埋もれてS/Nは悪くなりますが、10個の記憶域を使う移動平均と比べてS/Nが更に悪くなると言われているのでしょうか。 実は、お二人の回答からデータによっては使えない場合が起きそうなのに、私のデータが未知の状態なので両方やってみるしかないと思い始めています。 少ない記憶域をやりくりすれば64個ほど確保できそうです。ただ、64個では瞬間的なノイズが1/64にしかならないのが不満です。

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.2

その方法だと、最初のほうのデータの影響が、 指数減衰するとはいえ、後々まで残ります。 Pm 自身が、9/10 倍よりも早く指数減衰する系列 だった場合に何が起こるか、考えてみると 面白いかもしれません。

uran2048
質問者

お礼

早速のレスポンスありがとうございます。 >Pm 自身が、9/10 倍よりも早く指数減衰する系列だった場合に何が起こるか、考えてみると面白いかもしれません。 私の頭では考えても分からないので、実際にEXCELでグラフを書いてみました。 Pm=0.85*Pm-1 で発生させた200個くらいの数列です。 その結果、原データから少し遅れて、原データと似たようなカーブで減衰しただけで、何が面白いか理解できませんでした。 よろしければ、再度何が面白いかご教示ください。 ただ、最初のほうのデータの影響が尾を引くのが私のケースで有効なのか悪影響なのか。 まだ、自分が扱うデータがどのように発生してくるか予想できないので自分でも困っています。

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.1

> 新10個の合計=現10個の合計ー現10個の平均+新データ > 新10個の平均=新10個の合計/10 > で計算できれば大きな記憶域が不要になるので、10個ではなくて1000個の移動平均でもマイコンで計算できるようになるはずです。 質問者さんの提案している式はもっと簡略化できます。 まず、上の式の「現10個の合計 - 現10個の平均」の部分ですが、これは 現10個の合計 - 現10個の平均 = 9(現10個の平均) という風に変形できます。 あとは質問者さんが提案している2式をまとめてしまって、 (新10個の平均) = 0.9(現10個の平均) + 0.1(新データ) としてしまえば良いと思います。 こうすれば現在の平均値と新データのみで、 新しい平均値を計算する事が出来ます。 > そこでお聞きしたいのは、このような手法で本来の単純移動平均と同等の効果が期待できるかということです。 ある状況によっては単純移動平均と大差ない結果がでるかもしれませんが、 別の状況では大きく結果が異なるかもしれません。 > 私が欲しいのは時系列データの長時間変化の傾向が知りたいのです。そのために短時間の変化は大きな流れの中に埋没させてしまいたい。それだけの要求なので、これでも何とか使い物になるかと期待しているのですが。 今回の計算式だと過去のデータがどんどん0.9倍されてしまいます。 つまり過去のデータの影響は指数関数的に減少していきます。 なので最近のデータの影響がやや強くなる傾向が出るはずです。 結局のところ、納得できる結果が得られるかどうかは 実際に試してみるまで分からないと思います。 一応、質問者さんが考えている方法は既に別の分野で使われたりしています。

uran2048
質問者

お礼

面白い考え方をありがとうございます。 残念ながら私が使っているマイコンには乗除算命令がありません。それでシフト命令で代行しますので2のべき乗で乗除することしか考えていませんでした。 >結局のところ、納得できる結果が得られるかどうかは実際に試してみるまで分からないと思います。 自分でも扱うデータの素性が予想できないので、結局試してみるしかなさそうですね。 >質問者さんが考えている方法は既に別の分野で使われたりしています。 どんな分野で使い物になるのか興味があります。もし、私のデータがそのような傾向があればと予想する材料にもなります。よろしければ、再度どのような分野かご教示ください。