如何从正态分布中采样?

时间:2019-11-26 05:58:43

标签: pytorch

如果我有n个均值矢量,n个方差矢量,那我该怎么办?

z ∼ N (μ, σ)
import torch
x = torch.randn(3, 3)
mu = x.mean()
sigma = x.var()

我该怎么做才能得到z?

1 个答案:

答案 0 :(得分:1)

如果您想从均值mu std sigma的正态分布中抽样,则可以简单地

z = torch.randn_like(mu) * sigma + mu

如果您对许多这样的z进行采样,它们的均值和std将收敛到sigmamu

mu = torch.arange(10.)

Out[]: tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

sigma = 5. - 0.5 * torch.arange(10.)

Out[]: tensor([5.0000, 4.5000, 4.0000, 3.5000, 3.0000, 2.5000, 2.0000, 1.5000, 1.0000, 0.5000])

z = torch.randn(10, 1000000) * sigma[:, None] + mu[:, None]

z.mean(dim=1)
Out[]:
tensor([-5.4823e-03,  1.0011e+00,  1.9982e+00,  2.9985e+00,  4.0017e+00,
         4.9972e+00,  6.0010e+00,  7.0004e+00,  7.9996e+00,  9.0006e+00])

z.std(dim=1)
Out[]:
tensor([4.9930, 4.4945, 4.0021, 3.5013, 3.0005, 2.4986, 1.9997, 1.4998, 0.9990,
        0.5001])

如您所见,当您从分布中对1,000,000个元素进行采样时,样本均值和标准差都接近您最初使用的原始musigma