Скільки регуляризації додати, щоб зробити SVD стабільним?


10

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

Зокрема, роблячи A=UDVT, Я бачу, що L норма VTХрухається приблизно на 1, коли я змінюю точність між float32і float64.L2 норма A є 105 і має близько 200 нульових власних значень із 784 всього.

Робимо SVD далі λI+A з λ=103 різниця зникала.


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

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

Отже, чи є різниця в Vлише в останніх стовпцях, що відповідають нульовим значенням однини?
Нік Алгер

2
Якщо є кілька рівних сингулярних значень, SVD не є унікальним. У вашому прикладі я здогадуюсь, що проблема виникає з декількох нульових сингулярних значень і що різна точність призводить до різного вибору основи відповідного сингулярного простору. Я не знаю, чому це змінюється, коли ти регулюєш ...
Дірк

Відповіді:


1

Хоча на питання є чудова відповідь, ось основне правило для малих одиничних значень, з графіком.

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

- Числові рецепти с. 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може бути навіть корисним для позначення великомірних даних, наприклад, для класифікації поїздів / тестів.

Реальні тестові випадки будуть вітатися.


btw, scipy, здається, додає коефіцієнт 1e3 для float32 та 1e6 для float64, цікаво звідки вони
Ярослав Булатов,

@ Yaroslav Bulatov, numpyі scipy.linalg.svdзателефонуйте LAPACK gesdd , див. Параметр JOBRу dgejsv: "Вказує RANGE для сингулярних значень. Видає ліцензію на встановлення нуля малих позитивних сингулярних значень, якщо вони знаходяться поза ..." ( scipy.sparse.linalg.svdsзавершує ARPACK і має параметр tol, Толерантність для
denis

13

Розклад сингулярного значення для симетричної матриці A=AT є одним і тим же, як і його канонічна ейгендекомпозиція (тобто з ортонормальною матрицею власних векторів), тоді як те ж саме для несиметричної матриці M=UΣVT - просто канонічне власне значення розкладу для симетричної матриці

H=[0MMT0]=[U00V][0ΣΣ0][U00V]T
Отже, не втрачаючи загальності, давайте розглянемо тісно пов'язане питання: Якщо дві симетричні матриці приблизно однакові, то чи слід очікувати, що їх канонічні ейгендекомпозиції будуть приблизно однаковими?

Відповідь - дивовижна ні. Дозволяєϵ>0 будьте малі та розгляньте дві матриці

Aϵ=[1ϵϵ1]=VΛϵVT,Bϵ=[1+ϵ001ϵ]=UΛϵUT
вони мають власні значення Λϵ=diag(1+ϵ,1ϵ), але чиї власні вектори є
V=12[1111],U=[1001].
Поки матриці AϵBϵ приблизно однакові, їх матриці власних векторів V і Uдуже різні. Дійсно, оскільки ейгендекомпозиції унікальні дляϵ>0, вибору насправді не існує U,V такий як UV

Тепер, застосовуючи це розуміння до SVD з обмеженою точністю, давайте напишемо M0=U0Σ0V0Tяк ваша матриця в float64 точності, іMϵ=UϵΣϵVϵT як та сама матриця в float32точності. Якщо припустити, що самі SVD є точними, то значення сингулярніΣ0,Σϵ повинна відрізнятися не більше ніж малим постійним коефіцієнтом ϵ107, але одиничні вектори U0,Uϵ і V0,Vϵ може відрізнятися довільно великою кількістю. Отже, як показано, немає можливості зробити SVD "стабільним" у значенні сингулярних векторів.



1
Це чудова довідка. Не знаю, я навчився цього конкретного прикладу багато років тому на уроці математики :-)
Річард Чжан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.