РЕДАКТИРОВАТЬ: я проверяю, если какие-либо собственные значения имеют величину один или больше.
Мне нужно найти наибольшее абсолютное собственное значение большой разреженной несимметричной матрицы.
Я использовал eigen()
функцию R , которая использует алгоритм QR из EISPACK или LAPACK, чтобы найти все собственные значения, а затем я использую, abs()
чтобы получить абсолютные значения. Однако мне нужно сделать это быстрее.
Я также попытался использовать интерфейс ARPACK в igraph
пакете R. Однако, это дало ошибку для одной из моих матриц.
Окончательная реализация должна быть доступна из R.
Вероятно, будет несколько собственных значений одинаковой величины.
У вас есть какие-нибудь предложения?
РЕДАКТИРОВАТЬ:
Точность только должна быть 1e-11
. «Типичная» матрица до сих пор была . Я был в состоянии сделать QR-факторизацию на нем. Тем не менее, также возможно иметь гораздо большие. В настоящее время я начинаю читать об алгоритме Арнольди. Я понимаю, что это связано с Lanczsos.
РЕДАКТИРОВАТЬ 2: Если у меня есть несколько матриц, которые я "тестирую", и я знаю, что есть большая подматрица, которая не меняется. Можно ли игнорировать / отменить это?
Ответы:
Это во многом зависит от размера вашей матрицы, в широком случае - также от того, является ли она разреженной, и от точности, которую вы хотите достичь.
Если ваша матрица слишком велика, чтобы допускать одну факторизацию, и вам нужна высокая точность, алгоритм Lanczsos, вероятно, самый быстрый способ. В несимметричном случае необходим алгоритм Арнольди, который численно нестабилен, поэтому реализация должна решить эту проблему (несколько неудобно излечивать).
Если это не относится к вашей проблеме, дайте более конкретную информацию в вашем вопросе. Затем добавьте комментарий к этому ответу, и я обновлю его.
Редактировать: [Это было для старой версии вопроса, asling для наибольшего собственного значения.] Поскольку ваша матрица мала и, по-видимому, плотная, я бы сделал итерацию Арнольди на B = (IA) ^ {- 1}, используя начальный Перестановочная треугольная факторизация IA для дешевого умножения на B. (Или вычисление явного обратного, но это стоит в 3 раза больше факторизации.) Вы хотите проверить, имеет ли B отрицательное собственное значение. Работая с B вместо A, отрицательные собственные значения гораздо лучше разделяются, поэтому, если они есть, вы должны быстро сходиться.
Но мне любопытно, откуда твоя проблема. Несимметричные матрицы обычно имеют сложные собственные значения, поэтому «наибольшее» даже не определено. Таким образом, вы должны знать больше о своей проблеме, что может помочь подсказать, как решить ее еще быстрее и / или более надежно.
Edit2: Это трудно получить с Арнольди в конкретное подмножество интереса. Чтобы надежно получить абсолютно самые большие собственные значения, вы должны выполнить итерацию в подпространстве, используя исходную матрицу, с размером подпространства, соответствующим или превышающим число собственных значений, которое, как ожидается, будет близко к 1 или больше по величине. На маленьких матрицах это будет медленнее, чем алгоритм QR, но на больших матрицах это будет намного быстрее.
источник
Мощность Итерация (или метод питания), например , то , что описывает Дэн, всегда должен сходиться, хотя и со скоростью ,| λn - 1/ λN|
Если близко к λ n , оно будет медленным, но вы можете использовать экстраполяцию, чтобы обойти это. Это может показаться сложным, но реализация в псевдокоде приведена в статье.λn - 1 λN
источник
Недавно было проведено несколько хороших исследований. Новые подходы используют «рандомизированные алгоритмы», которые требуют лишь нескольких считываний вашей матрицы, чтобы получить хорошую точность при самых больших собственных значениях. Это в отличие от степенных итераций, которые требуют нескольких умножений матрицы на вектор для достижения высокой точности.
Вы можете прочитать больше о новом исследовании здесь:
http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf
http://arxiv.org/abs/0909.4061
Этот код сделает это за вас:
http://cims.nyu.edu/~tygert/software.html
https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m
http://code.google.com/p/redsvd/
https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html
Если выбранного вами языка нет, вы можете довольно легко свернуть свой собственный рандомизированный SVD; это требует только умножения вектора матрицы с последующим вызовом готового SVD.
источник
Здесь вы найдете алгоритмическое введение в алгоритм Якоби-Дэвидсона, который вычисляет максимальное собственное значение.
В этой статье рассматриваются математические аспекты. JD допускает общие (действительные или сложные) матрицы и может использоваться для вычисления диапазонов собственных значений.
Здесь вы можете найти различные реализации библиотек JDQR и JDQZ (включая интерфейс C, на который вы сможете ссылаться из R).
источник
В своем оригинальном сообщении вы говорите:
«Я также пытался использовать интерфейс ARPACK в пакете igraph R. Однако он дал ошибку для одной из моих матриц».
Мне было бы интересно узнать больше об ошибке. Если вы можете сделать эту матрицу общедоступной где-нибудь, мне было бы интересно попробовать ARPACK на ней.
Исходя из того, что я прочитал выше, я ожидаю, что ARPACK очень хорошо справится с извлечением самых больших (или нескольких из самых больших) собственных значений разреженной матрицы. Чтобы быть более конкретным, я ожидал бы, что методы Арнольди будут хорошо работать в этом случае, и это, конечно, то, на чем основан ARPACK.
Медленная сходимость метода степеней при наличии близко расположенных собственных значений в интересующей области упоминалась выше. Арнольди улучшает это, перебирая несколько векторов вместо одного в степенном методе.
источник
Это не самый быстрый способ, но достаточно быстрый способ - просто несколько раз ударить (изначально случайный) вектор матрицей, а затем нормализовать каждые несколько шагов. В конце концов он будет сходиться к наибольшему собственному вектору, и усиление в норме за один шаг является ассоциированным собственным значением.
Это работает лучше всего, когда наибольшее собственное значение существенно больше, чем любое другое собственное значение. Если другое собственное значение близко по величине к наибольшему, потребуется некоторое время, чтобы сходиться, и может быть трудно определить , сходилось ли оно .
источник
Пакет RARPACK у меня работает. И это кажется очень быстрым, поскольку это всего лишь интерфейс для ARPACK, стандартного пакета для разреженной линейной алгебры (имеется в виду вычисление нескольких собственных значений и собственных векторов).
источник