Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sample from normal distribution?

Tags:

pytorch

If I have n sized mean vector, n sized variance vector, then how do I do this?

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

What do I do to get z?

like image 346
apostofes Avatar asked May 19 '26 12:05

apostofes


1 Answers

If you want to sample from a normal distribution with mean mu and std sigma then you can simply

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

If you sample many such z their mean and std will converge to sigma and mu:

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])

As you can see when you sample 1,000,000 elements from the distribution the sample mean and std are close to the original mu and sigma you started with.

like image 144
Shai Avatar answered May 24 '26 13:05

Shai



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!