19
19
from aesara .tensor .random .basic import (
20
20
RandomVariable ,
21
21
bernoulli ,
22
+ betabinom ,
22
23
binomial ,
23
24
categorical ,
24
25
geometric ,
41
42
normal_lcdf ,
42
43
)
43
44
from pymc3 .distributions .distribution import Discrete
44
- from pymc3 .math import log1mexp , logaddexp , logsumexp , sigmoid , tround
45
+ from pymc3 .math import log1mexp , logaddexp , logsumexp , sigmoid
45
46
46
47
__all__ = [
47
48
"Binomial" ,
@@ -227,58 +228,16 @@ def BetaBinom(a, b, n, x):
227
228
beta > 0.
228
229
"""
229
230
230
- def __init__ (self , alpha , beta , n , * args , ** kwargs ):
231
- super ().__init__ (* args , ** kwargs )
232
- self .alpha = alpha = at .as_tensor_variable (floatX (alpha ))
233
- self .beta = beta = at .as_tensor_variable (floatX (beta ))
234
- self .n = n = at .as_tensor_variable (intX (n ))
235
- self .mode = at .cast (tround (alpha / (alpha + beta )), "int8" )
236
-
237
- def _random (self , alpha , beta , n , size = None ):
238
- size = size or ()
239
- p = stats .beta .rvs (a = alpha , b = beta , size = size ).flatten ()
240
- # Sometimes scipy.beta returns nan. Ugh.
241
- while np .any (np .isnan (p )):
242
- i = np .isnan (p )
243
- p [i ] = stats .beta .rvs (a = alpha , b = beta , size = np .sum (i ))
244
- # Sigh...
245
- _n , _p , _size = np .atleast_1d (n ).flatten (), p .flatten (), p .shape [0 ]
246
-
247
- quotient , remainder = divmod (_p .shape [0 ], _n .shape [0 ])
248
- if remainder != 0 :
249
- raise TypeError (
250
- "n has a bad size! Was cast to {}, must evenly divide {}" .format (
251
- _n .shape [0 ], _p .shape [0 ]
252
- )
253
- )
254
- if quotient != 1 :
255
- _n = np .tile (_n , quotient )
256
- samples = np .reshape (stats .binom .rvs (n = _n , p = _p , size = _size ), size )
257
- return samples
258
-
259
- def random (self , point = None , size = None ):
260
- r"""
261
- Draw random values from BetaBinomial distribution.
231
+ rv_op = betabinom
262
232
263
- Parameters
264
- ----------
265
- point: dict, optional
266
- Dict of variable values on which random values are to be
267
- conditioned (uses default point if not specified).
268
- size: int, optional
269
- Desired size of random sample (returns one sample if not
270
- specified).
271
-
272
- Returns
273
- -------
274
- array
275
- """
276
- # alpha, beta, n = draw_values([self.alpha, self.beta, self.n], point=point, size=size)
277
- # return generate_samples(
278
- # self._random, alpha=alpha, beta=beta, n=n, dist_shape=self.shape, size=size
279
- # )
233
+ @classmethod
234
+ def dist (cls , alpha , beta , n , * args , ** kwargs ):
235
+ alpha = at .as_tensor_variable (floatX (alpha ))
236
+ beta = at .as_tensor_variable (floatX (beta ))
237
+ n = at .as_tensor_variable (intX (n ))
238
+ return super ().dist ([n , alpha , beta ], ** kwargs )
280
239
281
- def logp (self , value ):
240
+ def logp (value , n , alpha , beta ):
282
241
r"""
283
242
Calculate log-probability of BetaBinomial distribution at specified value.
284
243
@@ -292,9 +251,6 @@ def logp(self, value):
292
251
-------
293
252
TensorVariable
294
253
"""
295
- alpha = self .alpha
296
- beta = self .beta
297
- n = self .n
298
254
return bound (
299
255
binomln (n , value ) + betaln (value + alpha , n - value + beta ) - betaln (alpha , beta ),
300
256
value >= 0 ,
@@ -303,7 +259,7 @@ def logp(self, value):
303
259
beta > 0 ,
304
260
)
305
261
306
- def logcdf (self , value ):
262
+ def logcdf (value , n , alpha , beta ):
307
263
"""
308
264
Compute the log of the cumulative distribution function for BetaBinomial distribution
309
265
at the specified value.
@@ -323,15 +279,15 @@ def logcdf(self, value):
323
279
f"BetaBinomial.logcdf expects a scalar value but received a { np .ndim (value )} -dimensional object."
324
280
)
325
281
326
- alpha = self .alpha
327
- beta = self .beta
328
- n = self .n
329
282
safe_lower = at .switch (at .lt (value , 0 ), value , 0 )
330
283
331
284
return bound (
332
285
at .switch (
333
286
at .lt (value , n ),
334
- logsumexp (self .logp (at .arange (safe_lower , value + 1 )), keepdims = False ),
287
+ logsumexp (
288
+ BetaBinomial .logp (at .arange (safe_lower , value + 1 ), n , alpha , beta ),
289
+ keepdims = False ,
290
+ ),
335
291
0 ,
336
292
),
337
293
0 <= value ,
0 commit comments