Saya telah menggunakan Intel MKL SVD ( dgesvd
melalui SciPy) dan memperhatikan bahwa hasilnya sangat berbeda ketika saya mengubah presisi di antara float32
dan float64
ketika 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
-> float64
perubahan?
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 5float32
float64
Melakukan SVD pada dengan membuat perbedaan menghilang.λ = 10 - 3
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Yaroslav Bulatov
sumber
sumber
Jawaban:
Meskipun pertanyaannya memiliki jawaban yang bagus, berikut adalah aturan praktis untuk nilai tunggal kecil, dengan plot.
Ditambahkan: beberapa baris berikut menghitung aturan praktis ini.
Matriks Hilbert tampaknya banyak digunakan sebagai uji kasus untuk kesalahan pembulatan:
Di sini bit orde rendah dalam mantisa dari matriks Hilbert adalah nol
A.astype(np.float__).astype(np.float64)
,, kemudiannp.linalg.svd
dijalankanfloat64
. (Hasil dengansvd
semuafloat32
hampir sama.)Cukup memotong
float32
mungkin bahkan berguna untuk denoising data dimensi tinggi, misalnya untuk klasifikasi kereta / uji.Kasus uji nyata akan diterima.
sumber
numpy
danscipy.linalg.svd
panggil LAPACK gesdd , lihat parameterJOBR
didgejsv
: "Menentukan RANGE untuk nilai singular. Terbitkan lisensi untuk menetapkan nol nilai singular positif kecil jika mereka di luar ..." (scipy.sparse.linalg.svds
membungkus ARPACK dan memiliki parametertol
, Toleransi untuk nilai singular.)float64
float32
sumber