我正在尝试对共现矩阵 (C) 进行因子分析,该矩阵是从术语文档矩阵 (TD) 计算得出的,如下所示: C=TD*TD'
理论上 C 应该是半正定的,但事实并非如此,因此因子分析算法无法使用它。由于速度原因,我无法更改算法)。
我查了一下,这可能是一个数值稳定性问题: 一种用于生成半正定矩阵的简单算法 - 答案 2。
在这里进行的好方法是什么?
我正在尝试对共现矩阵 (C) 进行因子分析,该矩阵是从术语文档矩阵 (TD) 计算得出的,如下所示: C=TD*TD'
理论上 C 应该是半正定的,但事实并非如此,因此因子分析算法无法使用它。由于速度原因,我无法更改算法)。
我查了一下,这可能是一个数值稳定性问题: 一种用于生成半正定矩阵的简单算法 - 答案 2。
在这里进行的好方法是什么?
我会对矩阵进行特征分解:
C=Q D Q^-1
如果您的矩阵确实是半正定的,那么所有特征值(D 的对角线上的条目)都应该是非负的。(这可能是您的因子分析算法正在执行的测试,以查看矩阵是否为半正定矩阵。)
如果您遇到数值问题,则某些特征值可能几乎不小于零。尝试将这些条目设置为零,计算Q D Q^-1
得到一个新的、更正的 C,然后将其提交给您的因子分析算法。
另一方面,如果你发现你的矩阵 C 具有真正的负特征值,那么你就知道你在构造 C 的某个地方出错了。
无法发表评论,我将不得不回应 SplittingField 的评论,形成 C=TD*TD'与TD的条件数相乘,而不是加倍。与找到 C 的特征分解等效且更稳定的方法是对 TD 执行奇异值分解 (SVD)。你得到条件数作为奖励:最大奇异值与最小奇异值的比率是矩阵的条件数,它的以 10 为底的对数是对你失去多少小数位数的估计您在计算中使用了 C(当然,如果最小的奇异值是 0,那么您的问题就是奇异的!)
首先,有一些技术可以修复具有负特征值的矩阵的“病态”——回想一下,矩阵起源于一系列计算,通常这些步骤首先导致了病态。接受这样一个事实是不合适的,因为矩阵具有小的、接近零的负特征值,所以它是一个“坏”矩阵。相反,做一些修复病理的工作。关于 SVD,我同意它是更好的方法之一——但是,我在工作中并不经常使用它,因为它的计算成本太高了。但是,如果您有一个或多个矩阵元素为零,即矩阵是稀疏的,那么您必须使用 SVD,因为它将是唯一可行的方法之一。