Численное умножение матричных U * B * UT Результаты в несимметричной матрице

В моей программе мне нужно следующее умножение матрицы:

A = U * B * U^T 

где B – симметричная матрица M * M , а U – матрица N * M где ее столбцы ортонормированы. Поэтому я ожидал бы, что A также является симметричной матрицей.

Однако Python этого не говорит.

 import numpy as np import pymc.gp.incomplete_chol as pyichol np.random.seed(10) # Create symmetric matrix B b = np.matrix(np.random.randn(20).reshape((5,4))) B = b * bT np.all(B== BT) 

И B действительно симметричен:

 In[37]: np.all(B== BT) Out[37]: True # Create U m = np.matrix(np.random.random(100).reshape(10,10)) M = m * mT # M U, s, V = np.linalg.svd(M) U = U[:, :5] UT * U In[41]: UT * U Out[41]: matrix([[ 1.00000000e+00, 0.00000000e+00, -2.77555756e-17, -1.04083409e-17, -1.38777878e-17], [ 0.00000000e+00, 1.00000000e+00, -5.13478149e-16, -7.11236625e-17, 1.11022302e-16], [ -2.77555756e-17, -5.13478149e-16, 1.00000000e+00, -1.21430643e-16, -2.77555756e-16], [ -1.04083409e-17, -7.11236625e-17, -1.21430643e-16, 1.00000000e+00, -3.53883589e-16], [ 0.00000000e+00, 9.02056208e-17, -2.63677968e-16, -3.22658567e-16, 1.00000000e+00]]) 

Таким образом, U , матрица 10 * 5, действительно ортонормирована, за исключением того, что числовое округление вызывает не точно идентичность.

 # Construct A A = U * B * UT np.all(A == AT) In[38]: np.all(A == AT) Out[38]: False 

A не является симметричной матрицей.

Кроме того, я проверил np.all(UT*U == (UT*U).T) будет False .

Является ли это причиной того, что моя матрица A не симметрична? Другими словами, это числовая проблема, которую нельзя избежать?

На практике, как избежать такой проблемы и получить симметричную матрицу A ?

Я использовал трюк A = (A + AT)/2 чтобы заставить его быть симметричным. Это хороший способ обойти эту проблему?

    One Solution collect form web for “Численное умножение матричных U * B * UT Результаты в несимметричной матрице”

    Вы заметили, что So U, a 10*5 matrix, is indeed orthonormal except numerical rounding causes not exactly identity.

    Те же рассуждения применимы к A – они симметричны, за исключением численного округления:

     In [176]: A=np.dot(U,np.dot(B,UT)) In [177]: np.allclose(A,AT) Out[177]: True In [178]: AA.T Out[178]: array([[ 0.00000000e+00, -2.22044605e-16, 1.38777878e-16, 5.55111512e-17, -2.49800181e-16, 0.00000000e+00, 0.00000000e+00, -1.11022302e-16, -1.11022302e-16, 0.00000000e+00], ... [ 0.00000000e+00, 0.00000000e+00, 1.11022302e-16, 2.77555756e-17, -1.11022302e-16, 4.44089210e-16, -2.22044605e-16, -2.22044605e-16, 0.00000000e+00, 0.00000000e+00]]) 

    При сравнении массивов float я использую np.allclose .

    Я также предпочитаю ndarray и np.dot над np.matrix потому что умножение элементов по элементам так же распространено, как и матричное умножение.

    Если остальная часть кода зависит от того, что A является symmtric, тогда ваш трюк может быть хорошим выбором. Это не дорого дорого.

    По какой-то причине einsum избегает числовых проблем:

     In [189]: A1=np.einsum('ij,jk,lk',U,B,U) In [190]: A1-A1.T Out[190]: array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) In [193]: np.allclose(A,A1) Out[193]: True 
     
    Interesting Posts for Van-Lav

    Простой пример использования wx.TextCtrl и отображения данных после нажатия кнопки в wxpython – новый для wx

    Python PIL «IOError: файл изображения усечен» с большими изображениями

    Pandas печать ВСЕ типы

    sys.stdout.write в python3 добавляет 11 в конец строки

    Сжать массив numpy (матрица), удалив столбцы с помощью другого массива numpy в качестве маски

    «Localhost» против «127.0.0.1»

    вопрос о дескрипторе файла python

    Как загрузить файл .ttf в matplotlib с помощью mpl.rcParams?

    Выполнение `из abc import xyz`, где идет модуль` abc`?

    Блокировать запросы от * .appspot.com и принудительно настраивать собственный домен в Google App Engine

    TypeError: worker () принимает 0 позиционных аргументов, но 1 дано

    Django перенаправляет на пользовательский URL-адрес

    Python Tkinter: AttributeError: экземпляр Checkbutton не имеет атрибута 'get'

    Как импортировать файлы в python с помощью sys.path.append?

    Переопределение декоратора во время модульного теста на питоне

    Python - лучший язык программирования в мире.