10

我正在尝试使用 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-learn 包,特别是这种从稀疏 SciPy 矩阵计算图拉普拉斯算子的方法。

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

由于拉普拉斯算子未归一化,因此我正在寻找系统的最小特征值和相应的特征向量。我知道ARPACK 不适合查找小的特征值,但我正在尝试使用 shift-invert 来查找这些值,但仍然没有取得太大的成功。

使用上述参数(特别是sigma = 0),我收到以下错误:

RuntimeError: Factor 是完全奇异的

使用sigma = 0.001,我得到一个不同的错误:

scipy.sparse.linalg.eigen.arpack.arpack.ArpackNoConvergence:ARPACK 错误 -1:没有收敛(1001 次迭代,0/5 特征向量收敛)

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

4

1 回答 1

15

您应该使用which='LM': 在移位反转模式下,此参数指的是转换后的特征值。(如文档中所述。)

于 2012-08-30T20:33:41.320 回答