/welford.py (d829bff1dd721bdb8bbbed9a53db73efac471dac) (2465 bytes) (mode 100644) (type blob)
#!/usr/bin/env python
# coding: utf-8
# One does not simply calculate the sample variance.
# https://github.com/numpy/numpy/issues/6231
# Only one citation from:
# "Online calculations happen all the time (due to resource limitations),
# and a np.welford function would be convenient so that not everyone
# has to implement welford on its own over and over again."
# There are actually some code can be found in internet,
# but those I've seen supposed one-by-one data addition.
"""
This is implementation of generalized (for arbitrary sample sizes)
Welford's updating (online) algorithm, given by Chan et al. in two papers:
"Algorithms for computing the sample variance: Analysis and recommendations"
https://doi.org/10.1080%2F00031305.1983.10483115
and
"Updating Formulae and a Pairwise Algorithm for Computing Sample Variances."
http://i.stanford.edu/pub/cstr/reports/cs/tr/79/773/CS-TR-79-773.pdf
"""
import numpy as np
class Welford:
def __init__(self):
self.n = 0
def add(self, data):
n = len(data)
T = np.sum(data)
#č takhle je to numericky nejstabilnější
S = np.sum(np.square(data - T/n))
if self.n == 0:
self.n = n
self.T = T
self.S = S
else:
m = self.n #č to, co bylo
self.S += S + m /n /(m+n) * (n/m * self.T - T)**2
self.n += n
self.T += T
#č Pro řídká data, speciálita pro IS
#č uděláme explicitnou funkci s povinným sample size
def add_sparse(self, data, n):
"""Method processes sparse data, assumes
only non-zero values of entire sample (of size n) need to be given"""
sample_size = len(data)
assert n >= sample_size
T = np.sum(data)
mean = T/n
#č takhle je to numericky nejstabilnější
S = np.sum(np.square(data - mean)) + (n - sample_size) * mean**2
if self.n == 0:
self.n = n
self.T = T
self.S = S
else:
m = self.n #č to, co bylo
self.S += S + m /n /(m+n) * (n/m * self.T - T)**2
self.n += n
self.T += T
@property
def mean(self):
return self.T / self.n
@property
def var(self):
return self.S / self.n
@property
def s2(self):
return self.S / (self.n - 1)
Mode |
Type |
Size |
Ref |
File |
100644 |
blob |
28117 |
0907e38499eeca10471c7d104d4b4db30b8b7084 |
IS_stat.py |
100644 |
blob |
6 |
0916b75b752887809bac2330f3de246c42c245cd |
__init__.py |
100644 |
blob |
73368 |
3d245b8568158ac63c80fa0847631776a140db0f |
blackbox.py |
100644 |
blob |
11243 |
10c424c2ce5e8cdd0da97a5aba74c54d1ca71e0d |
candybox.py |
100644 |
blob |
26963 |
5106dbfd64b5403599d51598c03d9fad60956286 |
convex_hull.py |
100644 |
blob |
84851 |
811ef4d818e55cbe2d0305da62fcc2e1cada359a |
dicebox.py |
100644 |
blob |
36930 |
a775d1114bc205bbd1da0a10879297283cca0d4c |
estimation.py |
100644 |
blob |
34394 |
3f0ab9294a9352a071de18553aa687c2a9e6917a |
f_models.py |
100644 |
blob |
31540 |
a577087003a885ca7499d1ee9451e703fa9d2d36 |
g_models.py |
100644 |
blob |
20557 |
521db92b6961df7a46594d147bf4c4d49e828066 |
ghull.py |
100644 |
blob |
42820 |
1092b3b9f05b11d0c53b3aa63df2460ec355085d |
gl_plot.py |
100644 |
blob |
2718 |
5d721d117448dbb96c554ea8f0e4651ffe9ac457 |
gp_plot.py |
100644 |
blob |
29393 |
96162a5d181b8307507ba2f44bafe984aa939163 |
lukiskon.py |
100644 |
blob |
12867 |
5bc331e3ef3a8a6bfeb7ebe5e1ae4f4c58e8cc06 |
mart.py |
100644 |
blob |
7983 |
75455aa723db8bab291dcf941b92b9ffdba3aef1 |
mart3d.py |
100644 |
blob |
1364 |
944337088f060aabe029b611c27145bb28de4b38 |
maxes.py |
100644 |
blob |
5356 |
faac09f784e48599ff9a67e607a8e8a990b05d80 |
mgraph.py |
100644 |
blob |
2004 |
6ea8dc8f50a656c48f786d5a00bd6398276c9741 |
misc.py |
100644 |
blob |
3336 |
ce5171f10153dc0151d824369161d65fcbbda83b |
mplot.py |
100644 |
blob |
1450 |
4849f178b588e252b8c7f6a940d2d82ad35f6914 |
plot.py |
100644 |
blob |
2807 |
1feb1d43e90e027f35bbd0a6730ab18501cef63a |
plotly_plot.py |
100644 |
blob |
142508 |
2dd1eb8becf89c34b1243d424b9cae855b128e12 |
qt_plot.py |
100644 |
blob |
8206 |
5981023118262109fca8309d9b313b521a25f88f |
reader.py |
100644 |
blob |
4284 |
a0e0b4e593204ff6254f23a67652804db07800a6 |
samplebox.py |
100644 |
blob |
6558 |
df0e88ea13c95cd1463a8ba1391e27766b95c3a5 |
sball.py |
100644 |
blob |
5553 |
bac994ae58f1df80c7f8b3f33955af5402f5a4f3 |
sball_old.py |
100644 |
blob |
2605 |
0034d2e3f14c056541888235e59127e8f28b131d |
schemes.py |
100644 |
blob |
21623 |
281aef80556b8d22842b8659f6f0b7dab0ad71af |
shapeshare.py |
100644 |
blob |
48537 |
10f90c5614e9a04f0cd9f78e75f0db4a6becb3e4 |
simplex.py |
100644 |
blob |
13090 |
2b9681eed730ecfadc6c61b234d2fb19db95d87d |
spring.py |
100644 |
blob |
10940 |
6965eabdb5599bb22773e7fef1178f9b2bb51efe |
stm_df.py |
100644 |
blob |
3433 |
3063a1b6a132cbb5440ab95f1b6af1f1ff4266ac |
testcases_2D.py |
100644 |
blob |
2465 |
d829bff1dd721bdb8bbbed9a53db73efac471dac |
welford.py |
100644 |
blob |
22048 |
4a6014ca5255aa96059ff9ed5a7e29df98d26ffc |
whitebox.py |
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/iam-git/WellMet
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/iam-git/WellMet
Clone this repository using git:
git clone git://git.rocketgit.com/user/iam-git/WellMet
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main