X X ^ T Матрица не является положительно определенной, хотя она должна быть - PullRequest
1 голос
/ 03 мая 2019

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

1 Ответ

1 голос
/ 04 мая 2019

«Разве MM ^ T не должен быть положительным полуопределенным, давая только положительные и реальные собственные значения?» Если вы измените «положительный» на «неотрицательный», тогда да, это верно математически.Фактически вместо numpy.linalg.eig вы можете использовать numpy.linalg.eigh, который будет возвращать реальные собственные значения и собственные векторы.

Обратите внимание, что в некоторых местах выисказил это утверждение и сказал, что MM ^ T является положительно определенным.Это не правильно.Если М имеет форму (679, 512), то 679-512 = 167 собственных значений будет 0;MM ^ T является полуопределенным, а не положительно определенным .

При численном расчете собственных значений все эти теоретические значения 0 не будут точно вычисляться с помощью eig или eigh.Первые 167 собственных значений будут близки к нулю, и числовая ошибка может привести к тому, что некоторые из этих значений будут отрицательными.Когда я выполнял вычисление для случайного M (в частности, M = np.random.gamma(8, size=(679, 512)), наибольшее собственное значение MM ^ T составляло около 2,227e7, наименьшее было -5,822e-10, а наименьшее значение составляло 3,881e-13. Обратите внимание, что 5,822e-10 / 2.227e7 (то есть np.abs(v.min()) / v.max()) составляет около 2,61e-17, поэтому все эти малые собственные значения фактически равны 0 относительно наибольшего собственного значения .

...