Я использовал SVD от Intel MKL ( dgesvd
через SciPy) и заметил, что результаты значительно отличаются, когда я меняю точность между float32
и float64
когда моя матрица плохо обусловлена / не имеет полного ранга. Есть ли руководство по минимальному количеству регуляризации, которое я должен добавить, чтобы сделать результаты нечувствительными к float32
-> float64
изменениям?
В частности, занимаюсь , Я вижу это норма перемещается примерно на 1, когда я меняю точность между float32
и float64
. норма является и он имеет около 200 нулевых собственных значений из общего числа 784.
Делать SVD на с сделал разницу исчезать.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Ярослав Булатов
источник
источник
Ответы:
Хотя на этот вопрос есть отличный ответ, вот небольшое практическое правило для небольших значений с сюжетом.
Добавлено: следующая пара строк вычисляет это эмпирическое правило.
Матрица Гильберта, кажется, широко используется в качестве контрольного примера для ошибки округления:
Здесь младшие биты в мантиссах матрицы Гильберта обнуляются
A.astype(np.float__).astype(np.float64)
, а затем вводятсяnp.linalg.svd
вfloat64
. (Результаты соsvd
всемиfloat32
примерно одинаковы.)Простое усечение
float32
может даже быть полезным для шумоподавления многомерных данных, например, для классификации поезда / теста.Реальные тестовые случаи приветствуются.
источник
numpy
иscipy.linalg.svd
вызовите LAPACK gesdd , см. ПараметрJOBR
вdgejsv
: «Определяет RANGE для особых значений. Выдает лицензию для обнуления небольших положительных единичных значений, если они находятся вне ...» (scipy.sparse.linalg.svds
оборачивает ARPACK и имеет параметрtol
Tolerance для особых значений.)Разложение по сингулярности для симметричной матрицыA =AT
одно и то же с его каноническим собственным разложением (т. е. с ортонормированной матрицей собственных векторов), а то же самое с несимметричной матрицей M= UΣВT это просто каноническое разложение по собственным значениям для симметричной матрицы
Ответ удивительный, нет. Позволятьε > 0 быть маленьким, и рассмотрим две матрицы
Now, applying this insight back to the SVD under finite precision, let us writeM0=U0Σ0VT0 as your matrix in Mϵ=UϵΣϵVTϵ
as the same matrix in Σ0,Σϵ
must differ by no more than a small constant factor of ϵ≈10−7 ,
but the singular vectors U0,Uϵ and V0,Vϵ
can differ by an arbitrarily large quantity. Hence, as shown, there is no way to make the SVD "stable" in the sense of the singular vectors.
float64
precision, andfloat32
precision. If we assume that the SVDs themselves are exact, then the singular valuesисточник