【问题标题】:Parallel exact matrix diagonalization with Python使用 Python 进行并行精确矩阵对角化
【发布时间】:2014-09-20 04:34:44
【问题描述】:

是否有人知道并行精确矩阵对角化(等效地,找到特征系统)的实现版本(可能使用 scipy/numpy)?如果有帮助,我的矩阵是对称且稀疏的。我不想花一天时间重新发明轮子。

编辑:

我的矩阵至少为 10,000x10,000(但最好至少大 20 倍)。目前,我只能使用 4 核 Intel 机器(具有超线程,因此每个核心有 2 个进程),每个 3.0Ghz 有 12GB 的 RAM。我以后可能可以访问一个 128 核节点 ~3.6Ghz/core 和 256GB RAM,所以单机/多核应该这样做(对于我的其他并行任务,我一直在使用 multiprocessing)。我希望算法能够很好地扩展。

我确实需要精确的对角化,所以scipy.sparse 例程对我不利(尝试过,效果不佳)。我一直在使用numpy.linalg.eigh(我看到只有单核在做所有的计算)。

或者(针对原始问题):是否有在线资源可以让我找到更多关于编译 SciPy 以确保并行执行的信息?

【问题讨论】:

  • 我刚注意到投了反对票。也许可以就如何改进问题或下次避免什么给出一个理由和建议?
  • 对角化是什么意思?如果对角线上的条目是非理性的并且不能用根来表示,那么您期望什么作为“精确”答案?
  • @Alexey 的帖子可能太旧了,没有兴趣,但“精确”对角化与备用矩阵方法形成对比......例如共轭梯度迭代方法,其中仅以迭代方式计算所需的最低特征值/向量。较高的特征值/向量可能相当不准确。精确对角化返回所有“精确”特征值/向量,但缩放比例很差;迭代方法可以更好地扩展,但在某种意义上显然是“近似的”。

标签: python numpy scipy linear-algebra numerical-methods


【解决方案1】:

对于对称稀疏矩阵特征值/特征向量的查找,您可以使用scipy.sparse.linalg.eigsh。它在幕后使用 ARPACK,并且有并行的 ARPACK 实现。 AFAIK,如果您的 scipy 安装使用串行版本,则可以使用一个编译 SciPy。

但是,如果您需要矩阵的所有特征值和特征向量,这不是一个好的答案,因为稀疏版本使用的是 Lanczos 算法。

如果您的矩阵不是非常大,那么只需使用numpy.linalg.eigh。它使用 LAPACK 或 BLAS,并且可能在内部使用并行代码。

如果您最终自己动手,请注意,SciPy/NumPy 使用不同的高度优化的线性代数包完成所有繁重的工作,而不是在纯 Python 中。因此,性能和并行度在很大程度上取决于编译 SciPy/NumPy 安装时使用的库。

(您的问题并未揭示您是否只想在多个处理器或多台计算机上运行并行代码。此外,矩阵的大小对最佳方法有很大影响。所以,这个答案可能完全不合格。)

【讨论】:

  • 我接受了你的回答,因为你提供了一些想法,结果证明是富有成效的。显然,针对 OpenBLAS 编译(或等效地,通过 pip 安装)SciPy 和 NumPy 可以解决问题,因为 OpenBLAS 自动使用多线程。
猜你喜欢
  • 2018-03-02
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多