Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 矩阵不是正定的,尽管它应该是正定的_Numpy_Linear Algebra - Fatal编程技术网

Numpy 矩阵不是正定的,尽管它应该是正定的

Numpy 矩阵不是正定的,尽管它应该是正定的,numpy,linear-algebra,Numpy,Linear Algebra,我有一个矩阵M,其中M.shape=(679512) 我想找到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,

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

我想找到
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^t
不应该是半正定的,只给出正的和实的特征值吗?如何得到非实特征值

def is_positive_def(x):
    return np.all(np.linalg.eigvals(x) > 0)
“M^M不应该是半正定的,只给出正的和实的特征值吗?”如果你把“正的”改为“非负的”,那么是的,这在数学上是正确的。实际上,可以使用,而不是,它将返回实特征值和特征向量

请注意,在一些地方,您错误地陈述了该声明,并说M^T是正定的。这是不对的。若M有形状(679512),则679-512=167的特征值为0;M^T是半定的,不是


在特征值的数值计算中,
eig
eig
不会精确计算所有0的理论值。前167个特征值将接近零,数值误差可能导致其中一些值为负值。当我对一个随机M进行计算时(具体来说,
M=np.random.gamma(8,size=(679512))
,M^T的最大特征值约为2.227e7,最小的为-5.822e-10,最小的震级为3.881e-13。注意5.822e-10/2.227e7(即
np.abs(v.min())/v.max()
)大约是2.61e-17,所以所有这些小特征值相对于最大特征值实际上都是0。

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