【问题标题】:Python: Sample from multivariate normal with N means and same covariance matrixPython:来自具有 N 均值和相同协方差矩阵的多元正态样本
【发布时间】:2021-03-22 22:39:50
【问题描述】:

假设我想从多个具有相同协方差矩阵(恒等式)但均值不同的正态分布中采样 10 次,这些正态分布存储为以下矩阵的行:

means = np.array([[1, 5, 2],
                  [6, 2, 7],
                  [1, 8, 2]])

我怎样才能以最有效的方式做到这一点(即避免循环)

我试过这样:

scipy.stats.multivariate_normal(means, np.eye(2)).rvs(10)

np.random.multivariate_normal(means, np.eye(2))

但是他们抛出一个错误,说 mean 应该是 1D。

慢示例

import scipy
np.r_[[scipy.stats.multivariate_normal(means[i, :], np.eye(3)).rvs() for i in range(len(means))]]

【问题讨论】:

  • 使用for 循环,或者更好的列表理解。
  • 在这种特殊情况下,不是一个样本就像将这个均值矩阵添加到一个 3x3 正常 N(0,1) 矩阵吗?
  • 让我们从 - 你期望什么形状的输出开始?因为根本不清楚你想从中得到什么。
  • 我已经编辑了一个慢示例!
  • 我认为这个例子行不通

标签: python numpy scipy distribution normal-distribution


【解决方案1】:

您的协方差矩阵表明样本是独立的。您可以一次取样:

num_samples = 10
flat_means = means.ravel()

# build block covariance matrix
cov = np.eye(3)
block_cov = np.kron(np.eye(3), cov)

out = np.random.multivariate_normal(flat_means, cov=block_cov, size=num_samples)

out = out.reshape((-1,) + means.shape)

【讨论】:

  • 它们是独立的,只是因为这是一个 MWE。我希望它与完整的协方差矩阵一起工作。很抱歉造成混乱
  • @Euler_Salter 使用分块矩阵构造9x9 协方差矩阵。
  • 但他们不会独立
  • 哦,我明白你的意思了。当然,与列表理解相比,所有这些额外条目的引入会减慢速度吗?
  • 绘制小样本时可能会这样。但我敢打赌,当您需要抽取更多样本时,它会快得多。尝试 1000 个样本,您会发现这会快一百倍。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 2019-04-15
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多