2011-10-09 32 views
5

Otrzymałem bardzo dużą macierz (nie mogę zmienić wartości macierzy) i potrzebuję obliczyć odwrotność macierzy (kowariancji).det macierzy zwraca 0 w matlab

Czasami dostaję błąd mówiąc

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

w takich sytuacjach widzę, że wartość det zwraca 0.

Przed obliczeniem odwrotność (macierzy kowariancji) Chcę sprawdzić wartość z det i wykonać coś takiego

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

Czy istnieje jakiś sposób, aby korzystać z nowej det a następnie użyć tego obliczyć odwrotność macierzy kowariancji?

Odpowiedz

1

W takim scenariuszu obliczanie odwrotności nie jest dobrym pomysłem. Jeśli po prostu trzeba to zrobić, chciałbym zaproponować za pomocą tego, aby zwiększyć dokładność wyświetlania:

format long; 

Inne sugestia może być spróbować za pomocą SVD macierzy i majstrować wokół z wartości osobliwych tam.

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

Σ jest macierzą diagonalną, gdzie można zobaczyć jedną z przekątnych wpisów blisko 0. Spróbuj gry z tej liczby, jeśli chcesz jakieś przybliżenie.

+0

istnieje funkcja PINV dla pseudoinverse – Amro

16

Westchnienie. Obliczenie wyznacznika w celu określenia osobliwości jest absolutnie absurdalne. Zwłaszcza w przypadku dużej matrycy. Przepraszam, ale tak jest. Czemu? Tak, niektóre książki każą ci to zrobić. Może nawet twój instruktor.

Analityczna osobliwość to jedno. Ale co z liczbowym określeniem osobliwości? O ile nie używasz symbolicznego narzędzia, MATLAB używa arytmetyki zmiennoprzecinkowej. Oznacza to, że zapisuje liczby jako wartości zmiennoprzecinkowe, podwójnej precyzji. Liczby te nie mogą być mniejsze w wielkości niż

>> realmin 
ans = 
    2.2251e-308 

(Faktycznie, MATLAB idzie nieco niższe niż, że pod względem liczby nieznormalizowane, które mogą spadać do około 1E-323). Zobacz, że gdy próbuję zapisać liczba mniejsza od tej, MATLAB uważa, że ​​wynosi zero.

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

>> A = 1e-324 
A = 
    0 

Co dzieje się z dużą matrycą? Na przykład, ta macierz liczby pojedynczej:

M = eye(1000); 

Ponieważ M jest matrycą tożsamości, jest dość wyraźnie nietypowe. W rzeczywistości det sugeruje, że jest nietypowy.

>> det(M) 
ans = 
    1 

Ale pomnóż go przez pewną stałą. Czy to sprawia, że ​​jest nietypowy? NIE!!!!!!!!!!!!!!!!!!!!!!!! Oczywiście nie. Ale spróbuj mimo to.

>>  det(M*0.1) 
ans = 
    0 

Hmm. To dziwne. MATLAB mówi mi, że wyznacznikiem jest zero. Ale wiemy, że wyznacznikiem jest 1e-1000. O tak. Gosh, 1e-1000 jest mniejszy, o znaczną kwotę niż najmniejsza liczba, którą właśnie pokazałem ci, że MATLAB może przechowywać jako podwójne. Wynika z tego niedobór, mimo że jest oczywiście niezerowy. Czy macierz jest pojedyncza? Oczywiście nie. Ale czy użycie detu nie działa tutaj?Oczywiście, że tak, a to jest całkowicie oczekiwane.

Zamiast tego użyj dobrego narzędzia do określania osobliwości. Użyj narzędzia takiego jak cond lub rang. Na przykład, czy możemy wygrać rangę?

>> rank(M) 
ans = 
     1000 

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

Widzisz, że ta kategoria wie, że jest to matryca o pełnej randze, niezależnie od tego, czy ją skalujemy, czy nie. To samo dotyczy cond, obliczając numer warunku M.

>> cond(M) 
ans = 
    1 

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

Witamy w świecie arytmetyki zmiennoprzecinkowej. O, przy okazji, zapomnij o detie jako narzędziu do prawie wszystkich obliczeń z wykorzystaniem arytmetyki zmiennoprzecinkowej. Jest to kiepski wybór prawie zawsze.

5

Zrębki dały ci bardzo dobre wytłumaczenie, dlaczego nie powinieneś używać wyznacznika. To wydaje się być powszechnym błędnym przekonaniem, a twoje pytanie jest bardzo związane z innym pytaniem na temat odwracania matryc: Is there a fast way to invert a matrix in Matlab?, gdzie OP zadecydował, że ponieważ wyznacznikiem jego matrycy było 1, to było zdecydowanie odwracalne! Oto fragment z mojej odpowiedzi

Zamiast det(A)=1, to condition number of your matrix dyktuje jak dokładne i stabilne odwrotność będzie. Zauważ, że det(A)=∏i=1:n λi. Dlatego ustawienie λ1=M, λn=1/M i λi≠1,n=1 daje det(A)=1. Jednak, jako macierz, zbliża się do osobliwości i wystąpią duże błędy numeryczne w obliczaniu odwrotności.

Można to sprawdzić w programie MATLAB z następującym prostym przykładzie:

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

%# calculate determinant 
det(A) 
ans = 

    1 

%# calculate condition number 
cond(A) 
ans = 

    1.0000e+30