我想写使用与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的稀疏库有什么建议?