Skip to content

Instantly share code, notes, and snippets.

@will
Created June 8, 2020 22:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save will/1391f34d4a0981ae9240a936e7cc7572 to your computer and use it in GitHub Desktop.
Save will/1391f34d4a0981ae9240a936e7cc7572 to your computer and use it in GitHub Desktop.
exponentially smoothed moving average and variance
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
> 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