Python 当维度过高时,numpy多变量_正常错误

Python 当维度过高时,numpy多变量_正常错误,python,numpy,Python,Numpy,我正在做一个家庭作业,我注意到当均值和协方差的维数很高时,multivariable_normal将永远占用所有CPU,而不会产生任何结果 示例代码段 cov_true = np.eye(p) mean_true = np.zeros(p) beta_true = multivariate_normal(mean_true, cov_true, size=1).T 当p=5000时,此操作将永远运行。 环境,Python 3.4和Python 3.5,numpy 1.11.0 这真的是一只虫

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

示例代码段

cov_true  = np.eye(p)
mean_true = np.zeros(p)
beta_true = multivariate_normal(mean_true, cov_true, size=1).T
p=5000
时,此操作将永远运行。 环境,Python 3.4和Python 3.5,numpy 1.11.0


这真的是一只虫子还是我错过了什么

什么花了这么多时间?

要考虑协方差矩阵的变量NumPy之间的关系,这需要大部分时间(通常是Θ(n3),50003已经有一点)

如何加快速度?

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

否则,如果协方差矩阵恰好是满秩(因此是正定的),则将
svd
替换为(通常仍为Θ(n3),但常数较小):

如果矩阵可能是奇异的(有时是这种情况),那么要么打包要么考虑帮助。< /P>


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

这对我很有效。同样的版本。将第三行更改为该行,看看它是否有效:
beta\u true=np.random.multivariable\u normal(mean\u true,cov\u true,size=1)。T
是的,只是不同的导入,运行这一行需要多长时间?是的意思是它工作了,没有占用100%的cpu吗?我的:
--15.3049829006秒---
哦,我使用了不同的导入,
来自np.random import Multivariable\u normal
,是的,我的意思是使用100%CPU,在我的13'MacBook pro上,
real 0m53.319s,user 1m40.845s,sys 0m2.128s
,在现代工作站上,它稍微好一点,但它使用了全部48个内核,我不明白为什么@如果你的时间是15秒,我的时间是50秒,你用的是p=5000吗?我的测试程序只是导入,
p=5000
和这三行。它报告错误,
sample=normal(mean\u-true,cov\u-true,len(mean\u-true))回溯(最近一次调用):文件“”,第1行,在文件“mtrand.pyx”中,第1495行,在mtrand.RandomState.normal中(numpy/rand/mtrand/mtrand.c:10068)ValueError:scale您可以使用类似于
np.sqrt(cov_true.diagonal())
的方法从协方差矩阵中选取标准偏差。第一种方法只有在所有非对角项都为零时才正确。@wrwrwrwrwr这是否意味着复杂度在样本数上是恒定的,即
np.random。多元正态(size=100)
np.random.multivariable\u normal(size=10)
慢不了多少?或者它在
大小方面是线性的
from numpy.random import normal

sample = normal(means, deviations, len(means))
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)))