-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.py
More file actions
150 lines (132 loc) · 4.3 KB
/
Copy pathutil.py
File metadata and controls
150 lines (132 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import math
from allRVs import *
from mathutil import avgVar
class Util:
def __init__(self):
self.rvs = {'binomial':(Binomial,(20,.5)),
'uniform':(Uniform,(0,1)),
'bernoulli':(Bernoulli,(.5,)),
'geometric':(Geometric,(0.1,)),
'hyper geometric':(HyperGeometric, (20,20,20)),
'poisson':(Poisson,(12,)),
'exponential':(Exponential, (1/10,)),
'normal':(Normal, (0,1)),
'erlang': (Erlang, (3, 1 / 4))
}
"""
Markov's Inequality
P[X >= a] <= E[X] / a
if X is a non-negative RV and a > 0 (finite mean)
"""
def markovs(self,X,a):
if a > 0:
return X.expectedValue() / a
"""
Chebyshev's Inequality
P[|X - E[X]| >= a] <= Var(x)/a^2 (finite mean, variance, a > 0)
"""
def chebyshevs(self,X,a):
if a > 0:
return X.variance() / (a * a)
def hoeffdingsBin(self,X,λ,upperTail=True):
μ = X.expectedValue()
if upperTail:
return math.exp(-(λ**2)/(2*μ + λ))
return math.exp(-(λ**2)/(3*μ))
"""
Sn = Σ_i X_i, X_i independent RVs in [0,1]
E[Sn] = μ
then for all λ >= 0:
P[Sn >= μ + λ] <= e^(-λ^2/(2μ + λ))
P[Sn <= μ - λ] <= e^(-λ^2/3μ)
"""
def hoeffdings(self,Sn,λ,upperTail=True):
μ = sum([X.expectedValue() for X in Sn])
if upperTail:
return math.exp(-(λ**2)/(2*μ + λ))
return math.exp(-(λ**2)/(3*μ))
def flipFairCoin(self,n):
return self.flipCoin(n,.5)
def flipCoin(self,n,p):
return Binomial(n,p).genVar()
"""
Generates k random instances of each distribution in self.rvs, and displays the averages
"""
def simAll(self,k):
res = []
avgs = {}
print('=' * 75)
print(f'--- Statistics for k = {k} iterations ---')
for rv_name in self.rvs:
rv, conditions = self.rvs[rv_name]
X = rv(*conditions)
r = X.simulate(k)
res.append(r)
if r:
avgs[rv_name] = sum(r) / k
else:
avgs.append(0)
print('=' * 75)
"""
Returns a random instance of an RV given the name of the distribution and its necessary parameters
"""
def generateRV(self,rv_name,*conditions,display=True):
rv = self.rvs[rv_name][0]
X = rv(*conditions)
y = X.genVar()
if display:
print(f'{X}: {y}')
return y
def guess(self,data=None,k=None,target=None,verbose=False):
if data:
avg,var = avgVar(data)
m = {}
for rv_name in self.rvs:
rv, conditions = self.rvs[rv_name]
X = rv(*conditions)
m[str(X)] = X.expectedValue(),X.variance()
best = float('inf')
name = None
r = []
for x in m:
diff = abs(m[x][0] - avg) + abs(m[x][1] - var)
r.append((x,diff))
if diff < best:
best = diff
name = x
if verbose:
print(r)
print(f'Best fit: {name}')
return name
if k != None and target:
data = [target.genVar() for _ in range(k)]
return self.guess(data)
return -1
def iterate(self, f, vars=None, print=False):
if not vars:
vars = self.rvs
if print:
r = []
for rv_name in vars:
rv, conditions = vars[rv_name]
X = rv(*conditions)
if print:
r.append(f(X))
else:
f(X)
if print:
print(f'Outcomes: {r}')
def compareAll2ndMoments(self, rv_names):
m = {}
for s in rv_names:
m[s] = self.rvs[s]
self.iterate(RandomVariable.confirm2ndMoment, vars=m)
u = Util()
if __name__ == '__main__':
# for rv_name in u.rvs:
# print(rv_name,u.guess(None,1000,u.rvs[rv_name][0](*(u.rvs[rv_name][1]))))
u.compareAll2ndMoments(['uniform'])
#'erlang','binomial','bernoulli','exponential'
# u.simAll(k=10000)
X = Binomial(100,.5)
print(u.chebyshevs(X,25))