Сколько регуляризации добавить, чтобы сделать SVD стабильным?


10

Я использовал SVD от Intel MKL ( dgesvdчерез SciPy) и заметил, что результаты значительно отличаются, когда я меняю точность между float32и float64когда моя матрица плохо обусловлена ​​/ не имеет полного ранга. Есть ли руководство по минимальному количеству регуляризации, которое я должен добавить, чтобы сделать результаты нечувствительными к float32-> float64изменениям?

В частности, занимаюсь Aзнак равноUDВT, Я вижу это L норма ВTИксперемещается примерно на 1, когда я меняю точность между float32и float64.L2 норма A является 105 и он имеет около 200 нулевых собственных значений из общего числа 784.

Делать SVD на λя+A с λзнак равно10-3 сделал разницу исчезать.


Какой размер N из N×N матрица Aдля этого примера (это даже квадратная матрица)? 200 нулевых или собственных значений? Норма Фробениуса||A||Fдля репрезентативного примера было бы также полезно.
Антон Меньшов

В данном случае матрица 784 x 784, но меня больше интересует общая методика поиска хорошего значения лямбды
Ярослав Булатов

Итак, есть ли разница в Vтолько в последних столбцах, соответствующих нулевым значениям?
Ник Алджер

2
Если существует несколько одинаковых значений, svd не является уникальным. В вашем примере, я предполагаю, что проблема исходит из множества нулевых сингулярных значений и что разная точность приводит к другому выбору базиса для соответствующего сингулярного пространства. Я не знаю, почему это меняется, когда вы регулируете ...
Дирк

1
...что такое Икс?
Федерико Полони

Ответы:


1

Хотя на этот вопрос есть отличный ответ, вот небольшое практическое правило для небольших значений с сюжетом.

Если значение в единственном числе отлично от нуля, но очень мало, вы должны определить, что его обратное значение равно нулю, поскольку его кажущееся значение, вероятно, является артефактом ошибки округления, а не значащим числом. Правдоподобный ответ на вопрос "насколько маленький маленький?" таким образом редактировать все значения единственного числа, отношение которых к наибольшему меньшеN раз точность машины ε ,

- Numerical Recipes p. 795

Добавлено: следующая пара строк вычисляет это эмпирическое правило.

#!/usr/bin/env python2

from __future__ import division
import numpy as np
from scipy.sparse.linalg import svds  # sparse, dense or LinOp

#...............................................................................
def howsmall( A, singmax=None ):
    """ singular values < N float_eps sing_max  may be iffy, questionable
        "How small is small ?"
        [Numerical Recipes p. 795](http://apps.nrbook.com/empanel/index.html?pg=795)
    """
        # print "%d singular values are small, iffy" % (sing < howsmall(A)).sum()
        # small |eigenvalues| too ?
    if singmax is None:
        singmax = svds( A, 1, return_singular_vectors=False )[0]  # v0=random

    return max( A.shape ) * np.finfo( A.dtype ).eps * singmax


Матрица Гильберта, кажется, широко используется в качестве контрольного примера для ошибки округления:

введите описание изображения здесь

Здесь младшие биты в мантиссах матрицы Гильберта обнуляются A.astype(np.float__).astype(np.float64), а затем вводятся np.linalg.svdв float64. (Результаты со svdвсеми float32примерно одинаковы.)

Простое усечение float32может даже быть полезным для шумоподавления многомерных данных, например, для классификации поезда / теста.

Реальные тестовые случаи приветствуются.


Кстати, Сципи, кажется, добавляет коэффициент 1e3 для float32 и 1e6 для float64, любопытно, откуда они взялись
Ярослав Булатов

@ Ярослав Булатов, numpyи scipy.linalg.svdвызовите LAPACK gesdd , см. Параметр JOBRв dgejsv: «Определяет RANGE для особых значений. Выдает лицензию для обнуления небольших положительных единичных значений, если они находятся вне ...» ( scipy.sparse.linalg.svdsоборачивает ARPACK и имеет параметр tolTolerance для особых значений.)
Денис

13

Разложение по сингулярности для симметричной матрицы Aзнак равноAT одно и то же с его каноническим собственным разложением (т. е. с ортонормированной матрицей собственных векторов), а то же самое с несимметричной матрицей Mзнак равноUΣВT это просто каноническое разложение по собственным значениям для симметричной матрицы

ЧАСзнак равно[0MMT0]знак равно[U00В][0ΣΣ0][U00В]T
Следовательно, не ограничивая общности, рассмотрим тесно связанный вопрос: если две симметричные матрицы приблизительно одинаковы, то следует ли ожидать, что их канонические собственные разложения также будут приблизительно одинаковыми?

Ответ удивительный, нет. Позволятьε>0 быть маленьким, и рассмотрим две матрицы

Aεзнак равно[1εε1]знак равноВΛεВT,Вεзнак равно[1+ε001-ε]знак равноUΛεUT
оба из которых имеют собственные значения Λεзнак равноdяaг(1+ε,1-ε)но чьи собственные векторы
V=12[1111],U=[1001].
Пока матрицы AϵBϵ примерно одинаковы, их матрица собственных векторов V а также Uочень разные. Действительно, поскольку собственные разложения являются уникальными дляϵ>0действительно не существует выбора U,V such that UV

Now, applying this insight back to the SVD under finite precision, let us write M0=U0Σ0V0T as your matrix in float64 precision, and Mϵ=UϵΣϵVϵT as the same matrix in float32 precision. If we assume that the SVDs themselves are exact, then the singular values Σ0,Σϵ must differ by no more than a small constant factor of ϵ107, 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.



1
That's a great reference. I don't know, I learnt this particular example many years ago in math class :-)
Richard Zhang
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.