SciPy のスパース線形代数ライブラリを利用して、大規模な (ただし扱いやすい) システム用に NumPy/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 のrbf_kernel
方法を使用してすべてのピクセルに対してペアワイズではなく、これも修正されません)。 .
ラプラシアンは正規化されていないため、システムの最小の固有値と対応する固有ベクトルを探しています。ARPACK が小さな固有値を見つけるのに適していないことは理解していますが、シフトインバートを使用してこれらの値を見つけようとしていますが、まだあまり成功していません。
上記の引数 (具体的にはsigma = 0
) を使用すると、次のエラーが発生します。
RuntimeError: 因子は厳密に特異です
ではsigma = 0.001
、別のエラーが発生します。
scipy.sparse.linalg.eigen.arpack.arpack.ArpackNoConvergence: ARPACK エラー -1: 収束なし (1001 回の反復、0/5 の固有ベクトルが収束)
3 つの異なる値をすべて試してみましたmode
が、同じ結果が得られました。大規模なシステムの小さな固有値を見つけるために SciPy スパース ライブラリを使用するための提案はありますか?