В программном проекте, над которым я работаю, некоторые вычисления намного проще для плотных матриц низкого ранга. В некоторых проблемных случаях используются плотные матрицы низкого ранга, но они даны мне полностью, а не как факторы, поэтому мне придется проверять ранг и фактор матрицы, если я хочу воспользоваться преимуществами структуры низкого ранга ,
Матрицы, о которых идет речь, обычно являются полностью или почти полностью плотными, причем n колеблется от ста до нескольких тысяч. Если матрица имеет низкий ранг (скажем, менее 5-10), то вычисление SVD и использование его для формирования факторинга низкого ранга стоит усилий. Однако, если матрица не низкого ранга, то усилия будут потрачены впустую.
Таким образом, я хотел бы найти быстрый и достаточно надежный способ определения, является ли ранг низким, прежде чем вкладывать усилия в полную факторизацию SVD. Если в какой-то момент становится ясно, что ранг выше порога, процесс может быть немедленно остановлен. Если процедура ошибочно объявляет матрицу низкого ранга, когда это не так, это не является большой проблемой, так как я все еще буду делать полный SVD для подтверждения низкого ранга и нахождения факторизации низкого ранга.
Варианты, которые я рассмотрел, включают ранг, раскрывающий LU или QR-факторизацию, за которым следует полный SVD в качестве проверки. Есть ли другие подходы, которые я должен рассмотреть?
источник
Проблема, конечно, заключается в том, что вычисление истинного ранга (например, посредством разложения QR) на самом деле не дешевле, чем вычисление низкосортного представления матрицы.
Лучшее, что вы можете сделать, это использовать рандомизированный алгоритм для поиска аппроксимаций низкого ранга. Они могут, по крайней мере, теоретически, быть значительно быстрее, чем работать со всей матрицей, потому что, по сути, они только вычисляют разложения для проекций матрицы на случайные подпространства.
Хороший вопрос, стоит ли это для матрицы размером , но если ваши проблемы действительно станут большими, я подозреваю, что это окупится.100×100
источник
Другой подход, который стоит попробовать, - использовать адаптивную перекрестную аппроксимацию (ACA). Это довольно популярный алгоритм, который имеет много реализаций, доступных онлайн. Для справки, вы можете увидеть оригинал статьи:
ACA и ее вариации (скажем, ACA +, гибридная перекрестная аппроксимация HCA) могут использоваться в различных сценариях. Вы уже рассчитали всю плотную матрицу, что является одним из преимуществ, так как вы сможете точно рассчитать остатки, если это необходимо.
источник
Для простого случая, когда матрицаA является симметричным положительно определенным, вычислите его, скажем, 20 самых больших собственных значений, и посмотрите, если они → 0 , or compare norms.
ARPACK is fast for this; more important,
it needs only a function x → AИкс , Так что для общегоA посмотрите на собственные значения ATA
(как LinOp, не создавая его.)
scipy.sparse.linalg.svds делает это: LinOp( АTА ) → Arpack, для A любого размера:
источник