SciPy的的稀疏eigsh()的小特征值(Scipy's sparse eigsh() f

2019-07-31 04:17发布

我想写使用与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学习封装,具体地该方法用于计算从一个稀疏矩阵SciPy的图的拉普拉斯。

_sparse_rbf_kernel是我写的计算数据点的逐对相关的方法。 它操作通过创建从图像数据稀疏的亲和基质,特别是通过只计算为8邻域逐对相关度的每个像素周围的(而不是成对与scikit学习的所有像素rbf_kernel方法,该方法用于记录不任一解决此)。

由于拉普拉斯非标准化的,我正在寻找最小的特征值和相应的系统的特征向量。 据我所知, ARPACK是不适合用于寻找小的特征值 ,但我想用shift-反转找到这些价值观和我仍然没有很大的成功。

与上述参数(具体地, sigma = 0 ),I得到以下错误:

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具有相同的结果。 使用查找大系统小特征值的SciPy的稀疏库有什么建议?

Answer 1:

您应该使用which='LM' :在移位倒置模式,该参数指的是转化的本征值。 (如在说明的文档 )。



文章来源: Scipy's sparse eigsh() for small eigenvalues