Scipy的稀疏eigsh()用于小特征值

Mag*_*sol 8 python cluster-analysis linear-algebra scipy sparse-matrix

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

sklearn库引用scikit-learn包,特别是用于从稀疏SciPy矩阵计算图拉普拉斯的方法.

_sparse_rbf_kernel是我编写的用于计算数据点的成对亲和力的方法.它通过从图像数据创建稀疏亲和度矩阵来操作,特别是通过仅计算每个像素周围的8个邻域的成对亲和力(而不是使用scikit-learn rbf_kernel方法对所有像素成对,对于记录也不能解决这个问题) .

由于拉普拉斯非标准化,我正在寻找系统的最小特征值和相应的特征向量.我知道ARPACK不适合寻找小的特征值,但我试图使用shift-invert来找到这些值,但仍然没有取得多大成功.

使用上述参数(具体而言sigma = 0),我收到以下错误:

RuntimeError: Factor is exactly singular
Run Code Online (Sandbox Code Playgroud)

有了sigma = 0.001,我得到一个不同的错误:

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

我已经尝试了所有三个不同的值mode,但结果相同.有关使用SciPy稀疏库查找大型系统的小特征值的建议吗?

pv.*_*pv. 13

您应该使用which='LM':在shift-invert模式下,此参数指的是已转换的特征值.(如文档所述.)

  • 以上应该给你你想要的.注意:在sigma = 0的情况下,变换的特征值是w'= 1 /(w-sigma)= 1/w.因此,使用`which ='LM'`,您可以获得具有大**w'**的特征值,或者换句话说,即原始问题的最小特征值.如果使用shift-invert模式,则需要相应地调整`which`参数. (3认同)
  • 只是想说这非常有帮助 (2认同)