X X^T 矩阵不是正定的,尽管它应该是
X X^T Matrix is not positive definite, although it should be
我有一个矩阵 M
,其中 M.shape = (679, 512)
。
求M M^T
的特征向量和特征值,是协方差矩阵,数学上应该是正定的。我发现他们使用:
import numpy as np
v, w = np.linalg.eig(np.matmul(M, M.T))
但是,出于某种原因,我将 eigenvalues/eigenvectors 视为:
>>> 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)
"Shouldn't M M^T be positive semi definite, giving positive and real eigenvalues only?" 如果将 "positive" 更改为 "nonnegative",那么是的,这在数学上是正确的。事实上,而不是 numpy.linalg.eig
, you can use numpy.linalg.eigh
,它将 return 实特征值和特征向量。
请注意,在一些地方,您错误地陈述了这一说法,并说 M M^T 是正定的。那是不正确的。如果 M 的形状为 (679, 512),则 679 - 512 = 167 个特征值将为 0; M M^T 是半定的,不是positive definite.
在特征值的数值计算中,所有0的理论值都不会被eig
或eigh
准确计算出来。前 167 个特征值将 接近 为零,数值错误可能导致其中一些值为负。当我对一个随机的M(具体来说,M = np.random.gamma(8, size=(679, 512))
)进行计算时,M 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 相对于最大特征值.
我有一个矩阵 M
,其中 M.shape = (679, 512)
。
求M M^T
的特征向量和特征值,是协方差矩阵,数学上应该是正定的。我发现他们使用:
import numpy as np
v, w = np.linalg.eig(np.matmul(M, M.T))
但是,出于某种原因,我将 eigenvalues/eigenvectors 视为:
>>> 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)
"Shouldn't M M^T be positive semi definite, giving positive and real eigenvalues only?" 如果将 "positive" 更改为 "nonnegative",那么是的,这在数学上是正确的。事实上,而不是 numpy.linalg.eig
, you can use numpy.linalg.eigh
,它将 return 实特征值和特征向量。
请注意,在一些地方,您错误地陈述了这一说法,并说 M M^T 是正定的。那是不正确的。如果 M 的形状为 (679, 512),则 679 - 512 = 167 个特征值将为 0; M M^T 是半定的,不是positive definite.
在特征值的数值计算中,所有0的理论值都不会被eig
或eigh
准确计算出来。前 167 个特征值将 接近 为零,数值错误可能导致其中一些值为负。当我对一个随机的M(具体来说,M = np.random.gamma(8, size=(679, 512))
)进行计算时,M 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 相对于最大特征值.