У меня есть матрица 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)