如何对大型稀疏对称矩阵进行对角化,以获得特征值和特征向量?

机器算法验证 算法 矩阵分解
2022-03-14 20:35:33

矩阵可能大到,最好的算法是什么,是否有一些易于编写程序的算法,是否有任何方便的软件包?2500×2500

4个回答

在这篇 NIPS 论文的第一个表中有对分解算法的调查

它列出了现代算法(带有已知实现的链接),包括Halko 等人的随机分解。,可以说是当今最先进的方法。

您要求提供方便的编程包,但没有说明您选择的平台或语言。假设它是:

  • Python:
    • 使用scipy进行核内分解(输入必须适合 RAM)
    • 使用gensim进行核内和核外稀疏分解(也支持增量分解更新)
  • 爪哇:
    • Mahout有几个可扩展的分解算法
    • LingPipe (in-core) 支持缺失输入值
  • C++
    • redsvd (in-core) 非常干净优雅,高效的实现
  • MATLAB
    • pca.m由 Mark Tygert 撰写,他是随机方法的合著者之一。

不过,您的问题并不是特别大,所以我想任何现有的包(使用迭代 Lanczos 算法)都可以,特征分解已经存在了一段时间。

我不太了解特征值或它们适用于什么,但 R 似乎为此目的有一个内置函数,名为eigen(). 在我的机器上计算 2500 * 2500 矩阵的特征值和特征向量大约需要 1 分钟。

> sampData <- runif(6250000, 0, 2)
> x <- matrix(sampData, ncol = 2500, byrow = TRUE)
> system.time(eigen(x))
   user  system elapsed 
  79.74    2.90   65.69 

这个问题也出现在Stack Overflow 上

2500x2500 不是什么大问题。即使不利用稀疏性,scipy.linalg 的 SVD 实现也能够在不到一分钟的时间内将其分解。有关更多详细信息,请参阅对相关问题的回答。

对于较大的问题,您将需要明确使用稀疏性。gensim项目可以帮助您解决适合单个计算机但不适合 RAM 的中等规模问题,并且mahout实现能够处理甚至不适合单个硬盘驱动器的稀疏矩阵。