Math 半正定矩阵与数值稳定性?

Math 半正定矩阵与数值稳定性?,math,matrix,numerical-methods,numerical-stability,Math,Matrix,Numerical Methods,Numerical Stability,我试图对共现矩阵(C)进行因子分析,共现矩阵(C)由术语文档矩阵(TD)计算得出,如下所示: C=TD*TD' 理论上,C应该是半正定的,但它不是半正定的,因此因子分析算法不能使用它。由于速度原因,我不能更改算法) 我查了一下,这可能是一个数值稳定性问题: -答复2 在这里进行的好方法是什么 我将对矩阵进行特征分解: C=Q D Q^-1 如果你的矩阵真的是半正定的,那么所有的特征值(D对角线上的条目)都应该是非负的。(这可能是您的因子分析算法正在进行的测试,以查看矩阵是否为半正定矩阵。) 如

我试图对共现矩阵(C)进行因子分析,共现矩阵(C)由术语文档矩阵(TD)计算得出,如下所示: C=TD*TD'

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

我查了一下,这可能是一个数值稳定性问题: -答复2


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

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

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

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


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

无法评论,我将不得不回应SplittingField的评论,吹毛求疵地说,形成C=TD*TD'平方TD的条件数,而不是它的两倍。在TD上执行奇异值分解(SVD)是找到C的特征分解的等价方法,也是更稳定的方法。你得到了条件数作为奖励:最大奇异值与最小奇异值的比率是矩阵的条件数,其以10为底的对数是一个估计,如果你在计算中使用C,你将损失多少十进制数字(当然,如果最小的奇异值是0,那么您的问题就是奇异的!)

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

谢谢。特征值需要多小才能被视为数值误差?我得到-9e-15到-1e-32之间的负值。这肯定在数值误差范围内。你有权访问因子分析例程的源代码吗?很可能它正在进行特征分解假设本身——在这种情况下,您可以简单地修改代码以允许略微负的特征值。否则,使用我上面建议的方法——但要注意,在将
qdq^-1
再次相乘之后,您可能会得到新的数值错误,使特征值再次略低于零。在这种情况下,您可以尝试的一件事是to使特征值略微为正,而不是完全为零。我在这里发言有点晚,但我想我会发表一点意见。你需要仔细计算C的特征分解,因为在形成C时,你是TD条件数的两倍,这可能会导致数值不稳定。考虑到这一点,我将d看看TD的条件数。可能是在形成这些矩阵时,它们的条件非常恶劣,导致形成和使用C时的结果很差。根据定义
A*A'
始终是pos-semi-def。因子分析实现的确切错误是什么?更不用说执行因子分解exa实际上相当于在TD上执行SVD!关于TD^t的坏条件数,这是一个很好的观点。