Я пытаюсь запустить PCA для данных MNIST (просто возиться с ним, пытаясь изучить кое-что из ML), но получаю ошибку выделения памяти, которая кажется слишком маленькой для моей машины. Я пробовал два немного разных кода, следующий скопирован с этого веб-сайта: https://towardsdatascience.com/pca-using-python-scikit-learn-e653f8989e60, (где мне удалось запустить PCA в наборе данных Iris, абсолютно нормально).
Но когда Я go, чтобы запустить следующее:
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]
(Я получаю аналогичную ошибку с немного другой преамбулой, когда я запускаю созданный мной код ранее с уже загруженными данными:
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]
, но у обоих одинаковая ошибка внизу.)
Я использую Windows 10, выполняю этот код в Atom, но я получить ту же ошибку, запустив это из командной строки, когда все остальное закрыто. У меня 16 ГБ оперативной памяти.
Я понимаю, что MiB - это Mebibyte, и 359 из них кажутся слишком маленькими для ошибки распределения с 16 ГБ оперативной памяти, но именно здесь мой ограниченный опыт и разочарование в поиске в Google оставляют меня в затруднительном положении. потеря.
Из этого я вижу: { ссылка }: ~: text = Python% 20действует% 20limit% 20memory, что% 20вы% 20выглядит на% 20. , это Python просто выделяет столько памяти, сколько может, пока не останется ни одной.
Возможно ли, что функция PCA использует всю эту память, и эта ошибка просто для массива, который сломал спину верблюда? Моя интуиция говорит «нет», но я действительно не в своей тарелке.
Есть ли способ заставить это работать, чтобы я мог go поиграть с некоторыми данными более низкого измерения? Или мне придется сделать объезд и написать что-нибудь, чтобы сделать это вручную?