Существует ли усеченный алгоритм SVD, который вычисляет сингулярные значения по одному?
Моя проблема: я хотел бы вычислить первые сингулярных значений (и сингулярных векторов) большой плотной матрицы , но я не знаю, каково было бы подходящее значение . велико, поэтому из соображений эффективности я бы предпочел не оценивать полный SVD только для того, чтобы впоследствии урезать самые маленькие SV.
В идеале был бы способ вычислить сингулярные значения последовательно, от наибольшего ( σ 1 ) до наименьшего ( σ n ). Таким образом, я мог бы просто остановить вычисления после вычисления K - го особого значения , если σ к / σ 1 падает ниже некоторого порога.
Существует ли такой алгоритм (желательно с реализацией Python)? В моем поиске я обнаружил только усеченные SVD-функции, которые принимают k в качестве параметра, заставляя вас угадывать его априори.
источник
Ответы:
Есть несколько вариантов, если вы хотите приблизительные факторизации ранга k.
Приблизительная факторизация вышеуказанной формы может быть преобразована в стандартное разложение, такое как QR или SVD, с использованием стандартных методов. Хороший обзор доступен в статье Халко, Мартинссона и Троппа «Нахождение структуры со случайностью: вероятностные алгоритмы для построения приближенных матричных разложений»
С точки зрения программного обеспечения интерфейс для алгоритмов идентификации доступен в scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html, который позволяет пользователю указать .ϵ
источник
(Отредактировано, потому что я сначала неправильно прочитал вопрос; вы уже знаете, что существуют процедуры для вычисления первых единичных значений.)k
Если исключить подход вычисления целого SVD, алгоритмы частичного SVD сводятся к использованию итерационных методов для решения связанной эрмитовой задачи на собственные значения. Итак, одна из стратегий, которую вы могли бы выбрать, - это самостоятельно написать код такого рода и продолжать искать наибольшее оставшееся нерешенное единичное значение до тех пор, пока вы не захотите остановиться, используя что-то вроде стратегии сдвига и инвертирования. Могут быть элегантные способы сделать это в сложных пакетах, таких как SLEPc .
Другая стратегия будет следующей:
Если разреженная процедура SVD вычисляет тонкий SVD (и я не могу понять, почему это не так), то эта стратегия дает вам все необходимые значения единственного числа (плюс, возможно, некоторые дополнительные), потому что значения ниже абсолютного допуска будут трактоваться как ноль. В этом случае вы можете использовать scipy.sparse.linalg.svds , отметив, что является необязательным параметром и вам не нужно указывать его априори .k
источник