X X ^ T矩阵不是正定的,尽管它应该是

时间:2019-05-03 20:25:01

标签: numpy linear-algebra

我有一个矩阵M,其中M.shape = (679, 512)

我想找到M M^T的特征向量和特征值,它是协方差矩阵,在数学上应为正定。我发现他们使用:

import numpy as np
v, w = np.linalg.eig(np.matmul(M, M.T))

但是,由于某种原因,我的特征值/特征向量为:

>>> v
array([ 1.17577206e+10+0.0000000e+00j,  1.05090161e+10+0.0000000e+00j,
        7.01098189e+09+0.0000000e+00j,  5.19451802e+09+0.0000000e+00j, 
    ...
    1.03985971e-12+0.0000000e+00j, -3.04194468e-13+6.9097571e-13j,
   -3.04194468e-13-6.9097571e-13j,  1.77363116e-13+0.0000000e+00j,
   -1.20885913e-13+0.0000000e+00j, -4.95627438e-14+0.0000000e+00j,
   -1.56456859e-16+0.0000000e+00j], dtype=complex64)

这怎么可能? M M^T不应该是正半确定的,仅给出正和实特征值吗?如何获得非真实特征值?

def is_positive_def(x):
    return np.all(np.linalg.eigvals(x) > 0)

1 个答案:

答案 0 :(得分:1)

“难道M M ^ T不应该是正半定值,仅给出正和实特征值吗?” 如果将“正”更改为“负”,那么在数学上是正确的。实际上,您可以使用numpy.linalg.eig代替numpy.linalg.eigh,它会返回真实的特征值和特征向量。

请注意,在某些地方,您错误地声明了该说法,并说M M ^ T是正定的。那是不对的。如果M的形状为(679,512),则特征值的679-512 = 167将为0; M M ^ T是半定值的,不是positive definite

在特征值的数值计算中,{0}或eig不会精确地计算所有那些理论值0。前167个特征值会 close 为零,并且数值误差可能会导致其中一些值为负。当我对随机M(特别是eigh进行计算时,MM ^ T的最大特征值约为2.227e7,最小的特征值为-5.822e-10,最小的振幅为3.881e-13。 5.822e-10 / 2.227e7(即M = np.random.gamma(8, size=(679, 512)))约为2.61e-17,因此所有这些小特征值实际上都相对于最大特征值是0