torch.distributions.cauchy 的源代码
# mypy: 允许未类型化定义
导入
数学
导入
火炬
来自
火炬
导入
无穷,
纳尼,
张量
来自 torch.distributions
导入
约束
来自 torch.distributions.distribution
导入
分布
来自 torch.distributions.utils
导入
广播全部
来自
torch 的类型
导入
_数字,
_大小
全部 = [
高斯]
[文档]
类
柯西(
分发):
r""
来自高斯(洛伦兹)分布的样本。比率的分布为
独立同分布的随机变量,其均值为 `0` 的服从
柯西分布。
示例::
>>> # xdoctest: +IGNORE_WANT("非确定性")
>>> m = Cauchy(torch.tensor([0.0]), torch.tensor([1.0]))
>>> m.sample() # 从均值为 0 和尺度为 1 的柯西分布中抽样
tensor([ 2.3214])
参数:
loc (浮点数或张量):分布的均值或中位数。
scale (浮点数或张量):半最大值半宽度。
"沉浸式翻译"
约束参数 = {"loc":
约束.
真实,
"缩放":
约束.
正面}
支持 =
约束.
真实
has_rsample = 真实
def __init__(self, 位置,
比例, validate_args=
无):
self.位置, self.
缩放 =
广播全部(
位置,
比例)
如果 isinstance(
位置,
_数字)
和 isinstance(
比例,
_数字):
batch_shape = torch.尺寸()
否则:
batch_shape = self.位置.
尺寸()
超级().__init__(
批量形状, validate_args=validate_args)
[文档] def expand(self, batch_shape, _instance=None):
new = self._get_checked_instance(Cauchy, _instance)
batch_shape = torch.Size(batch_shape)
new.loc = self.loc.expand(batch_shape)
new.scale = self.scale.expand(batch_shape)
super(Cauchy, new).__init__(batch_shape, validate_args=False)
new._validate_args = self._validate_args
return new
@property
def 均值(self) ->
张量:
返回 torch.full(
self._extended_shape(), 纳尼,
数据类型=self.
位置.
数据类型,
设备=self.
位置.
设备
)
@property
def 模式(self) ->
张量:
返回 self.
定位
@property
def 方差(self) ->
张量:
返回 torch.full(
self._扩展形状(),
无穷,
数据类型=self.
位置.
数据类型,
设备=self.
位置.
设备
)
[文档] def rsample(self, sample_shape: _size = torch.Size()) -> Tensor:
形状 = self._extended_shape(sample_shape)
eps = self.loc.new(shape).cauchy_()
return self.loc + eps * self.scale
[文档] def log_prob(self, value):
if self._validate_args:
self._validate_sample(value)
return (
-math.log(math.pi)
- self.scale.log()
(((值 - self.loc) / self.scale) ** 2).log1p()
)
[文档] def cdf(self, 值):
if self._validate_args:
self._validate_sample(value)
return torch.atan((value - self.loc) / self.scale) / math.pi + 0.5
[文档] def icdf(self, value):
return torch.tan(math.pi * (value - 0.5)) * self.scale + self.loc
[文档] def 熵(self):
return math.log(4 * math.pi) + self.scale.log()