【问题标题】:positive semi-definite matrices and numerical stability?半正定矩阵和数值稳定性?
【发布时间】:2010-01-22 08:11:45
【问题描述】:

我正在尝试对共现矩阵 (C) 进行因子分析,该矩阵是根据术语文档矩阵 (TD) 计算得出的,如下所示: C=TD*TD'

理论上 C 应该是半正定的,但事实并非如此,因此因子分析算法无法使用它。由于速度原因,我无法更改算法)。

我查了一下,可能是数值稳定性问题: A simple algorithm for generating positive-semidefinite matrices - 回答 2。

这里有什么好方法?

【问题讨论】:

  • 根据定义 A*A' 始终是 pos semi-def.. 您在执行因子分析时遇到的确切错误是什么?

标签: math matrix numerical-methods numerical-stability


【解决方案1】:

我会对矩阵进行特征分解:

C=Q D Q^-1

如果你的矩阵真的是半正定的,那么所有的特征值(D 的对角线上的元素)都应该是非负的。 (这可能是您的因子分析算法也在做的测试,以查看矩阵是否为半正定矩阵。)

如果您遇到数值问题,一些特征值可能会略小于零。尝试将这些条目设置为零,计算 Q D Q^-1 以获得新的更正 C,然后将其提交给您的因子分析算法。

另一方面,如果你发现你的矩阵 C 具有真正的负特征值,那么你就知道你在 C 的构造中的某个地方出错了。

【讨论】:

  • 谢谢。特征值需要多小才能被视为数值错误?我得到 -9e-15 到 -1e-32 之间的负值。
  • 那肯定在数值误差范围内。您可以访问因子分析程序的源代码吗?很可能它本身正在进行特征分解——在这种情况下,您可以简单地修改代码以允许略微负的特征值。否则,请使用我上面建议的方法——但请注意,再次将Q D Q^-1 相乘后,您可能会得到新的数值错误,使您的特征值再次略低于零。在这种情况下,您可以尝试的一件事是使特征值略微为正而不是完全为零。
  • 我在这里有点晚了,但我想我会发表评论。您需要小心计算 C 的特征分解,因为在形成 C 时,您将 TD 的条件数加倍,这可能导致数值不稳定。考虑到这一点,我会查看 TD 的条件编号。可能是在形成这些矩阵的时候,条件很差,导致形成和使用C的时候结果很差。
【解决方案2】:

无法评论,我将不得不回应 SplittingField 的评论,挑剔形成 C=TD*TD' 平方 TD的条件数,而不是加倍。与找到 C 的特征分解等效且更稳定的是对 TD 执行奇异值分解 (SVD)。你得到条件数作为奖励:最大奇异值与最小奇异值的比率是矩阵的条件数,它的以 10 为底的对数是对你失去多少小数位数的估计您在计算中使用了 C(当然,如果最小的奇异值为 0,那么您的问题就是奇异的!)

【讨论】:

  • 更不用说执行因子分解完全等于在 TD 上执行 SVD!关于TD TD^t的坏状态数的优点。
【解决方案3】:

首先,有一些技术可以修复具有负特征值的矩阵的“病态”——回想一下,矩阵起源于一系列计算,通常这些步骤首先导致了病态。接受这样一个事实是不合适的,因为矩阵具有小的、接近零的负特征值,所以它是一个“坏”矩阵。相反,做一些修复病理的工作。关于 SVD,我同意它是更好的方法之一——但是,我在工作中并不经常使用它,因为它的计算成本太高了。但是,如果您有一个或多个为零的矩阵元素,即矩阵是稀疏的,那么您必须使用 SVD,因为它将是唯一可行的方法之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2017-08-31
    • 1970-01-01
    • 2022-10-21
    • 2013-03-08
    相关资源
    最近更新 更多