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