Skip to content

Instantly share code, notes, and snippets.

@calvingiles
Created September 9, 2014 10:22
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 calvingiles/04cd49a520341e463f37 to your computer and use it in GitHub Desktop.
Save calvingiles/04cd49a520341e463f37 to your computer and use it in GitHub Desktop.
Online mean and variance with generators
def online_mean():
"""
Return an initialised generator for online mean (next() has been called).
"""
omean = _online_mean()
next(omean)
return omean
def _online_mean():
n = 0
mean = 0
while(True):
if (n < 1):
x = yield 0
else:
x = yield mean
n = n + 1
delta = x - mean
mean = mean + delta/n
def online_variance():
"""
Return an initialised generator for online variance (next() has been called).
"""
ovar = _online_variance()
next(ovar)
return ovar
def _online_variance():
n = 0
mean = 0
M2 = 0
while(True):
if (n < 2):
x = yield 0
else:
x = yield M2/(n - 1)
n = n + 1
delta = x - mean
mean = mean + delta/n
M2 = M2 + delta*(x - mean)
omean = online_mean()
ommean = online_moving_mean()
ovar = online_variance()
for x in range(100):
print(x, omean.send(x), ommean.send(x), ovar.send(x)**0.5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment