使用Python numpy.random.randn绘制多元高斯分布样本

时间:2017-06-17 03:33:40

标签: numpy random gaussian

我正在研究高斯混合模型并且遇到了这个代码,该代码从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])]

(原始链接:http://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_selection.html#sphx-glr-auto-examples-mixture-plot-gmm-selection-py

根据this Wikipedia link,我们可以通过Cholesky生成多元高斯样本 - 分解协方差矩阵,然后将其与由标准正态分布绘制的分量组成的向量相乘。

我的问题是代码中的C变量不是下三角矩阵,那么在多变量高斯随机生成中它是如何有意义的?

1 个答案:

答案 0 :(得分:5)

class ParentClass { multi method foo (Str $s) { ... } } class ChildClass is ParentClass { multi method foo (Int $n) { ... } multi method foo (Rat $r) { ... } } my $object = ChildClass.new; # invocant is the first thing for method captures my $capture = \( ChildClass, Str ); for $object.can( 'foo' ) .flatmap( *.candidates ) .grep( *.cando: $capture ) -> $candidate { put join "\t", $candidate.package.^name, $candidate.name, $candidate.signature.perl; }; 是两个双变量正态分布的混合。一半样本使用X计算,其中np.dot(np.random.randn(n_samples, 2), C)。此分布等效于协方差为C = np.array([[0., -0.1], [1.7, .4]])的分布。也就是说,您可以使用C.T.dot(C)生成来自同一分布的样本。

请参阅我前一段时间写的这些笔记:"Correlated Random Samples"。 (在这些注释中,3x3矩阵np.random.multivariate_normal([0, 0], C.T.dot(C), n_samples)在右侧乘以形状为C的样本。换句话说,这些音符使用此处使用的公式的转置,因此协方差矩阵是(3, num_samples)。)C.dot(C.T)不一定是低三角形。但通常情况下,您会获得一个协方差矩阵,并且您希望找到C。如果您使用Cholesky分解来查找C,那么通过构造,它将是下三角形。

此ipython会话演示了这两种方法从同一分布生成样本:

C

plot