Ответ 1
Просто играйте с небольшими номерами, чтобы отладить вашу проблему.
Начните с A=np.random.randn(3,2)
вместо вашей гораздо большей матрицы с размером (50,20)
В моем случайном случае я обнаружил, что
v1 = array([[-0.33872745, 0.94088454],
[-0.94088454, -0.33872745]])
и для v2
:
v2 = array([[ 0.33872745, -0.94088454],
[ 0.94088454, 0.33872745]])
они различаются только для знака и, очевидно, даже если нормализовать единичный модуль, вектор может отличаться для знака.
Теперь, если вы попробуете трюк
assert np.all(np.isclose(V1,-1*V2))
для вашей оригинальной большой матрицы, он терпит неудачу... снова, все в порядке. Случается, что некоторые векторы умножаются на -1
, другие - нет.
Правильный способ проверки равенства между векторами:
assert allclose(abs((V1*V2).sum(0)),1.)
и действительно, чтобы понять, как это работает, вы можете напечатать это количество:
(V1*V2).sum(0)
который действительно равен либо +1
, либо -1
в зависимости от вектора:
array([ 1., -1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1., -1., 1., 1., 1., -1., -1.])
EDIT: Это произойдет в большинстве случаев, особенно если начать с случайной матрицы. Обратите внимание, однако, что этот тест, скорее всего, не сработает, если одно или несколько собственных значений имеют собственное пространство размером больше, чем 1
, как указано @Sven Marnach в его комментарии ниже:
Могут быть другие отличия, чем просто векторы, умноженные на -1. Если какое-либо из собственных значений имеет многомерное собственное пространство, вы может получить произвольный ортонормированный базис этого собственного пространства и такие базы могут быть повернуты друг к другу с помощью арбитража унитарная матрица