2016-05-25 10 views
0

Существует математическая теорема, в которой утверждается, что матрица A, умноженная на ее транспонирование, дает симметричную положительно определенную матрицу (что приводит к положительным собственным значениям). Почему тест симметричности здесь не выполняется для матриц среднего размера? Это всегда работает для небольших матриц (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()) 

Я всегда получаю «FALSE» работает этот код. Что я делаю неправильно? Мне нужна матрица автоковариации для выполнения СПС, но до сих пор я получаю сложные собственные значения ...

Спасибо!

ответ

0

Это может быть связано с ошибками в арифметике с плавающей запятой. Ваша матрица может быть очень близка к симметричной матрице численно, но из-за ошибок в арифметике с конечной точностью она технически несимметрична. В результате численный решатель может возвращать сложные собственные значения.

Одним из решений (вроде взлома) является симметризация матрицы, т. Е. Ее замена symmetric part. Эта матрица гарантированно будет симметричной, даже в арифметике с плавающей запятой, и она будет очень близка к определяемой вами матрице (около точности машины). Этого можно достичь с помощью

autocovar_sym = .5*(autocovar+autocovar.T) 

Надеюсь, это поможет.

+0

Большое спасибо! Это прекрасно работает. В то же время у меня возникла идея использовать: 'autocovar = np.round (np.dot (np.transpose (features), features), 3)' , который дает тот же результат. Спасибо! – dopexxx

+0

Без проблем! Я попробовал ваш код, и он прошел тест на симметрию. Но это намного больше, чем исходная матрица, поэтому я буду осторожен. Чтобы быть более точным, если 'X' является исходной, несимметричной, но численно-симметричной матрицей,' X1' определяется как в моем ответе, так и 'X2', как в вашем ответе,' np.linalg.norm (X-X1, 'fro ') 'и' np.linalg.norm (X-X2,' fro ') 'совершенно разные. Первый имеет точность до 12 цифр, в то время как последний едва получает одну цифру. Просто предупреждение. –

+0

Спасибо, что позволил мне теперь, что я совершенно новый для Python и машинного обучения вообще! :) – dopexxx