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

时间:2012-08-25 21:54:04

标签: python scipy cluster-analysis linear-algebra 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)

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

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

由于拉普拉斯非标准化,我正在寻找系统的最小特征值和相应的特征向量。我理解ARPACK is ill-suited for finding small eigenvalues,但我正在尝试使用shift-invert来找到这些值,但仍然没有取得多大成功。

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

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稀疏库查找大型系统的小特征值的建议吗?

1 个答案:

答案 0 :(得分:13)

你应该使用which='LM':在shift-invert模式下,这个参数指的是变换后的特征值。 (如the documentation中所述。)