【问题标题】:numpy multivariate_normal bug when dimension too high当维度太高时,numpy multivariate_normal 错误
【发布时间】:2016-10-18 05:39:27
【问题描述】:

我正在做一个家庭作业,我注意到当均值和协方差的维度非常高时,multivariate_normal 将永远占用所有 CPU,而不会产生任何结果。

示例代码sn-p,

cov_true  = np.eye(p)
mean_true = np.zeros(p)
beta_true = multivariate_normal(mean_true, cov_true, size=1).T

p=5000 时,它将永远运行。 环境,python3.4和python3.5,numpy 1.11.0

这真的是一个错误还是我错过了什么?

【问题讨论】:

  • 它对我有用。相同的版本。将第 3 行更改为此,看看它是否有效:beta_true = np.random.multivariate_normal(mean_true, cov_true, size=1).T
  • 是的,只是导入不同,你运行这条线需要多长时间?
  • “是”是否意味着它工作并且没有占用 100% cpu?我的:--- 15.3049829006 seconds ---
  • 哦,我使用了不同的导入,from np.random import multivariate_normal,是的,我的意思是在我的 13' MacBook Pro 上使用 100% CPU,real 0m53.319s, user 1m40.845s, sys 0m2.128s,在现代工作站上,它稍微好一点,但它使用所有 48 个内核,我不明白为什么。 @Yugi
  • 我觉得你的时间是15秒肯定有问题,我的时间是50秒,你用的是p=5000吗?我的测试程序只是导入,p=5000 和这三行。

标签: python numpy


【解决方案1】:

什么需要这么多时间?

要考虑协方差矩阵的变量 NumPy computes the singular value decomposition 之间的关系,这需要大部分时间(underlying GESDD 通常是 Θ(n3) 和 50003 已经有点)了。

如何加快速度?

在所有变量独立的最简单情况下,您可以使用random.normal

from numpy.random import normal

sample = normal(means, deviations, len(means))

否则,如果您的协方差矩阵恰好是满秩(因此是正定的),则通常用 cholesky 代替 svd(仍然是 Θ(n3),但使用较小的常数):

from numpy.random import standard_normal
from scipy.linalg import cholesky

l = cholesky(covariances, check_finite=False, overwrite_a=True)
sample = means + l.dot(standard_normal(len(means)))

如果矩阵可能是单数的(有时是这种情况),那么要么包装SPSTRF,要么考虑使用scipy#6202

Cholesky 可能会明显更快,但如果这还不够,那么您可以进一步研究是否无法解析地分解矩阵,或者尝试使用不同的基础库(例如 ACML、MKL 或cuSOLVER)。

【讨论】:

  • 报错,sample = normal(mean_true, cov_true, len(mean_true)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "mtrand.pyx", line 1495, in mtrand.RandomState.normal (numpy/random/mtrand/mtrand.c:10068) ValueError: scale <= 0
  • 您可以使用np.sqrt(cov_true.diagonal()) 之类的方法从协方差矩阵中选择标准差。第一种方法只有在所有非对角项都为零时才是正确的。
  • @wrwrwr 这是否意味着复杂度在样本数量上是恒定,即np.random.multivariate_normal(size=100) 不会比np.random.multivariate_normal(size=10) 慢太多?还是size中的线性
猜你喜欢
  • 2020-09-09
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多