7

Ich versuche, einen spektralen Clustering-Algorithmus mit NumPy/SciPy für größere (aber immer noch handhabbare) Systeme zu schreiben, indem ich die spärliche lineare Algebra-Bibliothek von SciPy nutze. Leider stoße ich auf Stabilitätsprobleme mit eigsh().Scipys spärliche Eigsh() für kleine Eigenwerte

Hier ist mein Code:

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) 

Die sklearn Bibliothek bezieht sich auf das Scikit-Learn-Paket, speziell this method für einen Graphen Laplace von einer spärlichen SciPy Matrix zu berechnen.

ist eine Methode, die ich geschrieben habe, um paarweise Affinitäten der Datenpunkte zu berechnen. Er arbeitet, indem er eine spärliche Affinitätsmatrix aus Bilddaten erzeugt, indem er nur paarweise Affinitäten für die 8 Nachbarschaften um jedes Pixel berechnet (anstelle von paarweise für alle Pixel mit der Methode rbf_kernel von scikit-learn), die dies auch nicht korrigiert).

Da der Laplace-Operator nicht normalisiert ist, suche ich nach den kleinsten Eigenwerten und entsprechenden Eigenvektoren des Systems. Ich verstehe, dass ARPACK is ill-suited for finding small eigenvalues, aber ich versuche Shift-Invert zu verwenden, um diese Werte zu finden und bin immer noch nicht viel Erfolg.

Mit den obigen Argumenten (insbesondere sigma = 0), erhalte ich folgende Fehlermeldung:

RuntimeError: Factor is exactly singular 

Mit sigma = 0.001, erhalte ich einen anderen Fehler:

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

Ich habe versucht, alle drei Werte für mode mit dem gleichen Ergebnis. Haben Sie Vorschläge zur Verwendung der SciPy-Sparse-Bibliothek zum Auffinden kleiner Eigenwerte eines großen Systems?

Antwort

11

Sie sollten which='LM' verwenden: Im Shift-Invert-Modus bezieht sich dieser Parameter auf die transformierten Eigenwerte. (Wie in the documentation erläutert.)

+0

Richtig, aber das Problem ist, ich möchte die kleinsten Eigenwerte und ihre zugehörigen Eigenvektoren, nicht die größten. Die Dokumentation erklärt, dass, wenn kleine Eigenwerte erwünscht sind, der Shift-Invert-Modus verwendet werden sollte, um die Leistung zu verbessern, was ich versuchte, indem ich "Sigma" nutzte, ohne Erfolg. – Magsol

+3

Das obige sollte Ihnen genau geben, was Sie wollen. Anmerkung: Mit Sigma = 0 sind die transformierten Eigenwerte w '= 1/(w-sigma) = 1/w. Mit 'which = 'LM'' erhalten Sie also die Eigenwerte mit großem ** w' **, oder mit anderen Worten, die kleinsten Eigenwerte des ursprünglichen Problems. Wenn Sie den Shift-Invert-Modus verwenden, müssen Sie auch den 'which' Parameter entsprechend anpassen. –

+2

Ich wollte nur sagen, das war sehr hilfreich – YXD