SVDを安定させるためにどれだけの正則化を追加しますか?


10

インテルMKLのSVD(dgesvdSciPyを介して)を使用していて、マトリックスの条件が悪い/フルランクではない場合float32と精度を変更すると、結果が大幅に異なることに気付きましたfloat64。結果がfloat32-> float64変更の影響を受けないようにするために追加する必要がある正則化の最小量に関するガイドはありますか?

際、特に、、Iはその参照L ノルムV T Xの Iとの間の精度を変更した場合約1による移動とを。AのL 2ノルムは10 5であり、合計784のうち約200のゼロ固有値があります。A=UDVTLVTXfloat32float64L2A105

上のSVDをやっλ = 10 - 3は違いワニスを作りました。λI+Aλ=103


その例のN × N行列Aのサイズは何ですか(それは正方行列ですか?)200個のゼロ固有値または特異値?フロベニウスの規範| | A | | 代表的な例のFも役立ちます。NN×NA||A||F
アントンメンショフ

この場合は784 x 784のマトリックスですが、ラムダの良い値を見つける一般的な手法に興味があります
Yaroslav Bulatov

では、の違いは、特異値ゼロに対応する最後の列でのみですか?V
Nick Alger、2017年

2
複数の等しい特異値がある場合、svdは一意ではありません。あなたの例では、問題は複数のゼロ特異値に起因し、精度が異なると、それぞれの特異空間の基底の選択が異なることになると思います。あなたが正則化するとなぜそれが変わるのか分かりません...
Dirk

回答:


1

質問には素晴らしい答えがありますが、ここにプロット付きの小さな特異値の経験則があります。

Nϵ

数値レシピ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も、高次元データのノイズ除去に役立つ場合があります。

実際のテストケースは歓迎されます。


ところで、scipyはfloat32には1e3、float64には1e6の係数を追加しているようです。これらがどこから来たかに興味があります
Yaroslav Bulatov

@Yaroslav Bulatov、numpyおよびscipy.linalg.svdLAPACK gesddを呼び出しますJOBRdgejsv次のパラメータを参照してください:「特異値の範囲を指定します。外側にある場合、ゼロの小さな正の特異値に設定するようにライセンスを発行します...」(scipy.sparse.linalg.svdsARPACKをラップし、パラメータtol、Toleranceがある特異値の場合。)
denis

13

A=ATM=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ϵVUϵ>0U,VUV

M0=U0Σ0V0Tfloat64Mϵ=UϵΣϵVϵTfloat32Σ0,Σϵϵ107U0,UϵV0,Vϵ


これは、users.math.msu.edu / users / markiwen / Teaching / MTH995 / Papers / …の例ですか?
Memming

1
それは素晴らしいリファレンスです。わかりません。この例を何年も前に数学のクラスで学びました:-)
Richard Zhang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.