Симметрия матрицы автоковариации путем умножения матрицы признаков на ее транспонирование
Существует математическая теорема о том, что матрица А, умноженная на ее транспонирование, дает симметричную положительно определенную матрицу (что приводит к положительным собственным значениям). Почему тест симметрии не проходит здесь для случайных матриц среднего размера? Это всегда работает для маленьких матриц (20,20 и т. Д.)
import numpy as np
features = np.random.random((50,70))
autocovar = np.dot(np.transpose(features),features)
print((np.transpose(autocovar) == autocovar).all())
Я всегда получаю "ЛОЖЬ" при запуске этого кода. Что я делаю не так? Мне нужна матрица автоковариации для выполнения PCA, но пока я получаю сложные собственные значения...
Спасибо!
1 ответ
Это может быть связано с ошибками в арифметике с плавающей запятой. Ваша матрица может быть очень близка к симметричной матрице численно, но из-за ошибок в арифметике конечной точности она технически несимметрична. В результате числовой решатель может возвращать сложные собственные значения.
Одно из решений (своего рода взлом) состоит в том, чтобы симметризовать матрицу, т. Е. Заменить ее симметричной частью. Эта матрица гарантированно будет симметричной даже в арифметике с плавающей запятой, и она будет очень близка к определяемой вами матрице (около точности машины). Это может быть достигнуто через
autocovar_sym = .5*(autocovar+autocovar.T)
Надеюсь это поможет.