【问题标题】:X X^T Matrix is not positive definite, although it should beX X^T 矩阵不是正定的,虽然它应该是
【发布时间】:2019-09-22 09:42:13
【问题描述】:

我有一个矩阵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)

【问题讨论】:

  • 我真的不知道确切的答案,但鉴于所有负值都非常小,我强烈怀疑这与数值舍入问题有关。
  • 最小特征值为(-284.69064+0j)
  • 你能在问题中添加一个示例矩阵吗?您显示的所有负特征值都非常小,我在尝试使用np.random.randn(630,512) 生成的随机数组时得到了相同的结果。
  • @user545424 编辑很大而且有问题,但这里是文件 - drive.google.com/file/d/15YSKCDIohJYrBXMw8pFiVXaOa2qYRZ07/…,可以使用 np.load 加载
  • 如果你能用易于创建的东西(即使用 np.random 或其他东西)重现它,那就太好了。对你的问题的简短回答是,如果你知道你的矩阵是对称的,你应该使用np.eigh

标签: numpy linear-algebra


【解决方案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 的理论值都不会被 eigeigh 精确计算。前 167 个特征值将接近为零,并且数值错误可能导致其中一些值为负数。当我对一个随机的M(具体为M = np.random.gamma(8, size=(679, 512)))进行计算时,MM^T的最大特征值约为2.227e7,最小为-5.822e-10,最小幅度为3.881e-13。注意5.822 e-10/2.227e7(即np.abs(v.min()) / v.max())约为 2.61e-17,因此所有这些小特征值实际上都为 0相对于最大特征值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多