Найдите один собственный вектор

Предположим, у меня есть действительно большая (симметричная) матрица M размера N на N, и я просто хочу извлечь один собственный вектор, соответствующий одному собственному значению. Есть ли способ сделать это, не находя все собственные векторы. Я придумал один из способов сделать это: сначала найти собственные значения (что быстро), а затем решить для одного собственного вектора.

E = np.linalg.eigvalsh(M)
e = E[N/2]
v = np.linalg.solve(E-np.diag([e]*N), 0)

Но, конечно, вы можете догадаться, что решение этого просто v = 0. Я мог бы выполнить SVD-разложение M-eI, но мне кажется, что это медленнее, чем просто вычисление всех собственных векторов M.


person Ben    schedule 26.06.2015    source источник
comment
IIRC, shift-qr - это алгоритм, который может это сделать. docs.scipy.org/ doc/scipy-0.15.1/reference/generated/. Аргумент sigma может представлять особый интерес. Обратите внимание, что это разреженная версия linalg. Я не уверен, реализован ли алгоритм shift-qr в обычном модуле linalg.   -  person cel    schedule 26.06.2015
comment
Sigma была именно тем параметром, который я искал. Спасибо @cel!   -  person Ben    schedule 27.06.2015


Ответы (1)


Вы можете использовать

from scipy.sparse.linalg import eigs

Взгляните на строку документации — там есть параметр k, который задает количество вычисляемых собственных значений и векторов. Если я правильно помню, это делается по итеративной схеме от ARPACK. Поэтому убедитесь, что вы установили tol в подходящее значение для вашего приложения.

person eickenberg    schedule 27.06.2015
comment
Благодарю за ваш ответ. Я думаю, что это отвечает на вопрос, как найти собственный вектор сверху (снизу?) спектра. Меня интересовало, как найти собственный вектор, соответствующий любому собственному значению. - person Ben; 27.06.2015
comment
А, да, хорошая мысль, я неправильно понял. Типичным алгоритмом для этого является метод обратной мощности. Не следует применять наивно, потому что ваша матрица большая. Но небольшое гугление показывает, что первый комментарий к исходному сообщению, вероятно, является правильным. - person eickenberg; 27.06.2015
comment
Прохладный. Мой плохой, так как мой вопрос был сформулирован немного неточно. Я ценю помощь. - person Ben; 28.06.2015