/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 |
72 |
458b7e2ca46acd9ec0d2caf3cc4d72e515bb73dc |
__main__.py |
100644 |
blob |
73368 |
3d245b8568158ac63c80fa0847631776a140db0f |
blackbox.py |
100644 |
blob |
11243 |
10c424c2ce5e8cdd0da97a5aba74c54d1ca71e0d |
candybox.py |
100644 |
blob |
29927 |
066a2d10ea1d21daa6feb79fa067e87941299ec4 |
convex_hull.py |
100644 |
blob |
102798 |
059ae717e71c651975673420cd8230fbef171e5e |
dicebox.py |
100644 |
blob |
36930 |
a775d1114bc205bbd1da0a10879297283cca0d4c |
estimation.py |
100644 |
blob |
34394 |
3f0ab9294a9352a071de18553aa687c2a9e6917a |
f_models.py |
100644 |
blob |
31142 |
3e14ac49d16a724bb43ab266e8bea23114e47958 |
g_models.py |
100644 |
blob |
20908 |
457329fe567f1c0a9950c21c7c494cccf38193cc |
ghull.py |
100644 |
blob |
2718 |
5d721d117448dbb96c554ea8f0e4651ffe9ac457 |
gp_plot.py |
100644 |
blob |
29393 |
96162a5d181b8307507ba2f44bafe984aa939163 |
lukiskon.py |
100644 |
blob |
2004 |
6ea8dc8f50a656c48f786d5a00bd6398276c9741 |
misc.py |
040000 |
tree |
- |
e5999d6694937f9afb4db06b5f23c14b5a5894c6 |
mplot |
100644 |
blob |
1462 |
437b0d372b6544c74fea0d2c480bb9fd218e1854 |
plot.py |
100644 |
blob |
2807 |
1feb1d43e90e027f35bbd0a6730ab18501cef63a |
plotly_plot.py |
040000 |
tree |
- |
82bc1cfaa8d3caab910e6a4e165867257e2db4eb |
qt_gui |
100644 |
blob |
8566 |
5c8f8cc2a34798a0f25cb9bf50b5da8e86becf64 |
reader.py |
100644 |
blob |
4284 |
a0e0b4e593204ff6254f23a67652804db07800a6 |
samplebox.py |
100644 |
blob |
6558 |
df0e88ea13c95cd1463a8ba1391e27766b95c3a5 |
sball.py |
100644 |
blob |
6739 |
0b6f1878277910356c460674c04d35abd80acf13 |
schemes.py |
100644 |
blob |
76 |
11b2fde4aa744a1bc9fa1b419bdfd29a25c4d3e8 |
shapeshare.py |
100644 |
blob |
54884 |
fbe116dab4fc19bb7568102de21f53f15a8fc6bf |
simplex.py |
100644 |
blob |
13090 |
2b9681eed730ecfadc6c61b234d2fb19db95d87d |
spring.py |
100644 |
blob |
10953 |
da8a8aaa8cac328ec0d1320e83cb802b562864e2 |
stm_df.py |
040000 |
tree |
- |
7e3ae622bfea167d7e9d2b967255cb3c1e8f2ad6 |
testcases |
100644 |
blob |
2465 |
d829bff1dd721bdb8bbbed9a53db73efac471dac |
welford.py |
100644 |
blob |
24252 |
9b916e40ae5bb85d1fa9be902063b017c9958ca1 |
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