Вопрос по sparse-matrix, python, cluster-analysis, linear-algebra, scipy – Скудный eigsh () для малых собственных значений

8

Я пытаюсь написать алгоритм спектральной кластеризации, используя NumPy / SciPy для более крупных (но все еще поддающихся отслеживанию) систем, используя библиотеку разреженной линейной алгебры SciPy. К сожалению, у меня возникают проблемы со стабильностьюeigsh ().

Вот мой код:

import numpy as np
import scipy.sparse
import scipy.sparse.linalg as SLA
import sklearn.utils.graph as graph

W = self._sparse_rbf_kernel(self.X_, self.datashape)
D = scipy.sparse.csc_matrix(np.diag(np.array(W.sum(axis = 0))[0]))
L = graph.graph_laplacian(W) # D - W
vals, vects = SLA.eigsh(L, k = self.k, M = D, which = 'SM', sigma = 0, maxiter = 1000)

sklearn библиотека ссылается на пакет scikit-learn, в частностиЭтот метод для расчета графа лапласиана из разреженной матрицы SciPy.

_sparse_rbf_kernel это метод, который я написал для вычисления парных сродств точек данных. Он работает путем создания разреженной матрицы сродства из данных изображения, в частности, путем вычисления только парных сродств для 8-окрестностей вокруг каждого пикселя (вместо попарного для всех пикселей с scikit-learn & s)rbf_kernel метод, который для записи не может исправить это либо).

Поскольку лапласиан ненормализован, я ищу наименьшие собственные значения и соответствующие собственные векторы системы. Я это понимаюARPACK плохо подходит для поиска небольших собственных значений, но я пытаюсь использовать shift-invert, чтобы найти эти значения, и до сих пор не добился большого успеха.

С приведенными выше аргументами (в частности,sigma = 0), Я получаю следующую ошибку:

RuntimeError: Factor is exactly singular

Сsigma = 0.001Я получаю другую ошибку:

scipy.sparse.linalg.eigen.arpack.arpack.ArpackNoConvergence: ARPACK error -1: No convergence (1001 iterations, 0/5 eigenvectors converged)

Я пробовал все три различных значения дляmode с тем же результатом.Any suggestions for using the SciPy sparse library for finding small eigenvalues of a large system?

Ваш Ответ

1   ответ
13

which='LM': в режиме сдвига-инверсии этот параметр относится к преобразованным собственным значениям. (Как объяснено вдокументация.)

Да, но проблема в том, что я хочу наименьших собственных значений и связанных с ними собственных векторов, а не наибольших. Документация объясняет, что если желательны небольшие собственные значения, для повышения производительности следует использовать режим инверсии сдвига, что я и пытался сделать, используяsigma, но безрезультатно. Magsol
Просто хотел сказать, что это было чрезвычайно полезно
Вышесказанное должно дать вам именно то, что вы хотите. Примечание: при sigma = 0 преобразованные собственные значения w '= 1 / (w-sigma) = 1 / w. Поэтому сwhich='LM' вы получите собственные значения с большимw'или, другими словами, наименьшие собственные значения исходной задачи. Если вы используете режим сдвига-инвертирования, вам необходимо также настроитьwhich параметр соответственно.

Похожие вопросы