如何在pytorch中创建正态分布?

25

我想创建一个具有给定均值和标准差的随机正态分布。


请查看此链接以获取所有分布(这样您就可以执行类似于r2 = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples,Din))的操作):https://pytorch.org/docs/stable/distributions.html#torch.distributions.uniform.Uniform - Charlie Parker
6个回答

25
你可以轻松使用torch.Tensor.normal_()方法。
让我们创建一个维度为1 × 5的矩阵Z(一个1d张量),其中填充了从正态分布中参数化为mean = 4std = 0.5的随机元素样本。
torch.empty(5).normal_(mean=4,std=0.5)

结果:

tensor([4.1450, 4.0104, 4.0228, 4.4689, 3.7810])

1
为什么我计算你发布的向量的标准差和平均值时,得到的是:(tensor(4.0856), tensor(0.2514))?难道标准差不应该接近于0.5吗? - muammar
@muammar 你确定你正在计算标准差而不是方差吗? - kmf
@muammar 0.2514并不罕见,因为只有5个值。标准误差(0.5 / sqrt(5))为0.22,因此68%的时间内您将得到0.276至0.723之间的值。如果您将5更改为5,000,则SE降至0.007,您可以期望一个更接近0.5的值。 - David Gilbertson

14

对于标准正态分布(即mean = 0variance = 1),您可以使用torch.randn()

对于自定义均值mean和标准差std的情况,您可以使用torch.distributions.Normal()


初始化签名:
tdist.Normal(loc, scale, validate_args=None)

文档字符串:
创建一个由locscale参数化的正态分布。

参数:
loc(float或Tensor):分布的均值(通常称为mu)
scale(float或Tensor):分布的标准差(通常称为sigma)


下面是一个例子:

In [32]: import torch.distributions as tdist

In [33]: n = tdist.Normal(torch.tensor([4.0]), torch.tensor([0.5]))

In [34]: n.sample((2,))
Out[34]: 
tensor([[ 3.6577],
        [ 4.7001]])

11
一个简单的选项是使用基础模块中的randn函数。它从标准高斯分布中创建一个随机样本。要改变均值和标准差,只需使用加法和乘法。下面我从您请求的分布中创建大小为5的样本。
import torch
torch.randn(5) * 0.5 + 4 # tensor([4.1029, 4.5351, 2.8797, 3.1883, 4.3868])

你好,我觉得以下内容有些困惑:根据PyTorch文档:torch.rand返回一个张量,其中填充了从[0,1]区间上服从均匀分布的随机数。 https://pytorch.org/docs/stable/torch.html#torch.rand。我看到一些开发者使用与您相同的代码来创建高斯分布。如果您能进一步详细解释一下,我将不胜感激。谢谢 - Zvezda
1
@Zvezda 我不确定你的问题是什么。rand函数确实从均匀分布中采样,但randn函数从高斯分布中采样https://pytorch.org/docs/stable/torch.html#torch.randn。乘以标准差并加上平均值是标准统计实践。 - gui11aume
2
你好,@gui11aume,非常感谢。我意识到我没有注意到这两个是不同的函数 - rand和randN。 - Zvezda

2
您可以按照文档中此处所述的方式创建分布。 对于您的情况,下面是正确的调用方式,包括从创建的分布中进行采样:
from torch.distributions import normal

m = normal.Normal(4.0, 0.5)
s = m.sample()

如果您想获得特定大小/形状的样本,您可以将其传递给sample(),例如。请注意保留HTML标签。
s = m.sample([5, 5])

对于一个5x5张量的情况,需要进行以下操作。

如果您想要采样特定大小怎么办? - Charlie Parker

0

0

这取决于您想要生成什么。

如果要生成标准正态分布,请使用 -

torch.randn()

对于所有分布(例如正态分布,泊松分布或均匀分布等),使用 torch.distributions.Normal()torch.distributions.Uniform()。这些方法的详细信息可以在此处查看 - https://pytorch.org/docs/stable/distributions.html#normal

一旦定义了这些方法,就可以使用 .sample 方法生成实例数量。如果分布参数进行了批处理,则还允许您生成样本形状的样本或样本形状的批次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接