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:
Di sini bit orde rendah dalam mantisa dari matriks Hilbert adalah nol
A.astype(np.float__).astype(np.float64)
,, kemudian np.linalg.svd
dijalankan float64
. (Hasil dengan svd
semua float32
hampir sama.)
Cukup memotong float32
mungkin bahkan berguna untuk denoising data dimensi tinggi, misalnya untuk klasifikasi kereta / uji.
Kasus uji nyata akan diterima.