He estado usando SVD de Intel MKL (a dgesvd
través de SciPy) y noté que los resultados son significativamente diferentes cuando cambio la precisión entre float32
y float64
cuando mi matriz está mal condicionada / no tiene rango completo. ¿Existe una guía sobre la cantidad mínima de regularización que debo agregar para que los resultados sean insensibles a float32
-> float64
cambios?
En particular, haciendo , Veo que norma de se mueve aproximadamente 1 cuando cambio la precisión entre float32
y float64
. norma de es y tiene alrededor de 200 valores propios cero de un total de 784.
Haciendo SVD en con hizo que la diferencia se desvaneciera.
numerical-analysis
stability
svd
intel-mkl
numerical-limitations
Yaroslav Bulatov
fuente
fuente
Respuestas:
Aunque la pregunta tiene una gran respuesta, aquí hay una regla general para pequeños valores singulares, con un gráfico.
Agregado: las siguientes dos líneas calculan esta regla general.
La matriz de Hilbert parece ser ampliamente utilizada como un caso de prueba para el error de redondeo:
Aquí los bits de orden inferior en las mantisas de la matriz de Hilbert se ponen a cero
A.astype(np.float__).astype(np.float64)
y luegonp.linalg.svd
se introducenfloat64
. (Los resultados consvd
todosfloat32
son casi iguales).Simplemente truncar
float32
podría incluso ser útil para eliminar datos de alta dimensión, por ejemplo, para la clasificación de trenes / pruebas.Casos de prueba reales serían bienvenidos.
fuente
numpy
yscipy.linalg.svd
llame a LAPACK gesdd , vea el parámetroJOBR
endgejsv
: "Especifica el RANGO para los valores singulares. Emite la licencia para poner a cero pequeños valores singulares positivos si están fuera ..." (scipy.sparse.linalg.svds
envuelve ARPACK y tiene un parámetrotol
, Tolerancia para valores singulares.)La descomposición del valor singular para una matriz simétrica.A=AT
es uno y el mismo que su descomposición propia canónica (es decir, con una matriz de vectores propios ortonormales), mientras que lo mismo para una matriz no simétrica M=UΣVT es solo la descomposición del valor propio canónico para la matriz simétrica
La respuesta es un sorprendente no. Dejarϵ>0 ser pequeño y considerar las dos matrices
Ahora, aplicando esta información al SVD con precisión finita, escribamosM0=U0Σ0VT0 como su matriz en Mϵ=UϵΣϵVTϵ
como la misma matriz en Σ0,Σϵ
debe diferir en no más que un pequeño factor constante de ϵ≈10−7 , pero los vectores singulares U0,Uϵ y V0,Vϵ
puede diferir en una cantidad arbitrariamente grande. Por lo tanto, como se muestra, no hay forma de hacer que la SVD sea "estable" en el sentido de los vectores singulares.
float64
precisión, yfloat32
precisión. Si suponemos que los SVD son exactos, entonces los valores singularesfuente