J'ai utilisé le SVD d'Intel MKL ( dgesvd
via SciPy) et j'ai remarqué que les résultats sont considérablement différents lorsque je change de précision entre float32
et float64
lorsque ma matrice est mal conditionnée / n'est pas pleine. Existe-t-il un guide sur le montant minimum de régularisation à ajouter pour rendre les résultats insensibles aux float32
-> float64
changements?
En particulier, en faisant , je vois que la norme L ∞ de V T X se déplace d'environ 1 lorsque je change de précision entre et . La norme L 2 de A est 10 5 et elle a environ 200 valeurs propres nulles sur 784 au total.float32
float64
Faire SVD sur avec λ = 10 - 3 a fait disparaître la différence.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Yaroslav Bulatov
la source
la source
Réponses:
Bien que la question ait une excellente réponse, voici une règle de base pour les petites valeurs singulières, avec un tracé.
Ajouté: les deux lignes suivantes calculent cette règle empirique.
La matrice de Hilbert semble être largement utilisée comme cas de test pour l'erreur d'arrondi:
Ici, les bits de poids faible dans les mantisses de la matrice de Hilbert sont mis à zéro
A.astype(np.float__).astype(np.float64)
, puisnp.linalg.svd
exécutésfloat64
. (Les résultats avecsvd
tousfloat32
sont à peu près les mêmes.)Une simple troncature à
float32
pourrait même être utile pour débruiter des données de grande dimension, par exemple pour la classification des trains / tests.De vrais cas de test seraient les bienvenus.
la source
numpy
etscipy.linalg.svd
appelez LAPACK gesdd , voir le paramètreJOBR
dansdgejsv
: "Spécifie la plage pour les valeurs singulières. Délivre la licence pour définir zéro petites valeurs singulières positives si elles sont en dehors ..." (scipy.sparse.linalg.svds
encapsule ARPACK et a un paramètretol
, Tolérance pour les valeurs singulières.)float64
float32
la source