Скудный 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?

Ответы на вопрос(1)

Ваш ответ на вопрос