torch.distributions.fishersnedecor 的源代码
# mypy: 允许未类型化定义
导入
火炬
来自
火炬
导入
纳尼,
张量
来自 torch.distributions
导入
约束
来自 torch.distributions.distribution
导入
分布
来自 torch.distributions.gamma
导入
伽马分布
来自 torch.distributions.utils
导入
广播全部
来自
torch 的类型
导入
数,
_大小
全部 = ["FisherSnedecor"]
[文档]
类
费舍尔-斯涅德科(
分发):
r"""
创建一个由 :attr:`df1` 和 :attr:`df2` 参数化的 Fisher-Snedecor 分布。
示例::
>>> # xdoctest: +IGNORE_WANT("非确定性")
>>> m = FisherSnedecor(torch.tensor([1.0]), torch.tensor([2.0]))
>>> m.sample() # df1=1 和 df2=2 的 Fisher-Snedecor 分布
tensor([0.2453])
参数:
df1(浮点数或 Tensor):自由度参数 1
df2(浮点数或 Tensor):自由度参数 2
"""
约束参数 = {"df1":
约束.
正的,
df2:
约束.
正的}
支持 =
约束.
正向
has_rsample = 真实
定义 __init__(
自身, df1, df2,
验证参数=
无):
自身.df1,
自身.df2 =
广播全部(df1, df2)
自身._gamma1 =
伽马(
自身.df1 * 0.5,
自身.df1)
自身.
γάμμα2 =
伽马(
自身.df2 * 0.5,
自身.df2)
if isinstance(df1, 数)
和 isinstance(df2,
数):
批量形状 = torch.
尺寸()
否则:
批量形状 =
自身.df1.
大小()
超级().__init__(
批量形状,
验证参数=
验证参数)
[文档] def expand(self, batch_shape, _instance=None):
new = self._get_checked_instance(FisherSnedecor, _instance)
batch_shape = torch.Size(batch_shape)
new.df1 = self.df1.expand(batch_shape)
new.df2 = self.df2.expand(batch_shape)
new._gamma1 = self._gamma1.expand(batch_shape)
new._gamma2 = self._gamma2.expand(batch_shape)
super(FisherSnedecor, new).__init__(batch_shape, validate_args=False)
new._validate_args = self._validate_args
返回 new
@property
定义
均值(
自身) ->
张量:
df2 = 自身.df2.
克隆(
内存格式=torch.
连续格式)
df2[df2 <= 2] = 纳尼
返回 df2 / (df2 - 2)
@property
定义
模式(
自身) ->
张量:
模式 = (self.df1 - 2) / self.df1 * self.df2 / (self.df2 + 2)
模式[self.df1 <= 2] =
纳尼
返回
模式
@property
def 方差(
自身) ->
张量:
df2 = 自身.df2.
克隆(
内存格式=torch.
连续格式)
df2[df2 <= 4] = 纳尼
返回 (
2
* df2.pow(2)
* (自身.df1 + df2 - 2)
/ (自身.df1 * (df2 - 2).pow(2) * (df2 - 4))
)
[文档] def rsample(self, sample_shape: _size = torch.Size(())) -> Tensor:
shape = self._extended_shape(sample_shape)
# X1 ~ Gamma(df1 / 2, 1 / df1), X2 ~ Gamma(df2 / 2, 1 / df2)
# Y = df2 * df1 * X1 / (df1 * df2 * X2) = X1 / X2 ~ F(df1, df2)
X1 = self._gamma1.rsample(sample_shape).view(shape)
X2 = self._gamma2.rsample(sample_shape).view(shape)
tiny = torch.finfo(X2.dtype).tiny
X2.clamp_(min=tiny)
Y = X1 / X2
Y.clamp_(min=tiny)
return Y
[文档] def log_prob(self, value):
if self._validate_args:
self._validate_sample(value)
ct1 = self.df1 * 0.5
ct2 = self.df2 * 0.5
ct3 = self.df1 / self.df2
t1 = (ct1 + ct2).lgamma() - ct1.lgamma() - ct2.lgamma()
t2 = ct1 * ct3.log() + (ct1 - 1) * torch.log(value)
t3 = (ct1 + ct2) * torch.log1p(ct3 * value)
return t1 + t2 - t3