2011-10-09 8 views
5

Me han dado una matriz muy grande (no puedo cambiar los valores de la matriz) y necesito calcular la inversa de una matriz (covarianza).det de una matriz devuelve 0 en matlab

A veces recibo diciendo el error

Matrix is close to singular or badly scaled. 
    Results may be inaccurate 

En estas situaciones que veo que el valor de la det devuelve 0.

Antes de calcular inversa (de una matriz de covarianza) Quiero comprobar el valor del det y realizar algo como esto

covarianceFea=cov(fea_class); 
covdet=det(covarianceFea); 
if(covdet ==0) 
    covdet=covdet+.00001; 
    %calculate the covariance using this new det 
end 

¿hay alguna manera de utilizar la nueva det y luego usar esto para calcular la inversa de la matriz de covarianza?

Respuesta

1

En tal escenario, calcular una inversa no es una muy buena idea. Si sólo hay que hacerlo, se recomienda usar esto para aumentar la precisión de visualización:

format long; 

Otra sugerencia podría ser la de tratar de usar un SVD de la matriz y juguetear un poco con los valores singulares allí.

A = U∑V' 
inv(A) = V*inv(∑)*U' 

Σ es una matriz diagonal donde se encuentra uno de los elementos de la diagonal cercano a 0. Trate de jugar un poco con este número si desea algún tipo de aproximación.

+0

existe la función de PINV pseudoinverse – Amro

16

suspiro. El cálculo del determinante para determinar la singularidad es algo ridículo, absolutamente. Especialmente para una gran matriz. Lo siento, pero lo es. ¿Por qué? Sí, algunos libros te dicen que lo hagas. Tal vez incluso tu instructor.

La singularidad analítica es una cosa. Pero, ¿qué hay de la determinación numérica de la singularidad? A menos que esté usando una herramienta simbólica, MATLAB usa la aritmética de punto flotante. Esto significa que almacena números como valores de coma flotante y precisión doble. Esos números no pueden ser más pequeño en magnitud que

>> realmin 
ans = 
    2.2251e-308 

(En realidad, MATLAB va un poco más bajo que, en términos de números no normalizados, que pueden ir hasta aproximadamente 1E-323.) Ver que cuando trato de guardar un número más pequeño que eso, MATLAB piensa que es cero.

>> A = 1e-323 
A = 
    9.8813e-324 

>> A = 1e-324 
A = 
    0 

¿Qué ocurre con una matriz grande? Por ejemplo, esta matriz es singular:

M = eye(1000); 

Dado que M es una matriz de identidad, es bastante claro que no es singular. De hecho, det sugiere que no es singular.

>> det(M) 
ans = 
    1 

Pero, multiplíquelo por una constante. ¿Eso lo hace no singular? ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡NO!!!!!!!!!!!!!!!!!!!!!!!! Por supuesto no. Pero inténtalo de todos modos.

>>  det(M*0.1) 
ans = 
    0 

Hmm. Eso es extraño. MATLAB me dice que el determinante es cero. Pero sabemos que el determinante es 1e-1000. Oh si. Gosh, 1e-1000 es más pequeño, en una cantidad considerable que el número más pequeño que acabo de mostrarle que MATLAB puede almacenar como un doble. Entonces el determinante se desborda, aunque obviamente no es cero. ¿Es la matriz singular? Por supuesto no. Pero, ¿el uso de det falla aquí?Por supuesto que lo hará, y esto es completamente esperado.

En su lugar, utilice una buena herramienta para la determinación de la singularidad. Use una herramienta como cond o rank. Por ejemplo, ¿podemos engañar al rango?

>> rank(M) 
ans = 
     1000 

>> rank(M*.1) 
ans = 
     1000 

Ver ese rango sabe que esta es una matriz de rango completo, independientemente de si se escala o no. Lo mismo puede decirse de cond, calculando el número de condición de M.

>> cond(M) 
ans = 
    1 

>> cond(M*.1) 
ans = 
    1 

Bienvenido al mundo de la aritmética de punto flotante. Y, por cierto, olvídate de det como una herramienta para casi cualquier cálculo que use aritmética de coma flotante. Es una mala elección casi siempre.

5

Woodchips le ha dado una muy buena explicación de por qué no debe usar el determinante. Esto parece ser una idea falsa común y su pregunta está muy relacionada con otra pregunta sobre matrices de inversión: Is there a fast way to invert a matrix in Matlab?, donde OP decidió que debido a que el determinante de su matriz era 1, ¡era definitivamente invertible! He aquí un fragmento de mi respuesta

En lugar de det(A)=1, que es el condition number of your matrix que dicta cómo es exacto o estable la inversa será. Tenga en cuenta que det(A)=∏i=1:n λi. Entonces, solo establecer λ1=M, λn=1/M y λi≠1,n=1 le dará det(A)=1. Sin embargo, como M → ∞, cond(A) = M2 → ∞ y λn → 0, lo que significa que su matriz se está acercando a la singularidad y habrá grandes errores numéricos en el cálculo de la inversa.

Esto se comprueba en MATLAB con el siguiente ejemplo sencillo:

A = eye(10); 
A([1 2]) = [1e15 1e-15]; 

%# calculate determinant 
det(A) 
ans = 

    1 

%# calculate condition number 
cond(A) 
ans = 

    1.0000e+30