我正在尝试计算与大型对称方形稀疏矩阵(最大30000x30000)的最小特征值相对应的少数(5-500)特征向量,其中小于0.1%的特征值为非零。
我目前正在Shift-invert模式(sigma = 0.0)中使用scipy.sparse.linalg.eigsh,我通过有关该主题的各种帖子发现这是首选的解决方案。但是,在大多数情况下,最多需要1小时才能解决该问题。另一方面,如果我要求最大的特征值(系统中的秒数),则该功能非常快,这是文档中所期望的。
由于我对工作中的Matlab更加熟悉,因此我尝试在Octave中解决问题,这在短短几秒钟(不到10秒)内使用eigs(sigma = 0)给出了相同的结果。由于我想对包括特征向量计算在内的算法进行参数扫描,因此在python中也要具有这种时间增益。
我首先更改了参数(尤其是公差),但是在时间尺度上并没有太大变化。
我在Windows上使用Anaconda,但尝试将scipy(这是一个很大的痛苦)使用的LAPACK / BLAS从mkl(默认为Anaconda)切换为OpenBlas(根据文档由Octave使用),但看不到更改性能。
我无法弄清楚所使用的ARPACK是否需要更改(以及如何更改)?
我将以下代码的测试用例上传到了以下Dropbox文件夹:https ://www.dropbox.com/sh/l6aa6izufzyzqr3/AABqij95hZOvRpnnjRaETQmka?dl =0
在Python中
import numpy as np
from scipy.sparse import csr_matrix, csc_matrix, linalg, load_npz
M = load_npz('M.npz')
evals, evecs = linalg.eigsh(M,k=6,sigma=0.0)
在八度音阶中:
M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
任何帮助都在申请中!
我根据评论和建议尝试了一些其他选项:
八度:
eigs(M,6,0)
和eigs(M,6,'sm')
给我相同的结果:
[1.8725e-05 1.0189e-05 7.5622e-06 7.5420e-07 -1.2239e-18 -2.5674e-16]
同时eigs(M,6,'sa',struct('tol',2))
收敛到
[1.0423 2.7604 6.1548 11.1310 18.0207 25.3933]
快得多,但是仅当公差值大于2时,否则它根本不会收敛,并且值有很大差异。
Python的:
eigsh(M,k=6,which='SA')
与eigsh(M,k=6,which='SM')
两个不收敛(ARPACK上没有收敛误差达到)。仅eigsh(M,k=6,sigma=0.0)
给出一些特征值(近一个小时后),这些特征值与最小特征值的倍频程不同(甚至找到另外一个小值):
[3.82923317e-17 3.32269886e-16 2.78039665e-10 7.54202273e-07 7.56251500e-06 1.01893934e-05]
如果公差足够高,我也会从中获得结果eigsh(M,k=6,which='SA',tol='1')
,该结果与其他获得的值相近
[4.28732218e-14 7.54194948e-07 7.56220703e-06 1.01889544e-05, 1.87247350e-05 2.02652719e-05]
再次使用不同数量的小特征值。计算时间仍然接近30分钟。尽管不同的很小的值可能是可以理解的,但由于它们可能表示0的倍数,所以不同的多重性使我感到困惑。
此外,SciPy和Octave似乎存在一些根本差异,但我无法弄清楚。