importtorchfromtorchimportnanfromtorch.distributionsimportconstraintsfromtorch.distributions.transformed_distributionimportTransformedDistributionfromtorch.distributions.transformsimportAffineTransform,PowerTransformfromtorch.distributions.uniformimportUniformfromtorch.distributions.utilsimportbroadcast_all,euler_constant__all__=["Kumaraswamy"]def_moments(a,b,n):""" Computes nth moment of Kumaraswamy using using torch.lgamma """arg1=1+n/alog_value=torch.lgamma(arg1)+torch.lgamma(b)-torch.lgamma(arg1+b)returnb*torch.exp(log_value)
[docs]classKumaraswamy(TransformedDistribution):r""" Samples from a Kumaraswamy distribution. Example:: >>> # xdoctest: +IGNORE_WANT("non-deterinistic") >>> m = Kumaraswamy(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Kumaraswamy distribution with concentration alpha=1 and beta=1 tensor([ 0.1729]) Args: concentration1 (float or Tensor): 1st concentration parameter of the distribution (often referred to as alpha) concentration0 (float or Tensor): 2nd concentration parameter of the distribution (often referred to as beta) """arg_constraints={"concentration1":constraints.positive,"concentration0":constraints.positive,}support=constraints.unit_intervalhas_rsample=Truedef__init__(self,concentration1,concentration0,validate_args=None):self.concentration1,self.concentration0=broadcast_all(concentration1,concentration0)finfo=torch.finfo(self.concentration0.dtype)base_dist=Uniform(torch.full_like(self.concentration0,0),torch.full_like(self.concentration0,1),validate_args=validate_args,)transforms=[PowerTransform(exponent=self.concentration0.reciprocal()),AffineTransform(loc=1.0,scale=-1.0),PowerTransform(exponent=self.concentration1.reciprocal()),]super().__init__(base_dist,transforms,validate_args=validate_args)
@propertydefmean(self):return_moments(self.concentration1,self.concentration0,1)@propertydefmode(self):# Evaluate in log-space for numerical stability.log_mode=(self.concentration0.reciprocal()*(-self.concentration0).log1p()-(-self.concentration0*self.concentration1).log1p())log_mode[(self.concentration0<1)|(self.concentration1<1)]=nanreturnlog_mode.exp()@propertydefvariance(self):return_moments(self.concentration1,self.concentration0,2)-torch.pow(self.mean,2)
To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including about available controls: Cookies Policy.