pandas DataFrame 结果中的内置 cov ValueError 数组太大

数据挖掘 Python 熊猫
2021-09-19 23:50:03

所以,我有一个包含 39.949 个变量和 180 行的数据集。数据集已成功保存在 DataFrame 中,但是当我尝试查找 cov() 时会导致错误。这是代码

  import pandas as pd
  cov_data=pd.DataFrame(dataset).cov()

这是错误

File "/home/syahdeini/Desktop/FP/pca_2.py", line 44, in find_eagen
cov_data=pd.DataFrame(data_mat).cov()
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 3716, in cov
baseCov = np.cov(mat.T)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 1766, in cov
return (dot(X, X.T.conj()) / fact).squeeze()
ValueError: array is too big.
2个回答

克里斯托弗关于数组的大小是正确的。简单地说,如果这转换为 1.6B 浮点数,每个浮点数 16 个字节(32 位版本;64 位更大),那么您正在尝试创建一个大约 26 GB 的数组。即使你有内存,我想它可能会在此过程中使其他东西过载。

(也许不是,但一般来说,任何计算密集型的操作都应该首先提出你是否在做正确计算的问题。如果你确实需要做这么大的事情,那么你应该尝试将其分解为更易于管理的块,这些块可以并行运行或分布在机器上。)

但是鉴于您正在描述一个非常非常宽的数据集(约 40k 列 x 180 行),我想知道您是否真的想采用转置数据集的协方差矩阵(所以 180x180 = 32,400 协方差)?那将是一个更容易处理的问题,并且更容易看出它可能如何有用。

在任何情况下,在实际使用它的时候计算每个成对协方差(或至少计算所有 x_k 的 cov(x_i,x_k) 的向量)可能要好得多!= x_i),而不是计算最初是一个巨大的矩阵,然后稍后再引用它。抛开内存问题不谈,如果您开始并行运行,它会让您的生活变得更轻松,并有助于确保您不会将资源浪费在不必要的计算上。

由于您有 39,949 个变量,协方差矩阵将包含大约 16 亿个元素 (39,949 * 39,949 = 1,595,922,601)。这可能就是您收到该错误的原因。