[url=http://d.hatena.ne.jp/authorNari/]authorNariさん[/url]が[url=http://d.hatena.ne.jp/authorNari/20101128/1290873182]AbsSeqの「減衰」[/url]の話をしましたが、decaying averageとaverageの関係についてはまだちょっと曖昧だと気がします。
グラフ生成のスクリプトをちょっといじったら:
こんなグラフが出てます:
[img]http://dl.iteye.com/upload/attachment/355066/2602e241-7af6-33b6-bea4-5ae519b4849e.png[/img]
普通の[color=indigo][b]平均値(average)[/b][/color]より、[color=darkred][b]decaying average[/b][/color]のほうが新たに突っ込んでくるデータ[color=blue][b](value)[/b][/color]に影響されやすいと判明できます。したがって、averageは全体の平均状態を表現しますが、decaying averageのほうが「[b]最近[/b]」の平均状態をより精確に表現してます。
でも、何でこうなるんでしょうか?
たとえば、突っ込んでく数値は全部1とします。それで、averageもdecaying averageもつねに1となります。ですが、この「1」の中の構成はまったく違います:
average:
[img]http://dl.iteye.com/upload/attachment/355071/860442c0-4c73-3186-ac70-a88a9bd372dc.png[/img]
decaying average:
[img]http://dl.iteye.com/upload/attachment/355077/fd11026a-2b47-3e1f-8b0b-7123d33f9d9c.png[/img]
averageでは、古い値がどんどん積んで、新しく突っ込んでくる数値がだんだん平均値に影響しにくくなります。一方、decaying averageでは、新しい数値の「加重値」がつねにとある数値(例えばHotSpotの[url=http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/f5603a6e5042/src/share/vm/utilities/numberSeq.cpp]AbsSeq::_alpha[/url])にしており、過去の状態にかかわらず影響を与えられます;言い換えてみれば、普通の平均値と比べ、過去のデータの影響力が「減衰」しつつあります。
グラフ生成のスクリプトをちょっといじったら:
# Ruby 1.9が必須
abs = []
total = 0.0
100.times do |i; davg|
val = sprintf("%.2f", rand).to_f
unless davg
davg, dvar = val, 0.0
else
davg = (1.0 - 0.7) * val + 0.7 * davg
diff = val - davg
dvar = (1.0 - 0.7) * (diff * diff) + 0.7 * dvar
end
abs << val
total += val
puts "#{val},#{davg},#{dvar},#{total / (i + 1)}"
end
p (abs.inject(0.0, &:+) / abs.size)
こんなグラフが出てます:
[img]http://dl.iteye.com/upload/attachment/355066/2602e241-7af6-33b6-bea4-5ae519b4849e.png[/img]
普通の[color=indigo][b]平均値(average)[/b][/color]より、[color=darkred][b]decaying average[/b][/color]のほうが新たに突っ込んでくるデータ[color=blue][b](value)[/b][/color]に影響されやすいと判明できます。したがって、averageは全体の平均状態を表現しますが、decaying averageのほうが「[b]最近[/b]」の平均状態をより精確に表現してます。
でも、何でこうなるんでしょうか?
たとえば、突っ込んでく数値は全部1とします。それで、averageもdecaying averageもつねに1となります。ですが、この「1」の中の構成はまったく違います:
average:
[img]http://dl.iteye.com/upload/attachment/355071/860442c0-4c73-3186-ac70-a88a9bd372dc.png[/img]
decaying average:
[img]http://dl.iteye.com/upload/attachment/355077/fd11026a-2b47-3e1f-8b0b-7123d33f9d9c.png[/img]
averageでは、古い値がどんどん積んで、新しく突っ込んでくる数値がだんだん平均値に影響しにくくなります。一方、decaying averageでは、新しい数値の「加重値」がつねにとある数値(例えばHotSpotの[url=http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/f5603a6e5042/src/share/vm/utilities/numberSeq.cpp]AbsSeq::_alpha[/url])にしており、過去の状態にかかわらず影響を与えられます;言い換えてみれば、普通の平均値と比べ、過去のデータの影響力が「減衰」しつつあります。