HotSpotのAbsSeqの減衰について

authorNariさんAbsSeqの「減衰」の話をしましたが、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)

こんなグラフが出てます:
HotSpotのAbsSeqの減衰について_第1张图片

普通の 平均値(average)より、 decaying averageのほうが新たに突っ込んでくるデータ (value)に影響されやすいと判明できます。したがって、averageは全体の平均状態を表現しますが、decaying averageのほうが「 最近」の平均状態をより精確に表現してます。

でも、何でこうなるんでしょうか?
たとえば、突っ込んでく数値は全部1とします。それで、averageもdecaying averageもつねに1となります。ですが、この「1」の中の構成はまったく違います:

average:
HotSpotのAbsSeqの減衰について_第2张图片

decaying average:
HotSpotのAbsSeqの減衰について_第3张图片

averageでは、古い値がどんどん積んで、新しく突っ込んでくる数値がだんだん平均値に影響しにくくなります。一方、decaying averageでは、新しい数値の「加重値」がつねにとある数値(例えばHotSpotの AbsSeq::_alpha)にしており、過去の状態にかかわらず影響を与えられます;言い換えてみれば、普通の平均値と比べ、過去のデータの影響力が「減衰」しつつあります。

你可能感兴趣的:(.net,F#,Ruby,D语言)