Скудный eigsh () для малых собственных значений
Я пытаюсь написать алгоритм спектральной кластеризации, используя 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?