это подходящий способ для вычисления собственного разложения с помощью этой команды `np.linalg.eig (H * H)`? - PullRequest
3 голосов
/ 24 июня 2019

Я изучаю этот пост и этот пост .

Я пытаюсь воспроизвести вычисление как сообщение с Python, NumPy.

H = np.array([[0.1, 0.3, .4],[0.5 , 0.5, 0.9],[0.1, 0.4, 0.5]])
u, s, vh = np.linalg.svd(H)
w, v = np.linalg.eig(H*H)

np.linalg.eig(H*H) дает совсем другой результат из этого поста .

почему это?

1 Ответ

0 голосов
/ 24 июня 2019

Есть две проблемы.Во-первых, вы не транспонируете множитель.Во-вторых, вы используете поэлементное умножение вместо матричного умножения.

Вот как вы можете исправить обе проблемы:

In [18]: np.linalg.eig(np.matmul(H, H.T))
Out[18]:
(array([1.94501343e+00, 1.14315435e-05, 4.49751401e-02]),
 array([[-0.35979589, -0.82953709,  0.42710084],
        [-0.81600749,  0.05780546, -0.57514373],
        [-0.4524143 ,  0.55545183,  0.69770664]]))

В качестве альтернативы, вы можете использовать np.matrix, чтобы сделать * выполнить умножение матриц:

In [22]: H = np.matrix([[0.1, 0.3, .4],[0.5 , 0.5, 0.9],[0.1, 0.4, 0.5]])

In [23]: np.linalg.eig(H*H.T)
Out[23]:
(array([1.94501343e+00, 1.14315435e-05, 4.49751401e-02]),
 matrix([[-0.35979589, -0.82953709,  0.42710084],
         [-0.81600749,  0.05780546, -0.57514373],
         [-0.4524143 ,  0.55545183,  0.69770664]]))

Если матрица содержит комплексные числа, вы должны использовать сопряженное транспонирование (.H) вместо транспонирования (.T).Я решил не делать этого, чтобы избежать путаницы в обозначениях (H*H.H).

...