2013-09-09 6 views
4

Я видел this вопрос, и это имеет отношение к моей попытке вычислить доминирующий собственный вектор в Python с numPy.Неожиданные собственные векторы в numPy

Я пытаюсь вычислить доминирующий собственный вектор n x n-матрицы без необходимости попадания в слишком большую тяжелую линейную алгебру. Я сделал поверхностные исследования детерминант, собственных значений, собственных векторов и характеристических многочленов, но я предпочел бы полагаться на реализацию numPy для нахождения собственных значений, поскольку я считаю, что он более эффективен, чем мой собственный.

Проблема я столкнулся в том, что я использовал этот код:

markov = array([[0.8,0.2],[.1,.9]]) 

    print eig(markov) 

... как испытание, и получил этот результат:

(array([ 0.7, 1. ]), array([[-0.89442719, -0.70710678], 
      [ 0.4472136 , -0.70710678]])) 

Что касается меня о том, что самая Перрона-Фробениуса, все компоненты второго собственного вектора должны быть положительными (так как, согласно Википедии, «реальная квадратная матрица с положительными элементами имеет единственное наибольшее вещественное собственное значение и что соответствующий собственный вектор имеет строго положительные компоненты»).

Кто-нибудь знает, что здесь происходит? Незначительно ли numPy? Я нашел несоответствие в ZFC? Или это только я, будучи нубом в линейной алгебре, Python, numPy или какой-то комбинации из трех?

Спасибо за любую помощь, которую вы можете предоставить. Кроме того, это мой первый вопрос SO (обычно я был активен на cstheory.se), поэтому любые советы по улучшению ясности моего вопроса также будут оценены.

+0

И только так вы знаете мою мотивацию, я заинтересован в собственных векторов центральности. –

+4

Если v - собственный вектор, то -v также является собственным вектором, поэтому общий знак не имеет значения. Важно то, что все компоненты вектора имеют один и тот же знак, который они делают для самого большого собственного значения, как и ожидалось. –

ответ

7

Вы просто неверно интерпретируете eig 's return. Согласно документации, второй обратный аргумент

Нормированная (единица «длина») собственные векторы, такие, что столбец V [:, I] является собственный вектор, соответствующий собственному значению ш [I].

Таким образом, собственный вектор, соответствующий собственному значению 1 не [ 0.4472136 , -0.70710678], но [-0.70710678, -0.70710678], как можно легко проверить:

>>> markov.dot([ 0.4472136 , -0.70710678]) # not an eigenvector 
array([ 0.21634952, -0.59167474]) 
>>> markov.dot([-0.70710678, -0.70710678]) # an eigenvector 
array([-0.70710678, -0.70710678]) 
Смежные вопросы