Python 在MNIST数据上运行sklearn PCA会导致内存分配错误
我试图在MNIST数据上运行PCA(只是在尝试学习一些ML内容时弄乱了PCA),但得到的内存分配错误对于我的机器来说似乎太小了。 我尝试了两种稍有不同的代码,以下代码是从本网站复制的: ,(我在Iris数据集上运行了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
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数组