Berapa banyak regularisasi yang ditambahkan untuk membuat SVD stabil?

10

Saya telah menggunakan Intel MKL SVD ( dgesvdmelalui SciPy) dan memperhatikan bahwa hasilnya sangat berbeda ketika saya mengubah presisi di antara float32dan float64ketika matriks saya dikondisikan secara buruk / bukan peringkat penuh. Apakah ada panduan tentang jumlah minimum regularisasi yang harus saya tambahkan untuk membuat hasil tidak sensitif terhadap float32-> float64perubahan?

Secara khusus, melakukan , saya melihat bahwa norma bergerak sekitar 1 ketika saya mengubah presisi antara dan . Norma dari adalah dan memiliki sekitar 200 nilai eigen nol dari total 784. L V T X L 2 A 10 5A=UDVTLVTXfloat32float64L2A105

Melakukan SVD pada dengan membuat perbedaan menghilang.λ = 10 - 3λI+Aλ=103

Yaroslav Bulatov
sumber
Berapa ukuran dari sebuah matriks untuk contoh itu (apakah itu bahkan matriks persegi)? 200 nol nilai eigen atau nilai tunggal? Norma Frobenius untuk contoh yang representatif juga akan membantu. N × N A | | A | | FNN×NA||A||F
Anton Menshov
Dalam hal ini 784 x 784 matriks, tapi saya lebih tertarik pada teknik umum untuk menemukan nilai yang baik dari lambda
Yaroslav Bulatov
Jadi, apakah perbedaan dalam hanya pada kolom terakhir yang sesuai dengan nilai nol tunggal? V
Nick Alger
2
Jika ada beberapa nilai singular yang sama, svd tidak unik. Dalam contoh Anda, saya kira masalahnya berasal dari beberapa nilai singular nol dan bahwa ketelitian yang berbeda mengarah ke pilihan dasar yang berbeda untuk ruang singular masing-masing. Saya tidak tahu mengapa itu berubah ketika Anda mengatur ...
Dirk
1
... apa itu ? X
Federico Poloni

Jawaban:

1

Meskipun pertanyaannya memiliki jawaban yang bagus, berikut adalah aturan praktis untuk nilai tunggal kecil, dengan plot.

Jika nilai singular adalah nol tetapi sangat kecil, Anda harus mendefinisikan kebalikannya menjadi nol, karena nilainya yang jelas mungkin merupakan artefak kesalahan pembulatan, bukan angka yang berarti. Jawaban yang masuk akal untuk pertanyaan "seberapa kecil kecil?" adalah mengedit dengan cara ini semua nilai singular yang rasio terhadap yang terbesar kurang dari kali presisi mesin ϵ .Nϵ

- Resep Numerik hal. 795

Ditambahkan: beberapa baris berikut menghitung aturan praktis ini.

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


Matriks Hilbert tampaknya banyak digunakan sebagai uji kasus untuk kesalahan pembulatan:

masukkan deskripsi gambar di sini

Di sini bit orde rendah dalam mantisa dari matriks Hilbert adalah nol A.astype(np.float__).astype(np.float64),, kemudian np.linalg.svddijalankan float64. (Hasil dengan svdsemua float32hampir sama.)

Cukup memotong float32mungkin bahkan berguna untuk denoising data dimensi tinggi, misalnya untuk klasifikasi kereta / uji.

Kasus uji nyata akan diterima.

denis
sumber
btw, Scipy sepertinya menambahkan faktor 1e3 untuk float32 dan 1e6 untuk float64, penasaran dari mana asalnya
Yaroslav Bulatov
@Yaroslav Bulatov, numpydan scipy.linalg.svdpanggil LAPACK gesdd , lihat parameter JOBRdi dgejsv: "Menentukan RANGE untuk nilai singular. Terbitkan lisensi untuk menetapkan nol nilai singular positif kecil jika mereka di luar ..." ( scipy.sparse.linalg.svdsmembungkus ARPACK dan memiliki parameter tol, Toleransi untuk nilai singular.)
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ϵ

Richard Zhang
sumber
1
Itu referensi yang bagus. Saya tidak tahu, saya belajar contoh khusus ini bertahun-tahun yang lalu di kelas matematika :-)
Richard Zhang