|
22 | 22 | 'StudentT', 'Cauchy', 'HalfCauchy', 'Gamma', 'Weibull',
|
23 | 23 | 'HalfStudentT', 'StudentTpos', 'Lognormal', 'ChiSquared',
|
24 | 24 | 'HalfNormal', 'Wald', 'Pareto', 'InverseGamma', 'ExGaussian',
|
25 |
| - 'VonMises', 'SkewNormal'] |
| 25 | + 'VonMises', 'SkewNormal','Rice'] |
26 | 26 |
|
27 | 27 |
|
28 | 28 | class PositiveContinuous(Continuous):
|
@@ -1347,3 +1347,50 @@ def logp(self, value):
|
1347 | 1347 | tt.switch(tt.eq(value, c), tt.log(2 / (upper - lower)),
|
1348 | 1348 | tt.switch(alltrue_elemwise([c < value, value <= upper]),
|
1349 | 1349 | tt.log(2 * (upper - value) / ((upper - lower) * (upper - c))),np.inf)))
|
| 1350 | + |
| 1351 | +class Rice(Continuous): |
| 1352 | + R""" |
| 1353 | + Rice distribution. |
| 1354 | +
|
| 1355 | + .. math:: |
| 1356 | +
|
| 1357 | + f(x\mid \nu ,\sigma )= |
| 1358 | + {\frac {x}{\sigma ^{2}}}\exp |
| 1359 | + \left({\frac {-(x^{2}+\nu ^{2})}{2\sigma ^{2}}}\right)I_{0}\left({\frac {x\nu }{\sigma ^{2}}}\right), |
| 1360 | +
|
| 1361 | + ======== ============================================================== |
| 1362 | + Support :math:`x \in (0, +\infinity)` |
| 1363 | + Mean :math:`\sigma {\sqrt {\pi /2}}\,\,L_{{1/2}}(-\nu ^{2}/2\sigma ^{2})` |
| 1364 | + Variance :math:`2\sigma ^{2}+\nu ^{2}-{\frac {\pi \sigma ^{2}}{2}}L_{{1/2}}^{2} |
| 1365 | + \left({\frac {-\nu ^{2}}{2\sigma ^{2}}}\right)` |
| 1366 | + ======== ============================================================== |
| 1367 | +
|
| 1368 | +
|
| 1369 | + Parameters |
| 1370 | + ---------- |
| 1371 | + nu : float |
| 1372 | + shape parameter. |
| 1373 | + sd : float |
| 1374 | + standard deviation. |
| 1375 | +
|
| 1376 | + """ |
| 1377 | + def __init__(self, nu=None, sd=None, *args, **kwargs): |
| 1378 | + super(Rice, self).__init__(*args, **kwargs) |
| 1379 | + self.nu = tt.as_tensor_variable(nu) |
| 1380 | + self.sd = tt.as_tensor_variable(sd) |
| 1381 | + self.mean = sd * np.sqrt(np.pi / 2) * tt.exp((-nu**2 / (2 * sd**2)) / 2) * ((1 - (-nu**2 / (2 * sd**2))) |
| 1382 | + * i0(-(-nu**2 / (2 * sd**2)) / 2) - (-nu**2 / (2 * sd**2)) * i1(-(-nu**2 / (2 * sd**2)) / 2)) |
| 1383 | + self.variance = 2 * sd**2 + nu**2 - (np.pi * sd**2 / 2) * (tt.exp((-nu**2 / (2 * sd**2)) / 2) * ((1 - (-nu**2 / ( |
| 1384 | + 2 * sd**2))) * i0(-(-nu**2 / (2 * sd**2)) / 2) - (-nu**2 / (2 * sd**2)) * i1(-(-nu**2 / (2 * sd**2)) / 2)))**2 |
| 1385 | + |
| 1386 | + def random(self, point=None, size=None, repeat=None): |
| 1387 | + nu, sd = draw_values([self.nu, self.sd], |
| 1388 | + point=point) |
| 1389 | + return generate_samples(stats.rice.rvs, b=nu, scale=sd, loc=0, |
| 1390 | + dist_shape=self.shape, size=size) |
| 1391 | + |
| 1392 | + def logp(self, value): |
| 1393 | + nu = self.nu |
| 1394 | + sd = self.sd |
| 1395 | + return bound(tt.log(value / (sd**2)*tt.exp(-(value**2 + nu**2) / (2 * sd**2))*i0(value * nu / (sd**2))), |
| 1396 | + nu>0) |
0 commit comments