@@ -28,15 +28,17 @@ class PositiveUnivariateContinuous(UnivariateContinuous):
28
28
29
29
def __init__ (self , * args , ** kwargs ):
30
30
transform = kwargs .get ('transform' , transforms .log )
31
- super (PositiveUnivariateContinuous , self ).__init__ (transform = transform , * args , ** kwargs )
31
+ super (PositiveUnivariateContinuous , self ).__init__ (transform = transform ,
32
+ * args , ** kwargs )
32
33
33
34
34
35
class UnitUnivariateContinuous (UnivariateContinuous ):
35
36
"""Base class for univariate continuous distributions in [0,1]"""
36
37
37
38
def __init__ (self , * args , ** kwargs ):
38
39
transform = kwargs .get ('transform' , transforms .logodds )
39
- super (UnitUnivariateContinuous , self ).__init__ (transform = transform , * args , ** kwargs )
40
+ super (UnitUnivariateContinuous , self ).__init__ (transform = transform ,
41
+ * args , ** kwargs )
40
42
41
43
def assert_negative_support (var , label , distname , value = - 1e-6 ):
42
44
# Checks for evidence of positive support for a variable
@@ -123,7 +125,8 @@ class Uniform(UnivariateContinuous):
123
125
Upper limit.
124
126
"""
125
127
126
- def __init__ (self , lower = 0 , upper = 1 , transform = 'interval' , size = None , ndim = None , dtype = None , * args , ** kwargs ):
128
+ def __init__ (self , lower = 0 , upper = 1 , transform = 'interval' , size = None ,
129
+ ndim = None , dtype = None , * args , ** kwargs ):
127
130
128
131
lower = tt .as_tensor_variable (lower )
129
132
upper = tt .as_tensor_variable (upper )
@@ -133,7 +136,8 @@ def __init__(self, lower=0, upper=1, transform='interval', size=None, ndim=None,
133
136
self .mean = (upper + lower ) / 2.
134
137
self .median = self .mean
135
138
136
- super (Uniform , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
139
+ super (Uniform , self ).__init__ (self .dist_params , ndim , size , dtype ,
140
+ * args , ** kwargs )
137
141
138
142
if transform == 'interval' :
139
143
self .transform = transforms .interval (lower , upper )
@@ -164,7 +168,8 @@ def __init__(self, ndim=None, size=None, dtype=None, *args, **kwargs):
164
168
self .median = tt .as_tensor_variable (0. )
165
169
self .dist_params = (self .median ,)
166
170
167
- super (Flat , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
171
+ super (Flat , self ).__init__ (self .dist_params , ndim , size , dtype , * args ,
172
+ ** kwargs )
168
173
169
174
def random (self , point = None , size = None , repeat = None ):
170
175
raise ValueError ('Cannot sample from Flat distribution' )
@@ -228,7 +233,8 @@ def __init__(self, *args, **kwargs):
228
233
sd = kwargs .pop ('sd' , None )
229
234
tau = kwargs .pop ('tau' , None )
230
235
231
- def __init__ (self , mu = 0.0 , tau = None , sd = None , ndim = None , size = None , dtype = None , * args , ** kwargs ):
236
+ def __init__ (self , mu = 0.0 , tau = None , sd = None , ndim = None , size = None ,
237
+ dtype = None , * args , ** kwargs ):
232
238
233
239
mu = tt .as_tensor_variable (mu )
234
240
self .mean = self .median = self .mode = self .mu = mu
@@ -240,7 +246,8 @@ def __init__(self, mu=0.0, tau=None, sd=None, ndim=None, size=None, dtype=None,
240
246
241
247
self .dist_params = (self .mu , self .tau )
242
248
243
- super (Normal , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
249
+ super (Normal , self ).__init__ (self .dist_params , ndim , size , dtype ,
250
+ * args , ** kwargs )
244
251
245
252
def random (self , point = None , size = None , repeat = None ):
246
253
mu , tau , sd = draw_values ([self .mu , self .tau , self .sd ],
@@ -280,7 +287,9 @@ class HalfNormal(PositiveUnivariateContinuous):
280
287
tau : float
281
288
Precision (tau > 0).
282
289
"""
283
- def __init__ (self , tau = None , sd = None , ndim = None , size = None , dtype = None , * args , ** kwargs ):
290
+ def __init__ (self , tau = None , sd = None , ndim = None , size = None , dtype = None ,
291
+ * args , ** kwargs ):
292
+
284
293
self .tau , self .sd = get_tau_sd (tau = tau , sd = sd )
285
294
self .mean = tt .sqrt (2 / (np .pi * self .tau ))
286
295
self .variance = (1. - 2 / np .pi ) / self .tau
@@ -290,7 +299,8 @@ def __init__(self, tau=None, sd=None, ndim=None, size=None, dtype=None, *args, *
290
299
291
300
self .dist_params = (self .tau ,)
292
301
293
- super (HalfNormal , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
302
+ super (HalfNormal , self ).__init__ (self .dist_params , ndim , size , dtype ,
303
+ * args , ** kwargs )
294
304
295
305
def random (self , point = None , size = None , repeat = None ):
296
306
sd = draw_values ([self .sd ], point = point )
@@ -362,7 +372,8 @@ class Wald(PositiveUnivariateContinuous):
362
372
The American Statistician, Vol. 30, No. 2, pp. 88-90
363
373
"""
364
374
365
- def __init__ (self , mu = None , lam = None , phi = None , alpha = 0. , ndim = None , size = None , dtype = None , * args , ** kwargs ):
375
+ def __init__ (self , mu = None , lam = None , phi = None , alpha = 0. , ndim = None ,
376
+ size = None , dtype = None , * args , ** kwargs ):
366
377
367
378
self .mu , self .lam , self .phi = self .get_mu_lam_phi (mu , lam , phi )
368
379
self .alpha = alpha
@@ -377,7 +388,8 @@ def __init__(self, mu=None, lam=None, phi=None, alpha=0., ndim=None, size=None,
377
388
378
389
self .dist_params = (self .mu , self .lam , self .alpha )
379
390
380
- super (Wald , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
391
+ super (Wald , self ).__init__ (self .dist_params , ndim , size , dtype , * args ,
392
+ ** kwargs )
381
393
382
394
def get_mu_lam_phi (self , mu , lam , phi ):
383
395
res = None
@@ -421,13 +433,12 @@ def logp(self, value):
421
433
lam = self .lam
422
434
alpha = self .alpha
423
435
# value *must* be iid. Otherwise this is wrong.
424
- return bound (logpow (lam / (2. * np .pi ), 0.5 )
425
- - logpow (value - alpha , 1.5 )
426
- - (0.5 * lam / (value - alpha )
427
- * (( value - alpha - mu ) / mu )** 2 ),
436
+ return bound (logpow (lam / (2. * np .pi ), 0.5 ) -
437
+ logpow (value - alpha , 1.5 ) -
438
+ (0.5 * lam / (value - alpha ) * (( value - alpha - mu ) /
439
+ mu )** 2 ),
428
440
# XXX these two are redundant. Please, check.
429
- value > 0 , value - alpha > 0 ,
430
- mu > 0 , lam > 0 , alpha >= 0 )
441
+ value > 0 , value - alpha > 0 , mu > 0 , lam > 0 , alpha >= 0 )
431
442
432
443
433
444
class Beta (UnitUnivariateContinuous ):
@@ -473,7 +484,8 @@ class Beta(UnitUnivariateContinuous):
473
484
the binomial distribution.
474
485
"""
475
486
476
- def __init__ (self , alpha = None , beta = None , mu = None , sd = None , ndim = None , size = None , dtype = None , * args , ** kwargs ):
487
+ def __init__ (self , alpha = None , beta = None , mu = None , sd = None , ndim = None ,
488
+ size = None , dtype = None , * args , ** kwargs ):
477
489
alpha , beta = self .get_alpha_beta (alpha , beta , mu , sd )
478
490
self .alpha = alpha
479
491
self .beta = beta
@@ -486,7 +498,8 @@ def __init__(self, alpha=None, beta=None, mu=None, sd=None, ndim=None, size=None
486
498
487
499
self .dist_params = (self .alpha , self .beta )
488
500
489
- super (Beta , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
501
+ super (Beta , self ).__init__ (self .dist_params , ndim , size , dtype , * args ,
502
+ ** kwargs )
490
503
491
504
def get_alpha_beta (self , alpha = None , beta = None , mu = None , sd = None ):
492
505
if (alpha is not None ) and (beta is not None ):
@@ -512,9 +525,8 @@ def logp(self, value):
512
525
alpha = self .alpha
513
526
beta = self .beta
514
527
515
- return bound (logpow (value , alpha - 1 ) + logpow (1 - value , beta - 1 )
516
- - betaln (alpha , beta ),
517
- value >= 0 , value <= 1 ,
528
+ return bound (logpow (value , alpha - 1 ) + logpow (1 - value , beta - 1 ) -
529
+ betaln (alpha , beta ), value >= 0 , value <= 1 ,
518
530
alpha > 0 , beta > 0 )
519
531
520
532
@@ -548,8 +560,6 @@ def __init__(self, lam, ndim=None, size=None, dtype=None, *args, **kwargs):
548
560
549
561
self .variance = lam ** - 2
550
562
551
- assert_negative_support (lam , 'lam' , 'Exponential' )
552
-
553
563
super (Exponential , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
554
564
555
565
def random (self , point = None , size = None , repeat = None ):
@@ -596,7 +606,8 @@ def __init__(self, mu, b, ndim=None, size=None, dtype=None, *args, **kwargs):
596
606
597
607
self .dist_params = (self .b , self .mu )
598
608
599
- super (Laplace , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
609
+ super (Laplace , self ).__init__ (self .dist_params , ndim , size , dtype ,
610
+ * args , ** kwargs )
600
611
601
612
def random (self , point = None , size = None , repeat = None ):
602
613
mu , b = draw_values ([self .mu , self .b ], point = point )
@@ -639,21 +650,22 @@ class Lognormal(PositiveUnivariateContinuous):
639
650
tau : float
640
651
Scale parameter (tau > 0).
641
652
"""
642
- def __init__ (self , mu = 0 , tau = 1 , ndim = None , size = None , dtype = None , * args , ** kwargs ):
643
- self . mu = mu
644
- self .tau , self . sd = get_tau_sd ( tau = tau , sd = sd )
645
-
646
- self .mean = tt .exp (mu + 1. / (2 * self .tau ))
647
- self .median = tt .exp (mu )
648
- self .mode = tt .exp (mu - 1. / self .tau )
649
- self .variance = (tt .exp (1. / self .tau ) - 1 ) * tt .exp (2 * mu + 1. / self .tau )
653
+ def __init__ (self , mu = 0 , tau = 1 , ndim = None , size = None , dtype = None , * args ,
654
+ ** kwargs ):
655
+ self .mu = tt . as_tensor_variable ( mu )
656
+ self . tau = tt . as_tensor_variable ( tau )
657
+ self .mean = tt .exp (self . mu + 1. / (2. * self .tau ))
658
+ self .median = tt .exp (self . mu )
659
+ self .mode = tt .exp (self . mu - 1. / self .tau )
660
+ self .variance = (tt .exp (1. / self .tau ) - 1. ) * tt .exp (2 * self . mu + 1. / self .tau )
650
661
651
662
assert_negative_support (tau , 'tau' , 'Lognormal' )
652
663
assert_negative_support (sd , 'sd' , 'Lognormal' )
653
664
654
665
self .dist_params = (self .mu , self .tau )
655
666
656
- super (Lognormal , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
667
+ super (Lognormal , self ).__init__ (self .dist_params , ndim , size , dtype ,
668
+ * args , ** kwargs )
657
669
658
670
def _random (self , mu , tau , size = None ):
659
671
samples = np .random .normal (size = size )
@@ -702,9 +714,8 @@ class StudentT(UnivariateContinuous):
702
714
lam : float
703
715
Scale parameter (lam > 0).
704
716
"""
705
-
706
- def __init__ (self , nu , mu = 0 , lam = None , sd = None , ndim = None ,
707
- size = None , dtype = None , * args , ** kwargs ):
717
+ def __init__ (self , nu , mu = 0 , lam = None , sd = None , ndim = None , size = None ,
718
+ dtype = None , * args , ** kwargs ):
708
719
self .nu = nu = tt .as_tensor_variable (nu )
709
720
self .lam , self .sd = get_tau_sd (tau = lam , sd = sd )
710
721
self .mean = self .median = self .mode = self .mu = mu
@@ -767,19 +778,20 @@ class Pareto(PositiveUnivariateContinuous):
767
778
def __init__ (self , alpha , m , ndim = None , size = None , dtype = None , * args , ** kwargs ):
768
779
self .alpha = tt .as_tensor_variable (alpha )
769
780
self .m = tt .as_tensor_variable (m )
770
- self .mean = tt .switch (tt .gt (alpha , 1 ), alpha * m / (alpha - 1. ), np .inf )
771
- self .median = m * 2. ** (1. / alpha )
781
+ self .mean = tt .switch (tt .gt (self . alpha , 1 ), self . alpha * self . m / (self . alpha - 1. ), np .inf )
782
+ self .median = self . m * 2. ** (1. / self . alpha )
772
783
self .variance = tt .switch (
773
- tt .gt (alpha , 2 ),
774
- (alpha * m ** 2 ) / ((alpha - 2. ) * (alpha - 1. )** 2 ),
784
+ tt .gt (self . alpha , 2 ),
785
+ (self . alpha * self . m ** 2 ) / ((self . alpha - 2. ) * (self . alpha - 1. )** 2 ),
775
786
np .inf )
776
787
777
788
assert_negative_support (alpha , 'alpha' , 'Pareto' )
778
789
assert_negative_support (m , 'm' , 'Pareto' )
779
790
780
791
self .dist_params = (self .alpha , self .m )
781
792
782
- super (Pareto , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
793
+ super (Pareto , self ).__init__ (self .dist_params , ndim , size , dtype ,
794
+ * args , ** kwargs )
783
795
784
796
def _random (self , alpha , m , size = None ):
785
797
u = np .random .uniform (size = size )
@@ -832,7 +844,8 @@ def __init__(self, alpha, beta, ndim=None, size=None, dtype=None, *args, **kwarg
832
844
833
845
self .dist_params = (self .alpha , self .beta )
834
846
835
- super (Cauchy , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
847
+ super (Cauchy , self ).__init__ (self .dist_params , ndim , size , dtype ,
848
+ * args , ** kwargs )
836
849
837
850
assert_negative_support (beta , 'beta' , 'Cauchy' )
838
851
@@ -883,7 +896,8 @@ def __init__(self, beta, ndim=None, size=None, dtype=None, *args, **kwargs):
883
896
884
897
self .dist_params = (self .beta ,)
885
898
886
- super (HalfCauchy , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
899
+ super (HalfCauchy , self ).__init__ (self .dist_params , ndim , size , dtype ,
900
+ * args , ** kwargs )
887
901
888
902
assert_negative_support (beta , 'beta' , 'HalfCauchy' )
889
903
@@ -943,20 +957,22 @@ class Gamma(PositiveUnivariateContinuous):
943
957
Alternative scale parameter (sd > 0).
944
958
"""
945
959
946
- def __init__ (self , alpha = None , beta = None , mu = None , sd = None , ndim = None , size = None , dtype = None , * args , ** kwargs ):
960
+ def __init__ (self , alpha = None , beta = None , mu = None , sd = None , ndim = None ,
961
+ size = None , dtype = None , * args , ** kwargs ):
947
962
alpha , beta = self .get_alpha_beta (alpha , beta , mu , sd )
948
963
self .alpha = alpha
949
964
self .beta = beta
950
- self .mean = alpha / beta
951
- self .mode = tt .maximum ((alpha - 1 ) / beta , 0 )
952
- self .variance = alpha / beta ** 2
965
+ self .mean = self . alpha / self . beta
966
+ self .mode = tt .maximum ((self . alpha - 1 ) / self . beta , 0 )
967
+ self .variance = self . alpha / self . beta ** 2
953
968
954
969
assert_negative_support (alpha , 'alpha' , 'Gamma' )
955
970
assert_negative_support (beta , 'beta' , 'Gamma' )
956
971
957
972
self .dist_params = (self .alpha , self .beta )
958
973
959
- super (Gamma , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
974
+ super (Gamma , self ).__init__ (self .dist_params , ndim , size , dtype , * args ,
975
+ ** kwargs )
960
976
961
977
def get_alpha_beta (self , alpha = None , beta = None , mu = None , sd = None ):
962
978
if (alpha is not None ) and (beta is not None ):
@@ -1025,6 +1041,8 @@ def __init__(self, alpha, beta=1., ndim=None, size=None, dtype=None, *args, **kw
1025
1041
assert_negative_support (alpha , 'alpha' , 'InverseGamma' )
1026
1042
assert_negative_support (beta , 'beta' , 'InverseGamma' )
1027
1043
1044
+ self .dist_params = (self .alpha , self .beta )
1045
+
1028
1046
super (InverseGamma , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
1029
1047
1030
1048
def _calculate_mean (self ):
@@ -1035,9 +1053,6 @@ def _calculate_mean(self):
1035
1053
m [self .alpha <= 1 ] = np .inf
1036
1054
return m
1037
1055
1038
- self .dist_params = (self .alpha , self .beta )
1039
-
1040
-
1041
1056
def random (self , point = None , size = None , repeat = None ):
1042
1057
alpha , beta = draw_values ([self .alpha , self .beta ],
1043
1058
point = point )
@@ -1048,8 +1063,8 @@ def random(self, point=None, size=None, repeat=None):
1048
1063
def logp (self , value ):
1049
1064
alpha = self .alpha
1050
1065
beta = self .beta
1051
- return bound (logpow (beta , alpha ) - gammaln (alpha ) - beta / value
1052
- + logpow (value , - alpha - 1 ),
1066
+ return bound (logpow (beta , alpha ) - gammaln (alpha ) - beta / value +
1067
+ logpow (value , - alpha - 1 ),
1053
1068
value > 0 , alpha > 0 , beta > 0 )
1054
1069
1055
1070
@@ -1075,7 +1090,9 @@ class ChiSquared(Gamma):
1075
1090
1076
1091
def __init__ (self , nu , * args , ** kwargs ):
1077
1092
self .nu = tt .as_tensor_variable (nu )
1078
- super (ChiSquared , self ).__init__ (alpha = self .nu / 2. , beta = tt .as_tensor_variable (0.5 ), * args , ** kwargs )
1093
+ super (ChiSquared , self ).__init__ (alpha = self .nu / 2. ,
1094
+ beta = tt .as_tensor_variable (0.5 ),
1095
+ * args , ** kwargs )
1079
1096
1080
1097
1081
1098
class Weibull (PositiveUnivariateContinuous ):
@@ -1114,7 +1131,8 @@ def __init__(self, alpha, beta, ndim=None, size=None, dtype=None, *args, **kwarg
1114
1131
1115
1132
self .dist_params = (self .alpha , self .beta )
1116
1133
1117
- super (Weibull , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
1134
+ super (Weibull , self ).__init__ (self .dist_params , ndim , size , dtype ,
1135
+ * args , ** kwargs )
1118
1136
1119
1137
def random (self , point = None , size = None , repeat = None ):
1120
1138
alpha , beta = draw_values ([self .alpha , self .beta ],
@@ -1301,15 +1319,16 @@ def __init__(self, mu, sigma, nu, ndim=None, size=None, dtype=None, *args, **kwa
1301
1319
self .mu = tt .as_tensor_variable (mu )
1302
1320
self .sigma = tt .as_tensor_variable (sigma )
1303
1321
self .nu = tt .as_tensor_variable (nu )
1304
- self .mean = mu + nu
1305
- self .variance = ( sigma ** 2 ) + ( nu ** 2 )
1322
+ self .mean = self . mu + self . nu
1323
+ self .variance = self . sigma ** 2 + self . nu ** 2
1306
1324
1307
1325
assert_negative_support (sigma , 'sigma' , 'ExGaussian' )
1308
1326
assert_negative_support (nu , 'nu' , 'ExGaussian' )
1309
1327
1310
1328
self .dist_params = (self .mu , self .sigma , self .nu )
1311
1329
1312
- super (ExGaussian , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
1330
+ super (ExGaussian , self ).__init__ (self .dist_params , ndim , size , dtype ,
1331
+ * args , ** kwargs )
1313
1332
1314
1333
def random (self , point = None , size = None , repeat = None ):
1315
1334
mu , sigma , nu = draw_values ([self .mu , self .sigma , self .nu ],
@@ -1361,15 +1380,16 @@ class VonMises(UnivariateContinuous):
1361
1380
Concentration (\frac{1}{kappa} is analogous to \sigma^2).
1362
1381
"""
1363
1382
1364
- def __init__ (self , mu = 0.0 , kappa = None , transform = 'circular' , ndim = None , size = None , dtype = None , * args , ** kwargs ):
1365
- self . mean = self . median = self . mode = self . mu = tt . as_tensor_variable (
1366
- mu )
1383
+ def __init__ (self , mu = 0.0 , kappa = None , transform = 'circular' , ndim = None ,
1384
+ size = None , dtype = None , * args , ** kwargs ):
1385
+ self . mean = self . median = self . mode = self . mu = tt . as_tensor_variable ( mu )
1367
1386
self .kappa = tt .as_tensor_variable (kappa )
1368
- self .variance = 1. - i1 (kappa ) / i0 (kappa )
1387
+ self .variance = 1. - i1 (self . kappa ) / i0 (self . kappa )
1369
1388
1370
1389
self .dist_params = (self .mu , self .kappa )
1371
1390
1372
- super (VonMises , self ).__init__ (self .dist_params , ndim , size , dtype , * args , ** kwargs )
1391
+ super (VonMises , self ).__init__ (self .dist_params , ndim , size , dtype ,
1392
+ * args , ** kwargs )
1373
1393
1374
1394
if transform == 'circular' :
1375
1395
self .transform = transforms .Circular ()
0 commit comments