【问题标题】:Scipy's sparse eigsh() for small eigenvalues用于小特征值的 Scipy 稀疏 eigsh()
【发布时间】:2012-08-20 23:52:43
【问题描述】:

我正在尝试使用 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 是完全奇异的

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

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

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

【问题讨论】:

    标签: python scipy cluster-analysis linear-algebra sparse-matrix


    【解决方案1】:

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

    【讨论】:

    • 对,但问题是我想要最小的特征值及其相关的特征向量,而不是最大的。文档解释说,如果需要小的特征值,应该使用移位反转模式来提高性能,这是我试图通过使用 sigma 来做的,但无济于事。
    • 上面应该给你你想要的。注意:当 sigma=0 时,转换后的特征值为 w'=1/(w-sigma)=1/w。因此,使用which='LM',您可以获得具有较大 w' 的特征值,或者换句话说,原始问题的最小特征值。如果使用 shift-invert 模式,还需要相应地调整 which 参数。
    • 只是想说这非常有帮助
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2013-09-25
    • 2017-08-14
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多