SVD'yi kararlı hale getirmek için ne kadar düzenlileştirme eklenir?


10

Intel MKL'nin SVD'sini ( dgesvdSciPy aracılığıyla) kullanıyorum ve matrisim kötü koşullu / tam sıralı değilken hassasiyeti değiştirdiğimde float32ve sonuçların önemli ölçüde farklı olduğunu fark ettim float64. Ben sonuçları için duyarsız hale getirmek için eklemek gerekir regülarizasyon minimum miktarda bir rehber var mı float32> - float64değişiklik?

Özel olarak, kullanıcının durumu , bunun bakınız normu yaklaşık 1 ile hamle I arasında hassas değiştirmek ve . norm olan ve 784 toplam üzerinden sıfır yaklaşık 200 özdeğer sahiptir.A=UDVTLVTXfloat32float64L2A105

ile SVD yapmak farkı ortadan kaldırdı.λI+birλ=10-3


Boyutu nedir N- bir N-xN- matris birbu örnek için (bir kare matris bile mi)? 200 sıfır özdeğer veya tekil değerler? Bir Frobenius normu||bir||Ftemsili bir örnek için de yararlı olacaktır.
Anton Menshov

Bu durumda 784 x 784 matris, ama
lambda'nın

Yani, Vsadece sıfır tekil değerlere karşılık gelen son sütunlarda?
Nick Alger

2
Birkaç eşit tekil değer varsa, svd benzersiz değildir. Örneğinizde, sorunun çoklu sıfır tekil değerlerinden kaynaklandığını ve farklı bir hassasiyetin ilgili tekil alan için farklı bir temel seçimine yol açtığını tahmin ediyorum. Düzenlediğinizde bunun neden değiştiğini bilmiyorum ...
Dirk

1
...nedir X?
Federico Poloni

Yanıtlar:


1

Sorunun harika bir cevabı olmasına rağmen, burada küçük tekil değerler için bir arsa ile bir kural.

Tekil bir değer sıfırdan farklı ancak çok küçükse, görünen değeri muhtemelen anlamlı bir sayı değil, bir yuvarlama hatasının bir yapaylığı olduğu için karşılıklı değerini sıfır olarak tanımlamanız gerekir. "Ne kadar küçük?" Sorusuna makul bir cevap. bu şekilde en büyük oranı en düşük olan tüm tekil değerleri düzenlemekN- makine hassasiyetinin katları ε .

- Sayısal Tarifler s. 795

Eklendi: aşağıdaki birkaç satır bu başparmak kuralını hesaplar.

#!/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


Hilbert matrisi, yuvarlama hatası için bir test durumu olarak yaygın olarak kullanılmaktadır:

resim açıklamasını buraya girin

Burada Hilbert matrisinin mantislerindeki düşük dereceli bitler sıfırlanır A.astype(np.float__).astype(np.float64), sonra np.linalg.svdçalıştırılır float64. (Sonuçların svdhepsi float32aynıdır.)

Basitçe kesmek float32, örneğin tren / test sınıflandırması gibi yüksek boyutlu verilerin kınanması için bile yararlı olabilir.

Gerçek test vakaları memnuniyetle karşılanacaktır.


btw, scipy, float32 için 1e3 ve float64 için 1e6 faktörünü ekliyor gibi görünüyor, bunların nereden geldiğini merak ediyor
Yaroslav Bulatov

@Yaroslav Bulatov numpyve scipy.linalg.svdLAPACK gesdd parametresini arayın , şu parametreye JOBRbakın dgejsv: "Tekil değerler için RANGE değerini belirtir. Dışarıdalarsa sıfır pozitif tekil değerlere sıfırlama lisansını verir ..." ( scipy.sparse.linalg.svdsARPACK'i sarar ve tolTolerance parametresine sahiptir. tekil değerler için.)
denis

13

Simetrik bir matris için tekil değer ayrışımı bir=birT aynı zamanda simetrik olmayan bir matris için aynı şeyken, kanonik öz-bileşimi ile aynıdır (yani bir ortonormal özvektör matrisi ile). M=UΣVT simetrik matris için sadece kanonik özdeğer ayrışmasıdır

'H=[0MMT0]=[U00V][0ΣΣ0][U00V]T
Bu nedenle, genelliği kaybetmeden, yakından ilgili bir soruyu ele alalım: İki simetrik matris yaklaşık olarak aynı ise, o zaman kanonik öz kompozisyonlarının da yaklaşık olarak aynı olmasını beklemeliyiz?

Cevap şaşırtıcı bir hayır. İzin Vermekε>0 küçük olun ve iki matrisi düşünün

birε=[1εε1]=VΛεVT,Bε=[1+ε001-ε]=UΛεUT
ikisi de özdeğerlidir Λε=dbenbirg(1+ε,1-ε), ama özvektörleri olan
V=12[111-1],U=[1001].
Matrisler birεBε yaklaşık olarak aynı, özvektör matrisi V ve Uçok farklılar. Gerçekten de, öz bileşimlerε>0, gerçekten başka seçeneği yok U,V öyle ki UV

Şimdi, bu içgörü SVD'ye son derece hassas bir şekilde uygulayarak, yazalım M0=U0Σ0V0Tmatrisiniz olarak float64 hassas veMε=UεΣεVεT aynı matrisle aynı float32hassasiyette. SVD'lerin kendilerinin kesin olduğunu varsayarsak, o zaman tekil değerlerΣ0,Σε küçük bir sabit faktörden daha fazla farklılık göstermemelidir. ε10-7, ancak tekil vektörler U0,Uε ve V0,Vε keyfi olarak büyük miktarda farklılık gösterebilir. Dolayısıyla, gösterildiği gibi, SVD'yi tekil vektörler anlamında "kararlı" hale getirmenin bir yolu yoktur.



1
Harika bir referans. Bilmiyorum, bu özel örneği yıllar önce matematik dersinde öğrendim :-)
Richard Zhang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.