Всегда ли scipy и numpy svd или eig возвращают один и тот же единственный / собственный вектор?

Поскольку разложение SVD не является уникальным (пары левых и правых сингулярных векторов могут иметь свой знак переворачивания одновременно), мне было интересно, в какой степени матрицы U и V возвращаются scipy.linalg.svd() являются "детерминированными" / всегда одинаковыми?

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

1 ответ

Решение

SciPy и Numpy оба вычисляют SVD путем аутсорсинга в LAPACK _gesdd рутина. Любая детерминированная реализация этой подпрограммы каждый раз будет давать одинаковые результаты на данном компьютере с заданной реализацией LAPACK, но, насколько я знаю, нет гарантии, что разные реализации LAPACK (то есть NETLIB против MKL, OSX против Windows и т. Д.) будет использовать то же соглашение. Если ваше приложение зависит от какого-то соглашения по разрешению неоднозначности знака, было бы безопаснее убедиться в этом самостоятельно при какой-либо пост-обработке сингулярных векторов; один полезный подход дан в Устранении неоднозначности знака в разложении сингулярного значения (pdf)

Другие вопросы по тегам