Tạo căn bậc hai của ma trận hiệp phương sai xác định (Matlab)


9

Động lực : Tôi đang viết một công cụ ước tính trạng thái trong MATLAB (bộ lọc Kalman không tập trung), yêu cầu cập nhật căn bậc hai (tam giác trên) của ma trận hiệp phương sai ở mỗi lần lặp (nghĩa là cho ma trận hiệp phương sai P , đúng là P = S S T ). Để tôi thực hiện các tính toán cần thiết, tôi cần thực hiện Cập nhật Cholesky Hạng 1 và Hạ cấp bằng cách sử dụng chức năng của MATLAB .SPP=SSTcholupdate

Vấn đề : Thật không may, trong quá trình lặp lại, ma trận này đôi khi có thể mất đi sự dứt khoát tích cực. Việc hạ cấp Cholesky không thành công trên các ma trận không PD.S

Câu hỏi của tôi là : có bất kỳ cách đơn giản và đáng tin cậy nào trong MATLAB để làm cho dương tính rõ ràng không?S

( hay nói chung hơn, có cách nào tốt để làm cho bất kỳ ma trận hiệp phương sai nhất định nào xác định dương không?X )


Ghi chú :

  • là thứ hạng đầy đủS
  • Tôi đã thử cách tiếp cận eigendecro (không hiệu quả). Này về cơ bản liên quan đến việc tìm kiếm , thiết lập tất cả các yếu tố tiêu cực của V , D = 1 × 10 - 8 , và xây dựng lại một mới S ' = V ' D ' V ' T nơi V ' , D ' là ma trận với chỉ yếu tố tích cực.S=VDVTV,D=1×108S=VDVTV,D
  • Tôi biết về cách tiếp cận Higham (được thực hiện trong R như nearpd), nhưng dường như nó chỉ chiếu vào ma trận PSD gần nhất. Tôi cần một ma trận PD cho bản cập nhật Cholesky.

Tôi nghĩ có lẽ bạn muốn , nơi S là hiệp phương sai, và P là yếu tố Cholesky. S=PPSP
shabbychef

Thật ra tôi muốn (căn bậc hai, hoặc trong trường hợp này, yếu tố Cholesky) là xác định dương. Tôi đã làm rõ câu hỏi mặc dù; cảm ơn! S
Gilead

Tôi đang có cùng một vấn đề. Tôi đã thử hàm sqrtm (x) nhưng nó chỉ hoạt động trong vài lần lặp. Bạn đã tìm ra giải pháp?

Tôi đã thử nhiều phương pháp khác nhau, nhưng cuối cùng đã sử dụng thủ thuật tiêu chuẩn (không nghiêm ngặt) để gây nhiễu các đường chéo, tức là , trong đó k là một hằng số đủ lớn để làm cho S dương tính xác định. Có lẽ có những cách tiếp cận tốt hơn, nhưng cách này nhanh chóng và dễ dàng. S+kIkS
Gilead

Hơi muộn một chút, nhưng xoay vòng là một chiến lược hữu ích cho số lượng không ổn định.
xác suất

Câu trả lời:


4

Đây là mã tôi đã sử dụng trong quá khứ (sử dụng phương pháp SVD). Tôi biết bạn đã nói rằng bạn đã thử nó rồi, nhưng nó luôn hoạt động với tôi vì vậy tôi nghĩ tôi đã đăng nó để xem nó có hữu ích không.

function [sigma] = validateCovMatrix(sig)

% [sigma] = validateCovMatrix(sig)
%
% -- INPUT --
% sig:      sample covariance matrix
%
% -- OUTPUT --
% sigma:    positive-definite covariance matrix
%

EPS = 10^-6;
ZERO = 10^-10;

sigma = sig;
[r err] = cholcov(sigma, 0);

if (err ~= 0)
    % the covariance matrix is not positive definite!
    [v d] = eig(sigma);

    % set any of the eigenvalues that are <= 0 to some small positive value
    for n = 1:size(d,1)
        if (d(n, n) <= ZERO)
            d(n, n) = EPS;
        end
    end
    % recompose the covariance matrix, now it should be positive definite.
    sigma = v*d*v';

    [r err] = cholcov(sigma, 0);
    if (err ~= 0)
        disp('ERROR!');
    end
end

Cảm ơn cho nỗ lực của bạn - thật không may, nó đã không hoạt động. (Tôi đã làm một cái gì đó rất giống trong chương trình 3 dòng của tôi [V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';:). Cách tiếp cận này tương tự như phương pháp của Rebonato và Jackel, và dường như thất bại đối với các trường hợp bệnh lý như của tôi.
Gilead

Đó là quá xấu. Tôi quan tâm đến một ma trận ví dụ mà bạn đã tìm thấy khiến điều này (và các phương pháp khác bạn đã thử) thất bại nếu bạn có thời gian để đăng một. Đây là một vấn đề nghiêm trọng hơn để tiếp tục chạy vào, tôi hy vọng bạn tìm thấy một giải pháp.
Nick

2

trong Matlab:

help cholupdate

tôi có

CHOLUPDATE Rank 1 update to Cholesky factorization.
    If R = CHOL(A) is the original Cholesky factorization of A, then
    R1 = CHOLUPDATE(R,X) returns the upper triangular Cholesky factor of A + X*X',
    where X is a column vector of appropriate length.  CHOLUPDATE uses only the
    diagonal and upper triangle of R.  The lower triangle of R is ignored.

    R1 = CHOLUPDATE(R,X,'+') is the same as R1 = CHOLUPDATE(R,X).

    R1 = CHOLUPDATE(R,X,'-') returns the Cholesky factor of A - X*X'.  An error
    message reports when R is not a valid Cholesky factor or when the downdated
    matrix is not positive definite and so does not have a Cholesky factorization.

    [R1,p] = CHOLUPDATE(R,X,'-') will not return an error message.  If p is 0
    then R1 is the Cholesky factor of A - X*X'.  If p is greater than 0, then
    R1 is the Cholesky factor of the original A.  If p is 1 then CHOLUPDATE failed
    because the downdated matrix is not positive definite.  If p is 2, CHOLUPDATE
    failed because the upper triangle of R was not a valid Cholesky factor.

    CHOLUPDATE works only for full matrices.

    See also chol.

Tôi đang sử dụng cholupdatenhưng câu hỏi của tôi là về việc làm cho R(trong trường hợp này) xác định tích cực. Tôi có một trường hợp mà tôi Rkhông phải là pd, và cholupdate(R,X,'-')(một sự hạ cấp) không thành công.
Gilead

1
tất cả các thuật toán trực tuyến của hình thức này (cập nhật & hạ cấp) đều gặp phải các vấn đề chính xác như thế này. Tôi đã có vấn đề tương tự trong 1d dẫn đến ước tính phương sai âm. Đề nghị của tôi sẽ là giữ một bộ đệm tròn của các vectơ k cuối cùng được quan sát, và khi cholupdatethất bại, tính toán lại hiệp phương sai dựa trên bộ đệm tròn đó và ăn chi phí. Nếu bạn có bộ nhớ và có thể chịu được cú đánh thời gian không thường xuyên khi điều này xảy ra, bạn sẽ không tìm thấy một phương pháp nào tốt hơn về mặt chính xác và dễ thực hiện.
shabbychef

Cảm ơn, đó là điều cần suy nghĩ. Thật không may, ma trận hiệp phương sai của tôi trải qua rất nhiều biến đổi mà không rõ ràng tại điểm nào tôi phải tính toán lại từ bộ đệm tròn. Tuy nhiên, nếu thất bại, tôi có thể sử dụng ma trận hiệp phương sai PD đã biết cuối cùng - với hy vọng nó không tạo ra sai lệch trong ước tính của tôi.
Gilead

2

Một cách khác để tính hệ số Cholesky là sửa các phần tử đường chéo của S thành 1, sau đó đưa ra ma trận đường chéo D, với các phần tử dương.

Điều này tránh sự cần thiết phải lấy căn bậc hai khi thực hiện các phép tính, điều này có thể gây ra vấn đề khi xử lý các số "nhỏ" (tức là số đủ nhỏ để làm tròn số xảy ra do các hoạt động của dấu phẩy động). Các trang wikipedia có điều này điều chỉnh ngoại hình thuật toán thích.

P=SSTP=RDRTS=RD12

Hi vọng điêu nay co ich!


1
Cảm ơn, đó là một kỹ thuật tôi có thể sử dụng. Có vẻ như nó đã được triển khai ở đây: infohost.nmt.edu/~borchers/ldlt.html
Gilead

1

Thực tế, yếu tố Cholesky có thể thất bại khi ma trận của bạn không "thực sự" xác định. Hai trường hợp xuất hiện hoặc bạn có giá trị eingen âm hoặc giá trị eingen nhỏ nhất của bạn là dương, nhưng gần bằng không. Trường hợp thứ hai về mặt lý thuyết phải đưa ra một giải pháp, nhưng khó khăn về số lượng. Nếu chỉ trực quan thêm một hằng số nhỏ vào đường chéo của ma trận của tôi để giải quyết vấn đề. Nhưng cách này không nghiêm ngặt vì nó sửa đổi một chút giải pháp. Nếu bạn phải tính toán một giải pháp chính xác thực sự cao, hãy thử một số nghiên cứu về nhân tố Cholesky đã sửa đổi.


0

Nếu bạn cố gắng ước tính với P không xác định chắc chắn bạn đang yêu cầu các vấn đề và thuật toán sắp xếp lại, bạn nên tránh tình huống này. Nếu vấn đề của bạn là số: P là xác định dương nhưng giá trị riêng số quá nhỏ - hãy thử một lần mới cho các trạng thái của bạn Nếu vấn đề của bạn thực sự không xác định rõ ràng - hãy thử tập hợp các biến trạng thái khác nhau. Tôi hy vọng các cố vấn eis không quá muộn Trân trọng, Zeev

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.