6

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

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

我查了一下,这可能是一个数值稳定性问题: 一种用于生成半正定矩阵的简单算法 - 答案 2。

在这里进行的好方法是什么?

4

3 回答 3

8

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

C=Q D Q^-1

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

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

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

于 2010-01-22T08:31:38.897 回答
5

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

于 2010-08-09T06:29:37.833 回答
2

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

于 2011-08-28T15:51:11.517 回答