Я просто попытался использовать IncrementalPCA из sklearn.decomposition, но он бросил MemoryError так же, как PCA и RandomizedPCA раньше. Моя проблема в том, что матрица, которую я пытаюсь загрузить, слишком велика, чтобы вписаться в ОЗУ. Сейчас он хранится в базе данных hdf5 в виде набора данных формы ~ (1000000, 1000), поэтому я имею 1.000.000.000 значений float32. Я думал, что IncrementalPCA загружает данные пакетами, но, судя по всему, он пытается загрузить весь набор данных, что не помогает. Как эта библиотека предназначена для использования? Проблема в формате hdf5?Инкрементальный PCA на большие данные
from sklearn.decomposition import IncrementalPCA
import h5py
db = h5py.File("db.h5","r")
data = db["data"]
IncrementalPCA(n_components=10, batch_size=1).fit(data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/sklearn/decomposition/incremental_pca.py", line 165, in fit
X = check_array(X, dtype=np.float)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/sklearn/utils/validation.py", line 337, in check_array
array = np.atleast_2d(array)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/numpy/core/shape_base.py", line 99, in atleast_2d
ary = asanyarray(ary)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/numpy/core/numeric.py", line 514, in asanyarray
return array(a, dtype, copy=False, order=order, subok=True)
File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (-------src-dir-------/h5py/_objects.c:2458)
File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (-------src-dir-------/h5py/_objects.c:2415)
File "/software/anaconda/2.3.0/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 640, in __array__
arr = numpy.empty(self.shape, dtype=self.dtype if dtype is None else dtype)
MemoryError
Спасибо за помощь
Хорошо, так что в основном я не должен называть подходящим, но partial_fit несколько раз. Я не видел этот метод, потому что учебник использует подходящий. Знаете ли вы, почему fit имеет параметр batch_size, если он загружает весь набор данных одновременно? – KrawallKurt
Трюк не загружать все данные в память, вероятно, позаботился о библиотеке h5py. Его объект набора данных ('h5 ['data']'), похоже, ведет себя как обычный массив numpy, но это не так. 'IncrementalPCA' не знает, что это структура данных на диске, и в какой-то момент читает все строки (' MemoryError'!). Расчет по-прежнему выполняется в партиях 'batch_size'. – sastanin
Это происходит в 'fit()', который [вызывает check_array()] (https://github.com/scikit-learn/scikit-learn/blob/0.16.1/sklearn/decomposition/incremental_pca.py#L165), который должен преобразовывать данные в обычный массив numpy (https://github.com/scikit-learn/scikit-learn/blob/0.16.1/sklearn/utils/validation.py#L268) Вызов 'partial_fit() 'обходит это преобразование. – sastanin