小编Spa*_*r23的帖子

寻找大稀疏矩阵的最小特征向量,在 SciPy 中比在 Octave 中慢 100 倍以上

我正在尝试计算几个 (5-500) 特征向量,这些特征向量对应于大型对称方形稀疏矩阵(高达 30000x30000)的最小特征值,其中非零值小于 0.1%。

我目前在 shift-invert 模式 (sigma=0.0) 下使用 scipy.sparse.linalg.eigsh,我通过有关该主题的各种帖子发现这是首选解决方案。但是,在大多数情况下,解决问题最多需要 1 小时。另一方面,如果我要求最大的特征值(在我的系统上为亚秒),则该函数非常快,这是文档中预期的。

由于我在工作中更熟悉 Matlab,所以我尝试在 Octave 中解决这个问题,使用 eigs (sigma=0) 在短短几秒钟内(低于 10 秒)给了我相同的结果。由于我想对包括特征向量计算在内的算法进行参数扫描,因此在 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)
Run Code Online (Sandbox Code Playgroud)

在八度:

M=dlmread('M.txt');
M=spconvert(M);
[evecs,evals] = eigs(M,6,0);
Run Code Online (Sandbox Code Playgroud)

任何帮助是appriciated !

我根据评论和建议尝试了一些其他选项:

Octave: eigs(M,6,0)eigs(M,6,'sm') …

python octave scipy sparse-matrix eigenvector

14
推荐指数
1
解决办法
1852
查看次数

标签 统计

eigenvector ×1

octave ×1

python ×1

scipy ×1

sparse-matrix ×1