生成 numpy.MultivariateNormal 时出现 MemoryError

Posted

技术标签:

【中文标题】生成 numpy.MultivariateNormal 时出现 MemoryError【英文标题】:MemoryError when generating numpy.MultivariateNormal 【发布时间】:2018-05-18 13:40:07 【问题描述】:

我有一个包含 707 列和 3947 行的数据集。由此,我计算了一个 707x707 的协方差矩阵,一个数组或行分别使用 numpy.cov 和 pandas.df.mean 表示。

当我使用这个协方差矩阵和一组方法尝试使用 numpy 生成随机多元正态玩具数据集时,我得到了 MemoryError。

我怎样才能根据这些规范生成如此大的随机数据集而不会出现此错误?

编辑:

这是我的堆栈跟踪:

Traceback (most recent call last):

  File "<ipython-input-28-701051dd6b16>", line 1, in <module>
    runfile('/project/home17/whb17/Documents/project2/scripts/mltest/covex.py', wdir='/project/home17/whb17/Documents/project2/scripts/mltest')

  File "/project/soft/linux64/anaconda/Anaconda3-5.0.1-Linux-x86_64/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/project/soft/linux64/anaconda/Anaconda3-5.0.1-Linux-x86_64/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/project/home17/whb17/Documents/project2/scripts/mltest/covex.py", line 36, in <module>
    d2_x, d2_y = multivariate_normal(means, X_cov, [n_cols, n_rows], check_valid='ignore').T

  File "mtrand.pyx", line 4538, in mtrand.RandomState.multivariate_normal

MemoryError

编辑 2:

这是导致它的代码:

X = pd.read_csv('../../data/mesa/MESA.csv', sep=',', header=None, index_col=0)

n_cols, n_rows = X.shape

means = X.mean(axis=0).tolist()

X_cov = np.cov(X.T)

d2_x, d2_y = multivariate_normal(means, X_cov, [n_cols, n_rows]).T

【问题讨论】:

什么命令专门引发错误? 另外,你确定矩阵不应该是 707 X 707 吗?通常列是变量,行是实例。 感谢您指出该问题。我已经相应地编辑了原始帖子,但我仍然有 MemoryError。 你能写出你看到的确切的命令+堆栈跟踪吗?您可能以错误的方式使用它。这些尺寸(包括原始尺寸)不是很大。 它在新的编辑中。 【参考方案1】:

从您的代码来看,您似乎很可能误解了multivariate_normal

中的使用
d2_x, d2_y = multivariate_normal(means, X_cov, [n_cols, n_rows]).T

这里的第一个和第二个参数是均值和协方差。第三个参数是矩阵的形状每个单元格都应该是随机矩阵的一个实例。这不是转置是一对的东西,而且几乎肯定不是你想要的。

举个例子,如果X_cov的尺寸是707 X 707,那么结果的尺寸就是707 X 707 X 707 X n_rows

要生成玩具数据集,您应该使用

multivariate_normal(means, X_cov, n_rows)

与您的原始问题(第一次编辑之前)相比,总体结果应该小大约 1 / 1250000。

【讨论】:

谢谢,但现在我收到了TypeError: 'multivariate_normal_frozen' object is not iterable 如果你试图将它分配给一对,那么,是的 - 你会得到那个错误。每次调用它时,它都会生成一个具有原始数据集尺寸的数据集。如果你想要两个,我建议你调用两次。

以上是关于生成 numpy.MultivariateNormal 时出现 MemoryError的主要内容,如果未能解决你的问题,请参考以下文章

Python生成器三元表达式列表生成式字典生成式生成器表达式

3.1字典生成式集合生成式生成器

动软代码生成器的功能说明

卷积生成对抗网络(DCGAN)---生成手写数字

卷积生成对抗网络(DCGAN)---生成手写数字

python列表生成器与生成器