Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在MNIST数据上运行sklearn PCA会导致内存分配错误_Python_Memory Management_Scikit Learn_Pca_Mnist - Fatal编程技术网

Python 在MNIST数据上运行sklearn PCA会导致内存分配错误

Python 在MNIST数据上运行sklearn PCA会导致内存分配错误,python,memory-management,scikit-learn,pca,mnist,Python,Memory Management,Scikit Learn,Pca,Mnist,我试图在MNIST数据上运行PCA(只是在尝试学习一些ML内容时弄乱了PCA),但得到的内存分配错误对于我的机器来说似乎太小了。 我尝试了两种稍有不同的代码,以下代码是从本网站复制的: ,(我在Iris数据集上运行了PCA,效果非常好) 但是,当我运行以下程序时: from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784') from sklearn.model_selection import trai

我试图在MNIST数据上运行PCA(只是在尝试学习一些ML内容时弄乱了PCA),但得到的内存分配错误对于我的机器来说似乎太小了。 我尝试了两种稍有不同的代码,以下代码是从本网站复制的: ,(我在Iris数据集上运行了PCA,效果非常好)

但是,当我运行以下程序时:

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')

from sklearn.model_selection import train_test_split
# test_size: what proportion of original data is used for test set
train_img, test_img, train_lbl, test_lbl = train_test_split( mnist.data, mnist.target, test_size=1/7.0, random_state=0)


from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Fit on training set only.
scaler.fit(train_img)
# Apply transform to both the training set and the test set.
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)


from sklearn.decomposition import PCA
# Make an instance of the Model
pca = PCA(.95)


pca.fit(train_img)

我得到一个错误:

Traceback (most recent call last):
  File "C:\...\Python\pca_mnist_new.py", line 12, in <module>
    scaler.fit(train_img)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\preprocessing\_data.py", line 667, in fit
    return self.partial_fit(X, y)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\preprocessing\_data.py", line 762, in partial_fit
    _incremental_mean_and_var(X, self.mean_, self.var_,
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\utils\extmath.py", line 765, in _incremental_mean_and_var
    new_sum = _safe_accumulator_op(np.nansum, X, axis=0)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\utils\extmath.py", line 711, in _safe_accumulator_op
    result = op(x, *args, **kwargs)
  File "<__array_function__ internals>", line 5, in nansum
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\nanfunctions.py", line 649, in nansum
    a, mask = _replace_nan(a, 0)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\nanfunctions.py", line 109, in _replace_nan
    a = np.array(a, subok=True, copy=True)
MemoryError: Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64
[Finished in 29.868s]
回溯(最近一次呼叫最后一次):
文件“C:\…\Python\pca\u mnist\u new.py”,第12行,在
定标器安装(列车安装)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\preprocessing\\u data.py”,第667行
返回自我部分拟合(X,y)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\preprocessing\\ u data.py”,第762行,部分匹配
_增量平均值和var(X,self.mean,self.var,
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\utils\extmath.py”,第765行,在增量平均值和变量中
新求和=安全累加器运算(np.nansum,X,axis=0)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\utils\extmath.py”,第711行,在“安全”操作中
结果=op(x,*args,**kwargs)
文件“”,第5行,在nansum
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\numpy\lib\nanfunctions.py”,第649行,位于nansum中
a、 掩码=_replace_nan(a,0)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\numpy\lib\nanfunctions.py”,第109行,在“替换”中
a=np.array(a,subok=True,copy=True)
MemoryError:无法为具有形状(60000784)和数据类型float64的数组分配359.MiB
[以29.868秒完成]
(我得到了一个类似的错误,当我运行我之前用已经加载的数据编写的代码时,前导代码略有不同:

Traceback (most recent call last):
  File "C:\...\Python\pca_MNIST.py", line 36, in <module>
    pca.fit(x)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 351, in fit
    self._fit(X)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 423, in _fit
    return self._fit_full(X, n_components)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 454, in _fit_full
    U, S, V = linalg.svd(X, full_matrices=False)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\scipy\linalg\decomp_svd.py", line 128, in svd
    u, s, v, info = gesXd(a1, compute_uv=compute_uv, lwork=lwork,
MemoryError: Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64
[Finished in 2.792s]
回溯(最近一次呼叫最后一次):
文件“C:\…\Python\pca\u MNIST.py”,第36行,在
pca.fit(x)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\decomposition\\u pca.py”,第351行,在fit中
自适配(X)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\decomposition\\u pca.py”,第423行,格式为
返回自装配(X、n组件)
文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\sklearn\decomposition\\u pca.py”,第454行,完整
U、 S,V=linalg.svd(X,全矩阵=False)
svd中第128行的文件“C:\…\Local\Programs\Python\Python38-32\lib\site packages\scipy\linalg\decomp\u svd.py”
u、 s,v,info=gesXd(a1,compute_uv=compute_uv,lwork=lwork,
MemoryError:无法为具有形状(60000784)和数据类型float64的数组分配359.MiB
[以2.792s完成]
但两者在底部的错误完全相同。)

我在Windows 10上,在Atom中运行这段代码,但在命令行中运行这段代码时,我遇到了相同的错误,其他所有操作都关闭了。我有16 GB的RAM

我知道MiB是Mebibyte,其中359个看起来太小,不适合16GB内存的分配错误,但这正是我有限的专业知识和沮丧的谷歌搜索让我不知所措的地方

我从这里看到:,Python只是尽可能多地分配内存,直到没有剩余内存

有没有可能PCA函数正在使用所有这些内存,而这个错误仅仅是针对折断骆驼背的数组的?我的直觉是否定的,但我现在真的有点力不从心了

有没有办法让它工作起来,这样我就可以玩一些低维数据了?
或者我必须绕道手工编写一些东西来实现这一点吗?

一个简单的解决方法是降低浮点精度。
float64
似乎有些过分,即使神经网络也不使用这种精度

import numpy as np

train_img = train_img.astype(np.float32)  # or even np.float16

也可以在测试img时使用此方法。

一个简单的解决方法是降低浮点精度。
float64
似乎有些过分,即使神经网络也不使用这种精度

import numpy as np

train_img = train_img.astype(np.float32)  # or even np.float16

对于
test\u img
也可以尝试此操作。

`MemoryError:无法为具有形状(60000,784)和数据类型float64的数组分配359.MiB`仍然会出现此错误,我相信是PCA或StandardScaler函数正在创建float64数组`MemoryError:无法为具有形状(60000,784)的数组分配359.MiB)数据类型float64`仍然会出现这个错误,我相信是PCA或StandardScaler函数创建了float64数组