使用Python进行并行精确矩阵对角化

1 投票
1 回答
3881 浏览
提问于 2025-04-18 15:06

有没有人知道有没有实现的版本(可能是用scipy/numpy)来进行并行的精确矩阵对角化(也就是找到特征值和特征向量)?如果有帮助的话,我的矩阵是对称的并且是稀疏的。我可不想花一天时间去重新发明轮子。

编辑:

我的矩阵至少是10,000x10,000的(但最好是大20倍以上)。目前,我只有一台4核的英特尔机器(支持超线程,所以每个核心可以运行2个进程),每个核心大约3.0Ghz,内存是12GB。以后我可能会有一台128核的机器,核心频率大约是3.6Ghz,内存256GB,所以单台机器多核心应该能满足我的需求(对于其他并行任务,我一直在使用multiprocessing)。我希望算法能够很好地扩展。

我确实需要精确的对角化,所以scipy.sparse的例程对我来说不太合适(试过,效果不好)。我一直在使用numpy.linalg.eigh(我看到只有一个核心在进行所有计算)。

另外(针对最初的问题):有没有在线资源可以让我了解如何编译SciPy,以确保能够进行并行执行?

1 个回答

1

如果你想找对称稀疏矩阵的特征值和特征向量,可以用 scipy.sparse.linalg.eigsh 这个工具。它背后用的是 ARPACK,另外还有并行的 ARPACK 实现。根据我所知,如果你的 SciPy 安装使用的是串行版本,那么可以编译成并行版本。

不过,如果你需要矩阵的所有特征值和特征向量,这个方法就不太合适,因为稀疏版本使用的是 Lanczos 算法。

如果你的矩阵不是特别大,那就直接用 numpy.linalg.eigh 吧。这个工具使用的是 LAPACK 或 BLAS,内部可能会用到并行代码。

如果你决定自己动手实现,请注意,SciPy 和 NumPy 都是依赖不同的高度优化的线性代数库来完成复杂的计算,而不是纯用 Python 写的。因此,性能和并行处理的能力很大程度上取决于你安装的 SciPy 或 NumPy 是用什么库编译的。

(你的问题没有说明你是想在几个处理器上运行并行代码,还是在几台电脑上运行。而且,矩阵的大小对选择最佳方法也有很大影响。所以,这个回答可能并不完全适合你的情况。)

撰写回答