我有一个矩阵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)
" m m m^t不应该是正确定的,只给出积极而真实的特征值吗?是的,这在数学上是正确的。实际上,您可以使用numpy.linalg.eigh
,而不是numpy.linalg.eig
,它将返回真正的特征值和特征向量。
请注意,在几个地方,您错误地说明了这一说法,并说M m^t是积极的。那是不正确的。如果M具有形状(679,512(,则特征值的679-512 = 167为0;m m^t是半明确的,不是正定的。
在特征值的数值计算中,所有0的理论值将不会由eig
或eigh
精确计算。第一个167特征值将是 close 零,而数值误差可能导致其中一些值为负。当我对随机M进行计算(具体来说,M = np.random.gamma(8, size=(679, 512))
时,M m m^t的最大特征值约为2.227e7,最小的是-5.822e-100,最小的幅度为3.881e-13。请注意,5.822e---10/2.227E7(即np.abs(v.min()) / v.max()
(约为2.61e-17,因此所有这些小特征值实际上相对于最大的特征值。。