36
36
normal ,
37
37
pareto ,
38
38
uniform ,
39
+ weibull ,
39
40
)
40
41
from aesara .tensor .random .op import RandomVariable
41
42
from aesara .tensor .var import TensorVariable
@@ -2690,46 +2691,23 @@ class Weibull(PositiveContinuous):
2690
2691
beta: float
2691
2692
Scale parameter (beta > 0).
2692
2693
"""
2694
+ rv_op = weibull
2693
2695
2694
- def __init__ (self , alpha , beta , * args , ** kwargs ):
2695
- super ().__init__ (* args , ** kwargs )
2696
- self .alpha = alpha = at .as_tensor_variable (floatX (alpha ))
2697
- self .beta = beta = at .as_tensor_variable (floatX (beta ))
2698
- self .mean = beta * at .exp (gammaln (1 + 1.0 / alpha ))
2699
- self .median = beta * at .exp (gammaln (at .log (2 ))) ** (1.0 / alpha )
2700
- self .variance = beta ** 2 * at .exp (gammaln (1 + 2.0 / alpha )) - self .mean ** 2
2701
- self .mode = at .switch (
2702
- alpha >= 1 , beta * ((alpha - 1 ) / alpha ) ** (1 / alpha ), 0
2703
- ) # Reference: https://en.wikipedia.org/wiki/Weibull_distribution
2696
+ @classmethod
2697
+ def dist (cls , alpha , beta , * args , ** kwargs ):
2698
+ alpha = at .as_tensor_variable (floatX (alpha ))
2699
+ beta = at .as_tensor_variable (floatX (beta ))
2704
2700
2705
2701
assert_negative_support (alpha , "alpha" , "Weibull" )
2706
2702
assert_negative_support (beta , "beta" , "Weibull" )
2707
2703
2708
- def random (self , point = None , size = None ):
2709
- """
2710
- Draw random values from Weibull distribution.
2711
-
2712
- Parameters
2713
- ----------
2714
- point: dict, optional
2715
- Dict of variable values on which random values are to be
2716
- conditioned (uses default point if not specified).
2717
- size: int, optional
2718
- Desired size of random sample (returns one sample if not
2719
- specified).
2720
-
2721
- Returns
2722
- -------
2723
- array
2724
- """
2725
- # alpha, beta = draw_values([self.alpha, self.beta], point=point, size=size)
2726
- #
2727
- # def _random(a, b, size=None):
2728
- # return b * (-np.log(np.random.uniform(size=size))) ** (1 / a)
2729
- #
2730
- # return generate_samples(_random, alpha, beta, dist_shape=self.shape, size=size)
2704
+ return super ().dist ([alpha , beta ], ** kwargs )
2731
2705
2732
- def logp (self , value ):
2706
+ def logp (
2707
+ value : Union [float , np .ndarray , TensorVariable ],
2708
+ alpha : Union [float , np .ndarray , TensorVariable ],
2709
+ beta : Union [float , np .ndarray , TensorVariable ],
2710
+ ) -> RandomVariable :
2733
2711
"""
2734
2712
Calculate log-probability of Weibull distribution at specified value.
2735
2713
@@ -2743,8 +2721,7 @@ def logp(self, value):
2743
2721
-------
2744
2722
TensorVariable
2745
2723
"""
2746
- alpha = self .alpha
2747
- beta = self .beta
2724
+
2748
2725
return bound (
2749
2726
at .log (alpha )
2750
2727
- at .log (beta )
@@ -2755,7 +2732,11 @@ def logp(self, value):
2755
2732
beta > 0 ,
2756
2733
)
2757
2734
2758
- def logcdf (self , value ):
2735
+ def logcdf (
2736
+ value : Union [float , np .ndarray , TensorVariable ],
2737
+ alpha : Union [float , np .ndarray , TensorVariable ],
2738
+ beta : Union [float , np .ndarray , TensorVariable ],
2739
+ ):
2759
2740
r"""
2760
2741
Compute the log of the cumulative distribution function for Weibull distribution
2761
2742
at the specified value.
@@ -2770,8 +2751,7 @@ def logcdf(self, value):
2770
2751
-------
2771
2752
TensorVariable
2772
2753
"""
2773
- alpha = self .alpha
2774
- beta = self .beta
2754
+
2775
2755
a = (value / beta ) ** alpha
2776
2756
return bound (
2777
2757
log1mexp (a ),
0 commit comments