У меня плотная вещественная симметричная квадратная матрица. Размер составляет около 1000x1000. Мне нужно вычислить первый главный компонент и подумать, каким может быть лучший алгоритм для этого.
Похоже, что MATLAB использует алгоритмы Арнольди / Ланцоша (для eigs
). Но читая о них, я не уверен, есть ли у них какие-либо преимущества перед простой степенной итерацией , поскольку моя матрица не разрежена, и меня интересует только первый собственный вектор.
Любые рекомендации, какой алгоритм в этом случае самый быстрый?
linear-algebra
algorithms
eigensystem
Мика Фишер
источник
источник
Ответы:
Самый быстрый метод, вероятно, будет зависеть от спектра и нормальности вашей матрицы, но во всех случаях алгоритмы Крылова должны быть строго лучше, чем степенная итерация. У Г. В. Стюарта есть хорошее обсуждение этого вопроса в Главе 4, Раздел 3 Матричных Алгоритмов, Том II: Eigensystems :
источник
Степенная итерация является самой простой, но, как упоминалось выше, она, вероятно, будет сходиться очень медленно, если матрица будет очень ненормальной. Вы получаете явление «горба», когда последовательность, по-видимому, расходится на протяжении многих итераций, прежде чем начнется асимптотическое поведение.
Поскольку ваша матрица симметрична, вы можете рассмотреть итерации RQI, что в симметричном случае дает кубическую сходимость: http://en.wikipedia.org/wiki/Rayleigh_quotient_iteration .
Что делает итерации Арнольди или Ланцоша очень хорошими (по крайней мере, на мой взгляд, но я не исследую числовую линейную алгебру), так это то, что они очень универсальны. Обычно можно контролировать, какие собственные значения они вам дают и сколько вы получаете. Это особенно верно в симметричном случае (и даже лучше, если ваша матрица определена). Для симметричных задач они очень устойчивы. Как черный ящик они работают хорошо, но они также очень восприимчивы к новой проблемной информации, такой как способность решать системы, включающие матрицу.
источник