2011-10-09 42 views
5

Tôi đã đưa ra một ma trận rất lớn (tôi không thể thay đổi giá trị của ma trận) và tôi cần tính toán nghịch đảo của ma trận (hiệp phương sai).det của ma trận trả về 0 trong MATLAB

Đôi khi tôi nhận được lỗi nói

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

Trong những tình huống này tôi thấy rằng giá trị của det trả về 0.

Trước khi tính toán nghịch đảo (của một ma trận hiệp phương sai) Tôi muốn kiểm tra giá trị của người thực hiện và thực hiện một cái gì đó như thế này

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

Có cách nào để sử dụng tổ hợp mới và sau đó sử dụng điều này để tính toán nghịch đảo của ma trận hiệp phương sai?

Trả lời

1

Trong trường hợp như vậy, tính toán nghịch đảo không phải là một ý tưởng hay. Nếu bạn chỉ phải làm điều đó, tôi sẽ đề nghị sử dụng này để tăng độ chính xác hiển thị:

format long; 

gợi ý khác có thể là thử sử dụng một SVD của ma trận và tinker xung quanh với những giá trị đặc biệt đó.

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

∑ là ma trận đường chéo nơi bạn sẽ thấy một trong các mục nhập đường chéo gần 0. Hãy thử chơi với số này nếu bạn muốn một số loại xấp xỉ.

+0

có chức năng PINV cho pseudoinverse – Amro

16

Thở dài. Tính toán các yếu tố quyết định để xác định sự kỳ dị là một điều vô lý để làm, hoàn toàn như vậy. Đặc biệt là cho một ma trận lớn. Xin lỗi, nhưng nó là. Tại sao? Có, một số sách cho bạn biết để làm điều đó. Có lẽ ngay cả người hướng dẫn của bạn.

Độc đáo phân tích là một chuyện. Nhưng làm thế nào về việc xác định số ít? Trừ khi bạn đang sử dụng một công cụ tượng trưng, ​​MATLAB sử dụng số học dấu chấm động. Điều này có nghĩa là nó lưu trữ số dưới dạng dấu phẩy động, giá trị chính xác kép. Những con số này không thể nhỏ trong độ lớn hơn

>> realmin 
ans = 
    2.2251e-308 

(Trên thực tế, MATLAB đi thấp hơn một chút, về mặt số denormalized, có thể đi xuống khoảng 1e-323.) Thấy rằng khi tôi cố gắng để lưu trữ một số nhỏ hơn thế, MATLAB nghĩ nó bằng không.

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

>> A = 1e-324 
A = 
    0 

Điều gì sẽ xảy ra với ma trận lớn? Ví dụ: ma trận này là số ít:

M = eye(1000); 

Vì M là ma trận nhận dạng, nó khá rõ ràng không phải là số ít. Thực tế, det cho rằng nó không phải là số ít.

>> det(M) 
ans = 
    1 

Nhưng, nhân nó với một số hằng số. Điều đó làm cho nó không phải là số ít? KHÔNG!!!!!!!!!!!!!!!!!!!!!!!! Tất nhiên là không. Nhưng hãy thử nó.

>>  det(M*0.1) 
ans = 
    0 

Hmm. Thats là lẻ. MATLAB cho tôi biết yếu tố quyết định là bằng không. Nhưng chúng ta biết rằng yếu tố quyết định là 1e-1000. Ồ, vâng. Gosh, 1e-1000 nhỏ hơn, bởi một số lượng đáng kể so với số lượng nhỏ nhất mà tôi chỉ cho bạn thấy rằng MATLAB có thể lưu trữ như là một đôi. Vì vậy, các yếu tố quyết định underflows, mặc dù nó rõ ràng là khác không. Là số ít ma trận? Tất nhiên là không. Nhưng việc sử dụng det thất bại ở đây?Tất nhiên nó sẽ, và điều này là hoàn toàn mong đợi.

Thay vào đó, hãy sử dụng một công cụ tốt để xác định điểm kỳ dị. Sử dụng công cụ như cond hoặc xếp hạng. Ví dụ, chúng ta có thể đánh lừa thứ hạng không?

>> rank(M) 
ans = 
     1000 

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

Xem xếp hạng đó biết rằng đây là ma trận xếp hạng đầy đủ, bất kể chúng tôi có quy mô hay không. Điều này cũng đúng với điều kiện, tính toán số điều kiện của M.

>> cond(M) 
ans = 
    1 

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

Chào mừng bạn đến với thế giới của số học dấu phẩy động. Và, bằng cách này, hãy quên det như một công cụ cho hầu như bất kỳ tính toán nào bằng cách sử dụng số học dấu chấm động. Nó là một sự lựa chọn nghèo hầu như luôn luôn.

5

Woodchips đã cung cấp cho bạn giải thích rất tốt về lý do bạn không nên sử dụng yếu tố quyết định. Điều này có vẻ là một quan niệm sai lầm phổ biến và câu hỏi của bạn rất liên quan đến một câu hỏi khác về ma trận nghịch đảo: Is there a fast way to invert a matrix in Matlab?, trong đó OP quyết định rằng vì yếu tố quyết định của ma trận là 1, nó chắc chắn là không thể đảo ngược! Đây là một đoạn trích từ câu trả lời của tôi

Thay vì det(A)=1, đó là condition number of your matrix quy định mức độ nghịch đảo chính xác hoặc ổn định. Lưu ý rằng det(A)=∏i=1:n λi. Vì vậy, chỉ cần đặt λ1=M, λn=1/Mλi≠1,n=1 sẽ cung cấp cho bạn det(A)=1. Tuy nhiên, như M → ∞, cond(A) = M2 → ∞λn → 0, có nghĩa là ma trận của bạn đang tiến gần đến điểm kỳ dị và sẽ có các lỗi số lớn trong tính toán nghịch đảo.

Bạn có thể kiểm tra điều này trong MATLAB với các ví dụ đơn giản sau:

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

%# calculate determinant 
det(A) 
ans = 

    1 

%# calculate condition number 
cond(A) 
ans = 

    1.0000e+30 
Các vấn đề liên quan