Я пытаюсь использовать метод спектральной кластеризации, предоставленный scikit-learn для объединения строк моего набора данных (которых всего 16000). Моя проблема возникает после того, как я предварительно вычислил матрицу сходства (матрица с плавающей запятой 16000x16000), которая выделяет более или менее 3 гигабайта (максимум я могу достичь до 8 ГБ), метод, вызываемый на этой матрице, с решателем argpack требует гораздо больше памяти и процессор теряет так много времени, пытаясь поменять местами вещи в памяти и из памяти, что вычисления замедляются до смерти. Я также пытался вызвать сборщик мусора перед методом, но безуспешно:
import gc
gc.collect()
Как я могу получить точную схему происходящего? Это известная проблема? Есть ли какие-либо альтернативы в python для выполнения спектральной кластеризации из коробки?
Я могу опубликовать минимальный рабочий пример, если это необходимо.
ОБНОВЛЕНИЕ Я ошибся в отношении решателя lobpcg, сначала кажется, что он использует всю мою память, но затем стабилизируется около 5 Гб, и процесс продолжается, но возникает другая проблема. Кажется, что вычисление приводит к некоторым числовым неточностям, которые в конце концов генерируют Nans или ошибку, подобную этой (возникающая ошибка изменяется, в то время как матрица сходства немного изменяется, см. Ниже):
File "/usr/local/lib/python3.4/dist-packages/sklearn/cluster/spectral.py", line 255, in spectral_clustering
eigen_tol=eigen_tol, drop_first=False)
File "/usr/local/lib/python3.4/dist-packages/sklearn/manifold/spectral_embedding_.py", line 303, in spectral_embedding
largest=False, maxiter=2000)
File "/usr/local/lib/python3.4/dist-packages/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py", line 449, in lobpcg
assert np.allclose(gramA.T, gramA)
AssertionError
Моя метрика подобия представляет собой ядро Гаусса exp(-((X_1 - x_2)^2/2*sigma^2))
, и результаты сильно различаются при использовании разных значений сигмы. Я могу понять, что некоторые неточности могут возникнуть, когда некоторые записи близки к нулю, но это не тот случай, когда я использую большие значения для сигмы (= 5,0), вместо этого приближая их к 1,0.
Теперь я предполагаю, что я упускаю какой-то момент или делаю что-то неправильно в процессе, поэтому я обновляю этот вопрос с новой целью.
Для справки, вот как я вычисляю матрицу сходства:
pairwise_dists = \
scipy.spatial.distance.squareform(
scipy.spatial.distance.pdist(data_slice,'sqeuclidean'))
similarity_matrix = scipy.exp(-pairwise_dists /(2 * self._sigma ** 2))
где data_slice
- это массив numpy, строки которого являются моими экземплярами, а self._sigma
хранит параметр гауссовой сигмы.