Tôi ước tính ma trận hiệp phương sai mẫu của một mẫu và lấy ma trận đối xứng. Với , tôi muốn tạo -variate rn phân phối bình thường nhưng do đó tôi cần sự phân hủy Cholesky của . Tôi nên làm gì nếu không xác định dương?
Tôi ước tính ma trận hiệp phương sai mẫu của một mẫu và lấy ma trận đối xứng. Với , tôi muốn tạo -variate rn phân phối bình thường nhưng do đó tôi cần sự phân hủy Cholesky của . Tôi nên làm gì nếu không xác định dương?
Câu trả lời:
Những mối quan tâm câu hỏi làm thế nào để tạo ra variates ngẫu nhiên từ một phân phối chuẩn nhiều chiều với một (có thể) số ít hiệp phương sai ma trận . Câu trả lời này giải thích một cách sẽ hoạt động cho bất kỳ ma trận hiệp phương sai nào . Nó cung cấp một thực hiện kiểm tra độ chính xác của nó.R
Bởi vì là một ma trận hiệp phương sai, nên nó nhất thiết phải là đối xứng và bán cực dương. Để hoàn thành các thông tin cơ bản, chúng ta hãy μ là vector của phương tiện mong muốn.
Bởi vì là đối xứng, Phân rã giá trị số đơn (SVD) và phân tích xuất tinh của nó sẽ tự động có dạng
đối với một số ma trận trực giao và ma trận đường chéo D 2 . Nói chung, các phần tử đường chéo của D 2 là không âm (ngụ ý tất cả chúng đều có căn bậc hai thực sự: chọn các phần tử dương để tạo thành ma trận đường chéo D ). Thông tin chúng tôi có về nói rằng một hoặc nhiều trong số các phần tử đường chéo này bằng 0 - nhưng điều đó sẽ không ảnh hưởng đến bất kỳ hoạt động nào sau đó, và cũng sẽ không ngăn SVD được tính toán.
Hãy có phân phối chuẩn nhiều chiều tiêu chuẩn: mỗi thành phần có không có nghĩa là, đơn vị sai, và tất cả các hiệp phương sai là zero: ma trận hiệp phương sai của nó là bản sắc tôi . Khi đó biến ngẫu nhiên Y = V D X có ma trận hiệp phương sai
Do đó các biến ngẫu nhiên có phân phối chuẩn nhiều chiều với trung bình μ và phương sai ma trận C .
Đoạn R
mã sau tạo ra ma trận hiệp phương sai có thứ nguyên và thứ hạng nhất định, phân tích nó với SVD (hoặc, trong mã nhận xét, với một phép tách rời), sử dụng phân tích đó để tạo ra một số lượng nhận biết cụ thể của (với vectơ trung bình 0 ) và sau đó so sánh ma trận hiệp phương sai của các dữ liệu đó với ma trận hiệp phương sai dự định cả về số lượng và đồ họa. Như được hiển thị, nó tạo ra 10 , 000 nhận thức trong đó thứ nguyên của Y là 100 và thứ hạng của C là 50 . Đầu ra là
rank L2
5.000000e+01 8.846689e-05
Nghĩa là, thứ hạng của dữ liệu cũng là và ma trận hiệp phương sai theo ước tính từ dữ liệu nằm trong khoảng cách 8 × 10 - 5 của C - trong đó gần. Khi kiểm tra chi tiết hơn, các hệ số của C được vẽ dựa trên các ước tính của nó. Tất cả đều nằm sát đường đẳng thức:
Mã chính xác tương đương với phân tích trước đó và do đó nên tự giải thích (ngay cả với những R
người không sử dụng, những người có thể mô phỏng nó trong môi trường ứng dụng yêu thích của họ). Một điều nó tiết lộ là sự cần thiết phải thận trọng khi sử dụng thuật toán dấu phẩy động: các mục của có thể dễ dàng bị âm (nhưng nhỏ) do không chính xác. Các mục như vậy cần được loại bỏ trước khi tính toán căn bậc hai để tìm chính D.
n <- 100 # Dimension
rank <- 50
n.values <- 1e4 # Number of random vectors to generate
set.seed(17)
#
# Create an indefinite covariance matrix.
#
r <- min(rank, n)+1
X <- matrix(rnorm(r*n), r)
C <- cov(X)
#
# Analyze C preparatory to generating random values.
# `zapsmall` removes zeros that, due to floating point imprecision, might
# have been rendered as tiny negative values.
#
s <- svd(C)
V <- s$v
D <- sqrt(zapsmall(diag(s$d)))
# s <- eigen(C)
# V <- s$vectors
# D <- sqrt(zapsmall(diag(s$values)))
#
# Generate random values.
#
X <- (V %*% D) %*% matrix(rnorm(n*n.values), n)
#
# Verify their covariance has the desired rank and is close to `C`.
#
s <- svd(Sigma <- cov(t(X)))
(c(rank=sum(zapsmall(s$d) > 0), L2=sqrt(mean(Sigma - C)^2)))
plot(as.vector(C), as.vector(Sigma), col="#00000040",
xlab="Intended Covariances",
ylab="Estimated Covariances")
abline(c(0,1), col="Gray")
Phương pháp giải A :
Trong MATLAB, mã sẽ là
D = 0.5 * (C + C');
D = D + (m - min(eig(CD)) * eye(size(D));
Phương pháp giải B : Xây dựng và giải SDP lồi (Chương trình xác định nửa cung) để tìm ma trận D đến C gần nhất theo chỉ tiêu frobenius về sự khác biệt của chúng, sao cho D là xác định dương, có giá trị riêng xác định tối thiểu m.
Sử dụng CVX trong MATLAB, mã sẽ là:
n = size(C,1);
cvx_begin
variable D(n,n)
minimize(norm(D-C,'fro'))
D -m *eye(n) == semidefinite(n)
cvx_end
So sánh các phương pháp giải pháp : Ngoài việc đối xứng với ma trận ban đầu, phương pháp giải pháp A chỉ điều chỉnh (tăng) các phần tử đường chéo theo một số lượng phổ biến và giữ nguyên các phần tử đường chéo không thay đổi. Phương pháp giải B tìm thấy ma trận xác định dương gần nhất (với ma trận gốc) có giá trị riêng tối thiểu xác định, theo nghĩa là chỉ tiêu frobenius tối thiểu của sự khác biệt của ma trận xác định dương D và ma trận gốc C, dựa trên tổng của bình phương khác biệt của tất cả các yếu tố của D - C, bao gồm các yếu tố ngoài đường chéo. Vì vậy, bằng cách điều chỉnh các yếu tố ngoài đường chéo, nó có thể làm giảm số lượng các yếu tố đường chéo cần được tăng lên và các yếu tố diagoanl không nhất thiết phải tăng cùng một lượng.
Tôi sẽ bắt đầu bằng cách nghĩ về mô hình mà bạn đang ước tính.
Nếu ma trận hiệp phương sai không tích cực bán xác định, nó có thể chỉ ra rằng bạn có vấn đề về màu sắc trong các biến của mình, điều này cho thấy có vấn đề với mô hình và không nhất thiết phải được giải quyết bằng phương pháp số.
Nếu ma trận không phải là nửa cực dương vì lý do số, thì có một số giải pháp có thể được đọc ở đây
Một cách sẽ là tính toán ma trận từ phân tách eigenvalue. Bây giờ tôi sẽ thừa nhận rằng tôi không biết quá nhiều về Toán học đằng sau các quy trình này nhưng từ nghiên cứu của tôi, có vẻ hiệu quả khi xem tệp trợ giúp này:
http://stat.ethz.ch/R-manual/R-patched/l Library / Mathrix / html / chol.html
và một số lệnh liên quan khác trong R.
Ngoài ra, hãy xem 'nearPD' trong gói Matrix.
Xin lỗi tôi không thể giúp đỡ nhiều hơn nhưng tôi hy vọng việc tìm kiếm xung quanh có thể giúp đẩy bạn đi đúng hướng.
Bạn có thể nhận kết quả từ hàm nearPD trong gói Matrix trong R. Điều này sẽ cung cấp cho bạn một ma trận có giá trị thực.
library(Matrix)
A <- matrix(1, 3,3); A[1,3] <- A[3,1] <- 0
n.A <- nearPD(A, corr=T, do2eigen=FALSE)
n.A$mat
# 3 x 3 Matrix of class "dpoMatrix"
# [,1] [,2] [,3]
# [1,] 1.0000000 0.7606899 0.1572981
# [2,] 0.7606899 1.0000000 0.7606899
# [3,] 0.1572981 0.7606899 1.0000000