使用 Python numpy.random.randn 绘制多元高斯分布样本
Draw multivariate Gaussian distribution samples using Python numpy.random.randn
我正在研究高斯混合模型并发现了这段代码,它从 2 个双变量高斯分布中抽取了大量样本。我不明白的是代码中使用的技术:
import numpy as np
# Number of samples per component
n_samples = 500
# Generate random sample, two components
np.random.seed(0)
C = np.array([[0., -0.1], [1.7, .4]])
X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
.7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]
根据this Wikipedia link,我们可以通过Cholesky分解协方差矩阵生成多元高斯样本,然后将其与标准正态分布分量组成的向量相乘
我的问题是代码中的C变量不是下三角矩阵,那么它在多元高斯随机生成中有什么意义呢?
X
是两个二元正态分布的混合。一半的样本是用 np.dot(np.random.randn(n_samples, 2), C)
计算的,其中 C = np.array([[0., -0.1], [1.7, .4]])
。该分布等效于协方差为 C.T.dot(C)
的分布。也就是说,您可以使用 np.random.multivariate_normal([0, 0], C.T.dot(C), n_samples)
.
从同一分布生成样本
看到我前段时间写的这些笔记:"Correlated Random Samples"。 (在这些笔记中,3x3 矩阵 C
在右侧乘以形状为 (3, num_samples)
的样本。换句话说,这些笔记使用此处使用的公式的转置,因此协方差矩阵为C.dot(C.T)
.) C
不必是下三角。但通常情况下,您会得到一个协方差矩阵,并且您想找到 C
。如果您使用 Cholesky 分解来查找 C
,那么通过构造它将是下三角。
此 ipython 会话演示了两种方法从同一分布生成样本:
In [60]: C = np.array([[0., -0.1], [1.7, .4]])
In [61]: X1 = np.dot(np.random.randn(n_samples, 2), C)
In [62]: X2 = np.random.multivariate_normal([0, 0], C.T.dot(C), n_samples)
In [63]: plot(X1[:,0], X1[:,1], 'g*', alpha=0.2)
Out[63]: [<matplotlib.lines.Line2D at 0x113c17550>]
In [64]: plot(X2[:,0], X2[:,1], 'ko', alpha=0.2, ms=4)
Out[64]: [<matplotlib.lines.Line2D at 0x113c3ba58>]
我正在研究高斯混合模型并发现了这段代码,它从 2 个双变量高斯分布中抽取了大量样本。我不明白的是代码中使用的技术:
import numpy as np
# Number of samples per component
n_samples = 500
# Generate random sample, two components
np.random.seed(0)
C = np.array([[0., -0.1], [1.7, .4]])
X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
.7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]
根据this Wikipedia link,我们可以通过Cholesky分解协方差矩阵生成多元高斯样本,然后将其与标准正态分布分量组成的向量相乘
我的问题是代码中的C变量不是下三角矩阵,那么它在多元高斯随机生成中有什么意义呢?
X
是两个二元正态分布的混合。一半的样本是用 np.dot(np.random.randn(n_samples, 2), C)
计算的,其中 C = np.array([[0., -0.1], [1.7, .4]])
。该分布等效于协方差为 C.T.dot(C)
的分布。也就是说,您可以使用 np.random.multivariate_normal([0, 0], C.T.dot(C), n_samples)
.
看到我前段时间写的这些笔记:"Correlated Random Samples"。 (在这些笔记中,3x3 矩阵 C
在右侧乘以形状为 (3, num_samples)
的样本。换句话说,这些笔记使用此处使用的公式的转置,因此协方差矩阵为C.dot(C.T)
.) C
不必是下三角。但通常情况下,您会得到一个协方差矩阵,并且您想找到 C
。如果您使用 Cholesky 分解来查找 C
,那么通过构造它将是下三角。
此 ipython 会话演示了两种方法从同一分布生成样本:
In [60]: C = np.array([[0., -0.1], [1.7, .4]])
In [61]: X1 = np.dot(np.random.randn(n_samples, 2), C)
In [62]: X2 = np.random.multivariate_normal([0, 0], C.T.dot(C), n_samples)
In [63]: plot(X1[:,0], X1[:,1], 'g*', alpha=0.2)
Out[63]: [<matplotlib.lines.Line2D at 0x113c17550>]
In [64]: plot(X2[:,0], X2[:,1], 'ko', alpha=0.2, ms=4)
Out[64]: [<matplotlib.lines.Line2D at 0x113c3ba58>]