Eu tenho usado o SVD da Intel MKL ( dgesvd
através do SciPy) e notei que os resultados são significativamente diferentes quando eu mudo a precisão entre float32
e float64
quando minha matriz está mal condicionada / não está na classificação completa. Existe um guia sobre a quantidade mínima de regularização que devo adicionar para tornar os resultados insensíveis a float32
-> float64
alteração?
Em particular, fazendo , eu ver que L ∞ norma de V T X move-se em cerca de 1 quando mudar entre precisão e . A norma L 2 de A é 10 5 e tem cerca de 200 autovalores zero de um total de 784.float32
float64
Fazer SVD em com λ = 10 - 3 fez a diferença desaparecer.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Yaroslav Bulatov
fonte
fonte
Respostas:
Embora a pergunta tenha uma ótima resposta, aqui está uma regra prática para pequenos valores singulares, com um gráfico.
Adicionado: as duas linhas a seguir calculam essa regra de ouro.
A matriz Hilbert parece ser amplamente utilizada como um caso de teste para erro de arredondamento:
Aqui, os bits de baixa ordem nas mantissas da matriz Hilbert são zerados
A.astype(np.float__).astype(np.float64)
e depoisnp.linalg.svd
executadosfloat64
. (Os resultados comsvd
todosfloat32
são praticamente os mesmos.)Simplesmente truncar
float32
pode até ser útil para excluir dados de alta dimensão, por exemplo, para classificação de trem / teste.Casos de teste reais seriam bem-vindos.
fonte
numpy
escipy.linalg.svd
chame LAPACK gesdd , consulte o parâmetroJOBR
emdgejsv
: "Especifica o RANGE para os valores singulares. Emite a licença para definir zero valores singulares positivos pequenos se eles estiverem fora ..." (scipy.sparse.linalg.svds
quebra ARPACK e tem um parâmetrotol
, Tolerance para valores singulares.)float64
float32
fonte