【问题标题】:Can we calculate only the n-th eigenvalue and eigenvector of a very large sparse matrix?我们可以只计算一个非常大的稀疏矩阵的第 n 个特征值和特征向量吗?
【发布时间】:2019-04-25 12:38:56
【问题描述】:

我有一个非常大的稀疏矩阵 A = 7Mi-by-7Mi 矩阵。我正在使用 Matlab 的 eigs(A,k) 函数,它可以首先计算 k 特征值和向量。 我需要它的所有特征向量和值。但是我不能存储所有的特征向量,因为它需要大量的内存。

有什么方法(在 Matlab 或 Python 中)可以在 for 循环中一一获取特征向量?即在ith 迭代中,我得到ith 特征向量和值。

【问题讨论】:

  • 大多数(如果不是全部)计算特征值/向量的算法从最大到最小的特征值工作; MATLAB 的eigs() 确实做到了这一点。您必须找到一种不依赖于先前计算的特征值的算法,然后循环遍历。 (或者当然购买更多的内存)。此外,要求 7M 特征值听起来像 XY problem,如果您告诉我们您需要它们的用途,我们可能会告诉您根本不需要它们,但需要替代解决方案。
  • @Adriaan 在 eigs.m 文件中,使用的算法似乎是 Krylov-Schur。它真的需要所有先前计算的特征值来计算下一个或只计算一些吗?如果没有,可以按照此处的要求进行操作。
  • 我认为这是不可能的。特征值取决于整个矩阵,您需要整个矩阵来计算每个。如果你裁剪一条线,特征值就会改变。
  • 你看过numpy.linalg.eig()吗?也许您可以在您的问题中添加为什么这不是一种有前途的方法(问题应始终包含有关已经尝试过的事物以及它们失败的原因的信息)。
  • 我猜这里的诀窍是原始稀疏矩阵只适合内存,因为它太稀疏了。也许计算特征向量的所有中间步骤也只产生非常稀疏的矩阵,因此,如果你让算法使用相同的稀疏矩阵类型,你可以计算出内存中的所有特征向量吗?

标签: python algorithm matlab math eigenvalue


【解决方案1】:

如果您对要查找的特征值有多大有很好的猜测,比如 lambda_guess,您可以使用 Power iteration on

(A - lambda_guess* Id)^-1

这种方法有时被称为逆移位法。在这里,该方法将收敛到最接近 lambda_guess 的特征值(猜测越好,收敛越快)。请注意,您不会存储逆,而只计算解决方案

x_next_iter = solve(A - lambda_guess*Id, x_iter),可能本身带有迭代线性求解器。

我会将其与子空间至少大小为 2 的子空间迭代方法相结合。这样,在您的第一次迭代中,您可以找到最小和第二小的特征值lambda1, lambda2。

那你可以试试lambdaguess= lambda2+ epsilon,让输出的第一个和第二个特征向量分别对应第二个和第三个最小的特征值。(如果本次迭代的第一个特征值与你上一次迭代的lambda2的值不同, 您需要使 epsilon 更小并重复。在实践中,您将测试它们的差异是否足够小,以考虑舍入误差和迭代方法从不精确的事实)。你重复这个直到你得到你正在寻找的特征值数。它会很慢,但是您在任何时候都只会使用两个特征向量。

注意:我们假设所有特征值都是不同的,否则使用通常的技术,这个问题不会有低内存解决方案。一般来说,如果特征值的最大重数是m,则需要内存中的m 向量,以便子空间迭代收敛。

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 2015-11-18
    • 2014-10-30
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多