HotSpotのAbsSeqの減衰について

[url=http://d.hatena.ne.jp/authorNari/]authorNariさん[/url]が[url=http://d.hatena.ne.jp/authorNari/20101128/1290873182]AbsSeqの「減衰」[/url]の話をしましたが、decaying averageとaverageの関係についてはまだちょっと曖昧だと気がします。

グラフ生成のスクリプトをちょっといじったら:
# 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])にしており、過去の状態にかかわらず影響を与えられます;言い換えてみれば、普通の平均値と比べ、過去のデータの影響力が「減衰」しつつあります。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值