-
-
Save will/1391f34d4a0981ae9240a936e7cc7572 to your computer and use it in GitHub Desktop.
exponentially smoothed moving average and variance
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ExpMovingStats | |
def initialize(@alpha : Float32) | |
@mean = 0.0 | |
@variance = 0.0 | |
end | |
def update(n) | |
n = n.to_f32 | |
beta = 1.0 - @alpha | |
@variance = beta * (@variance + (@alpha * ((n - @mean)**2))) | |
@mean = (beta * @mean) + (@alpha * n) | |
end | |
def inspect(io : IO) | |
io << "alpha:#{@alpha}\t" | |
io << "mean: #{@mean.to_s.ljust(18)}\t" | |
# io << "variance: #{@variance.to_s.ljust(18)}\t" | |
io << "std: #{Math.sqrt(@variance)}" | |
end | |
end | |
struct ManyAlphas | |
property a1, a5, a9 | |
def initialize | |
@a0 = ExpMovingStats.new(0.01) | |
@a1 = ExpMovingStats.new(0.1) | |
@a5 = ExpMovingStats.new(0.5) | |
@a9 = ExpMovingStats.new(0.9) | |
end | |
def update(n) | |
@a0.update(n) | |
@a1.update(n) | |
@a5.update(n) | |
@a9.update(n) | |
end | |
def report | |
p @a0 | |
p @a1 | |
p @a5 | |
p @a9 | |
puts | |
end | |
end | |
A = ManyAlphas.new | |
def add(b, count) | |
puts "#{b} added #{count} times" | |
count.times { A.update(b + rand) } | |
A.report | |
end | |
add 1, 60*60*3 | |
add 10, 5 | |
add 1, 60*60*24 | |
add 60*2, 1 | |
add 10, 5 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> crystal a.cr | |
1 added 10800 times | |
alpha:0.01 mean: 1.5367347108387475 std: 0.2860789761362086 | |
alpha:0.1 mean: 1.5858764719969363 std: 0.28348148931132433 | |
alpha:0.5 mean: 1.725604657630973 std: 0.24601226582562175 | |
alpha:0.9 mean: 1.8900307113084691 std: 0.13541845372467592 | |
10 added 5 times | |
alpha:0.01 mean: 1.9623216071328642 std: 1.8957107711289498 | |
alpha:0.1 mean: 5.127163855110824 std: 4.259336167806987 | |
alpha:0.5 mean: 10.014975864573719 std: 1.4969537340305565 | |
alpha:0.9 mean: 10.250793261568424 std: 0.09155541358114852 | |
1 added 86400 times | |
alpha:0.01 mean: 1.4869804268745175 std: 0.27990040249991266 | |
alpha:0.1 mean: 1.4671682770207035 std: 0.24949690662988483 | |
alpha:0.5 mean: 1.4173783457309548 std: 0.14976189971229048 | |
alpha:0.9 mean: 1.453421598422415 std: 0.08188044005780232 | |
120 added 1 times | |
alpha:0.01 mean: 2.674269789274198 std: 11.816662449568861 | |
alpha:0.1 mean: 13.342043587330135 std: 35.62541157596761 | |
alpha:0.5 mean: 60.81664892017993 std: 59.39936369754038 | |
alpha:0.9 mean: 108.33967050259999 std: 35.62876208816326 | |
10 added 5 times | |
alpha:0.01 mean: 3.0624991976971128 std: 11.649790832586334 | |
alpha:0.1 mean: 12.210285823347922 std: 27.409914231400048 | |
alpha:0.5 mean: 12.091553195063073 std: 13.67063371425023 | |
alpha:0.9 mean: 10.57956049215 std: 0.34997007299426763 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment