Eigsh escaso de Scipy () para valores propios pequeños

Estoy tratando de escribir un algoritmo de agrupamiento espectral usando NumPy / SciPy para sistemas más grandes (pero aún así manejables), haciendo uso de la biblioteca de álgebra lineal escasa de SciPy. Desafortunadamente, estoy teniendo problemas de estabilidad coneigsh ().

Aquí está mi código:

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)

lossklearn biblioteca se refiere al paquete scikit-learn, específicamenteeste método para calcular una gráfica laplaciana a partir de una matriz escasa de SciPy.

_sparse_rbf_kernel es un método que escribí para calcular las afinidades por pares de los puntos de datos. Funciona mediante la creación de una matriz de afinidad dispersa a partir de los datos de la imagen, específicamente mediante el cálculo de afinidades por pares para los 8 barrios alrededor de cada píxel (en lugar de por pares para todos los píxeles con scikit-learn'srbf_kernel método, que para el registro tampoco soluciona esto).

Como el laplaciano no está normalizado, estoy buscando los valores propios más pequeños y los vectores propios correspondientes del sistema. Entiendo queARPACK no es adecuado para encontrar valores propios pequeños, pero estoy tratando de usar shift-invert para encontrar estos valores y todavía no estoy teniendo mucho éxito.

Con los argumentos anteriores (específicamente,sigma = 0), Obtuve el siguiente error:

RuntimeError: Factor is exactly singular

Consigma = 0.001, Me sale un error diferente:

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

He probado los tres valores diferentes paramode Con el mismo resultado.¿Alguna sugerencia para usar la biblioteca dispersa de SciPy para encontrar valores propios pequeños de un sistema grande?

Respuestas a la pregunta(1)

Su respuesta a la pregunta