如何在 Python 中对多元对数正态分布进行采样?
How can I sample a multivariate log-normal distribution in Python?
如何使用 Python 从多元对数正态分布中抽取数据?例如,对于多元正态分布,有两个选项。假设我们有一个 3 x 3 协方差矩阵和一个 3 维均值向量 mu.
# Method 1
sample = np.random.multivariate_normal(mu, covariance)
# Method 2
L = np.linalg.cholesky(covariance)
sample = L.dot(np.random.randn(3)) + mu
我找到了 numpy 的 numpy.random.lognormal, but that only seems to work for univariate samples. I also noticed scipy's scipy.stats.lognorm。这似乎确实具有多变量样本的潜力。但是,我不知道该怎么做。
多变量对数正态分布随机变量 Rv
应该有这个 属性: log(Rv)
应该服从正态分布。因此,问题实际上只是生成一个多元正态分布的随机变量 np.exp
它。
In [1]: import numpy.random as nr
In [2]: cov = np.array([[1.0, 0.2, 0.3,],
[0.2, 1.0, 0.3,],
[0.3, 0.3, 1.0]])
In [3]: mu = np.log([0.3, 0.4, 0.5])
In [4]: mvn = nr.multivariate_normal(mu, cov, size=5)
In [5]: mvn # This is multivariate normal
Out[5]:
array([[-1.36808854, -1.32562291, -1.9706876 ],
[-2.13119289, 1.28146425, 0.66000019],
[-2.82590272, -1.22500654, -0.32635701],
[-0.4967589 , -0.34469589, -2.04084115],
[-0.85590235, -1.27133544, -0.70959595]])
In [6]: mvln = np.exp(mvn)
In [7]: mvln # This is multivariate log-normal
Out[7]:
array([[ 0.25459314, 0.26563744, 0.139361 ],
[ 0.11869562, 3.60190996, 1.9347927 ],
[ 0.05925514, 0.29375578, 0.72154754],
[ 0.60849968, 0.70843576, 0.12991938],
[ 0.42489961, 0.28045684, 0.49184289]])
如何使用 Python 从多元对数正态分布中抽取数据?例如,对于多元正态分布,有两个选项。假设我们有一个 3 x 3 协方差矩阵和一个 3 维均值向量 mu.
# Method 1
sample = np.random.multivariate_normal(mu, covariance)
# Method 2
L = np.linalg.cholesky(covariance)
sample = L.dot(np.random.randn(3)) + mu
我找到了 numpy 的 numpy.random.lognormal, but that only seems to work for univariate samples. I also noticed scipy's scipy.stats.lognorm。这似乎确实具有多变量样本的潜力。但是,我不知道该怎么做。
多变量对数正态分布随机变量 Rv
应该有这个 属性: log(Rv)
应该服从正态分布。因此,问题实际上只是生成一个多元正态分布的随机变量 np.exp
它。
In [1]: import numpy.random as nr
In [2]: cov = np.array([[1.0, 0.2, 0.3,],
[0.2, 1.0, 0.3,],
[0.3, 0.3, 1.0]])
In [3]: mu = np.log([0.3, 0.4, 0.5])
In [4]: mvn = nr.multivariate_normal(mu, cov, size=5)
In [5]: mvn # This is multivariate normal
Out[5]:
array([[-1.36808854, -1.32562291, -1.9706876 ],
[-2.13119289, 1.28146425, 0.66000019],
[-2.82590272, -1.22500654, -0.32635701],
[-0.4967589 , -0.34469589, -2.04084115],
[-0.85590235, -1.27133544, -0.70959595]])
In [6]: mvln = np.exp(mvn)
In [7]: mvln # This is multivariate log-normal
Out[7]:
array([[ 0.25459314, 0.26563744, 0.139361 ],
[ 0.11869562, 3.60190996, 1.9347927 ],
[ 0.05925514, 0.29375578, 0.72154754],
[ 0.60849968, 0.70843576, 0.12991938],
[ 0.42489961, 0.28045684, 0.49184289]])