Tạo các số ngẫu nhiên phân phối bình thường với ma trận hiệp phương sai không xác định


15

Tôi ước tính ma trận hiệp phương sai mẫu C của một mẫu và lấy ma trận đối xứng. Với C , tôi muốn tạo n -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 C . Tôi nên làm gì nếu C không xác định dương?


1
Sự khác biệt với câu hỏi stackoverflow.com/questions/17295627/ này là gì?
Dickoa

1
Ma trận bán nguyệt dương có nhiều căn bậc hai (xem phần giải thích ở cuối số liệu thống kê.stackexchange.com/a/71303/919 chẳng hạn). Bạn không nhất thiết cần một cái được tạo ra bởi sự phân tách Cholesky. Trong đó nằm ở trung tâm của vấn đề: tìm một phương pháp để tính căn bậc hai hoạt động ngay cả khi ma trận là số ít. @amoeba Tiêu đề cho thấy giải thích của bạn là chính xác.
whuber

Câu trả lời:


8

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ó.CR


Phân tích đại số của ma trận hiệp phương sai

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.Cμ

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ạngC

C=VD2V

đố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ềVD2D2D 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.C

Tạo các giá trị ngẫu nhiên đa biế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 saiXIY=VDX

Cov(Y)=E(YY)=E(VDXXDV)=VDE(XX)DV=VDIDV=VD2V=C.

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 .μ+YμC

Mã tính toán và ví dụ

Đoạn Rmã 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 Y100 và thứ hạng của C50 . Đầu ra làY010,000Y100C50

        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:508×105CC

Figure

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 Rngườ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.D2D

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")

2
+1 nhưng khi bạn nói "không xác định" trong câu đầu tiên, bạn có ý gì chính xác? Tôi đã kiểm tra trên Wikipedia và nó nói rằng semidefinite dương không phải là không xác định, tức là không xác định có nghĩa là C có cả giá trị riêng dương và âm. Có phải đó là những gì bạn có ý nghĩa?
amip nói rằng Phục hồi Monica

2
@amoeba Vâng, đó là một phiếu. Cảm ơn đã chú ý. "Không xác định" có nghĩa là chữ ký của ma trận có cả dấu dương và âm, trong khi "semidefinite" có nghĩa là chữ ký chỉ có một dấu.
whuber

6

Phương pháp giải A :

  1. Nếu C không đối xứng thì đối xứng nó. D <-0.5(C+CT)
  2. D+(mmin(eigenvalue(D)))I , trong đó tôi là ma trận danh tính. D chứa ma trận hiệp phương sai xác định dương mong muốn.

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.


2

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


1
Giả định là mô hình là mô hình hỗn hợp tuyến tính. Và trong trường hợp này, nó không liên quan để tìm một mô hình chính xác cho dữ liệu, thay vào đó dữ liệu được đưa ra làm ví dụ cho một số tính toán. Bây giờ có khả năng bạn có được một ma trận semidefinite không tích cực như là ước tính cho covaraince. Vậy phải làm gì từ đó, nếu tôi muốn tìm ra hiệp phương sai từ dân số phân tán bình thường nơi dữ liệu đến từ đó. Rằng mẫu được phân phối bình thường là giả định.
Klaus

1

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.


Xin chào, thx cho các liên kết. Tương ứng với phân tách giá trị bản địa, phân tách này không giúp ích gì, vì từ đó bạn có được các giá trị riêng phức tạp cho ma trận căn bậc hai, nhưng tôi cần bán lại ma trận có giá trị.
Klaus

1

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

Đối với người dùng R .. đây có thể không phải là phiên bản "người nghèo" tồi (với ít quyền kiểm soát hơn) trong Phương pháp B trong câu trả lời của tôi.
Mark L. Stone

Tôi đồng ý rằng điều này là không tối ưu nhưng đôi khi nó thực hiện các mẹo.
Bác sĩ Mike
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.