Cholesky so với eigendecro để vẽ mẫu từ phân phối chuẩn nhiều biến số


16

Tôi muốn vẽ một mẫu . Wikipedia gợi ý sử dụng Cholesky hoặc Eigendecro , tức là hoặc xN(0,Σ)Σ=D1D1TΣ=QΛQT

Và do đó, mẫu có thể được rút ra thông qua: hoặc trong đó x=D1vx=QΛvvN(0,I)

Wikipedia cho thấy rằng cả hai đều tốt như nhau để tạo mẫu, nhưng phương pháp Cholesky có thời gian tính toán nhanh hơn. Điều này có đúng không? Đặc biệt là số khi sử dụng phương pháp monte-carlo, trong đó phương sai dọc theo đường chéo có thể khác nhau theo một số bậc độ lớn? Có bất kỳ phân tích chính thức về vấn đề này?


1
Damien, công thức tốt nhất để đảm bảo chương trình nào nhanh hơn là tự kiểm tra nó trên phần mềm của bạn: Các chức năng phân tách Cholesky- và Eigen- có thể khác nhau về tốc độ trong các triển khai khác nhau. Cách Cholesky phổ biến hơn, AFAIK, nhưng cách bản địa có thể có khả năng linh hoạt hơn.
ttnphns

1
Tôi hiểu Cholesky để nhanh hơn ( Wikipedia ) trong khi eigendecro là ( Thuật toán Jacobi Eigenvalue . Tuy nhiên, tôi có hai vấn đề nữa: (1) "Có khả năng linh hoạt hơn" nghĩa là gì ? và (2) Phương sai khác nhau theo một số bậc độ lớn ( so với đối với các phần tử cực đoan nhất) - điều này có ảnh hưởng đến thuật toán đã chọn không?O(N3/3)O(N3) 10 - 9104109
Damien

@Damien một khía cạnh của "linh hoạt hơn" là sự xuất tinh, đối với ma trận hiệp phương sai tương ứng với SVD , có thể được cắt bớt để có được xấp xỉ thứ hạng thấp tối ưu của ma trận đầy đủ. SVD bị cắt ngắn có thể được tính toán trực tiếp, thay vì tính toán toàn bộ và sau đó loại bỏ các giá trị riêng nhỏ.
GeoMatt22

Làm thế nào về việc đọc câu trả lời của tôi tại Stack Overflow: Lấy các đỉnh của hình elip trên một biểu đồ hiệp phương sai hình elip (được tạo bởi car::ellipse) . Mặc dù câu hỏi được hỏi trong ứng dụng khác nhau, lý thuyết đằng sau là như nhau. Bạn sẽ thấy những con số đẹp để giải thích hình học ở đó.
4/11/2016

Câu trả lời:


12

Vấn đề được nghiên cứu bởi Straka et.al cho Bộ lọc Kalman không tập trung , lấy các mẫu (xác định) từ phân phối chuẩn nhiều biến số như một phần của thuật toán. Với một số may mắn, kết quả có thể được áp dụng cho vấn đề monte-carlo.

Phân tách Cholesky (CD) và Phân tách Eigen (ED) - và đối với vấn đề đó, Căn bậc hai ma trận thực tế (MSR) là tất cả các cách mà ma trận bán xác định dương (PSD) có thể bị phá vỡ.

Hãy xem xét các SVD của một ma trận PSD, . Kể từ khi P là PSD, đây thực sự là giống như ED với P = U S U T . Hơn nữa, chúng ta có thể chia các ma trận đường chéo bằng căn bậc hai của nó: P = U P= =BạnSVTP= =BạnSBạnT, lưu ý rằngP= =BạnSSTBạnT.S= =ST

Bây giờ chúng tôi có thể giới thiệu một ma trận trực giao tùy ý :Ôi

.P= =BạnSÔiÔiTSTBạnT= =(BạnSÔi)(BạnSÔi)T

Sự lựa chọn thực sự ảnh hưởng đến hiệu suất ước tính, đặc biệt là khi có các yếu tố ngoài đường chéo mạnh của ma trận hiệp phương sai.Ôi

Bài viết nghiên cứu ba lựa chọn của :Ôi

  • , tương ứng với ED;Ôi= =Tôi
  • từphân hủy QRcủa U Ôi= =Q, tương ứng với CD; vàBạnS= =QR
  • dẫn đến ma trận đối xứng (ví dụ MSR)Ôi= =BạnT

Từ đó các kết luận sau được rút ra trong bài báo sau nhiều phân tích (trích dẫn):

  • Đối với một biến ngẫu nhiên được chuyển đổi với các phần tử không tương quan, cả ba MD được coi là cung cấp các điểm sigma giống hệt nhau và do đó chúng hầu như không có sự khác biệt về chất lượng của xấp xỉ [Biến đổi không tập trung]. Trong trường hợp như vậy, CD có thể được ưa thích vì chi phí thấp.

  • Nếu biến ngẫu nhiên chứa các phần tử tương quan, việc sử dụng [phân tách] khác nhau có thể ảnh hưởng đáng kể đến chất lượng của xấp xỉ [Biến đổi không tập trung] của ma trận trung bình hoặc hiệp phương sai của biến ngẫu nhiên được chuyển đổi. Hai trường hợp trên cho thấy [ED] nên được ưu tiên.

  • Nếu các phần tử của biến được biến đổi biểu thị mối tương quan mạnh mẽ để ma trận hiệp phương sai tương ứng gần như là số ít, thì phải tính đến một vấn đề khác, đó là tính ổn định về số của thuật toán tính toán MD. SVD ổn định hơn về mặt số đối với các ma trận hiệp phương sai đơn lẻ so với ChD.

Tài liệu tham khảo:

  • Straka, O.; Dunik, J.; Simandl, M. & Havlik, J. "Các khía cạnh và so sánh phân tách ma trận trong bộ lọc Kalman không tập trung", Hội nghị Kiểm soát Hoa Kỳ (ACC), 2013, 2013, 3075-3080.

6

Dưới đây là một minh họa đơn giản sử dụng R để so sánh thời gian tính toán của hai phương thức.

library(mvtnorm)
library(clusterGeneration)
set.seed(1234)
mean <- rnorm(1000, 0, 1)
sigma <- genPositiveDefMat(1000)
sigma <- sigma$Sigma

eigen.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "eigen")
  )

chol.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "chol")
  )

Thời gian chạy là

> eigen.time
   user  system elapsed 
   5.16    0.06    5.33 
> chol.time
   user  system elapsed 
   1.74    0.15    1.90

Khi tăng cỡ mẫu lên 10000, thời gian chạy là

> eigen.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "eigen")
+   )
> 
> chol.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "chol")
+   )
> eigen.time
   user  system elapsed 
   15.74    0.28   16.19 
> chol.time
   user  system elapsed 
   11.61    0.19   11.89 

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


3

Đây là bản trình diễn chứng minh bằng tay, hoặc người nghèo, chứng minh bản thân:

> set.seed(0)
> # The correlation matrix
> corr_matrix = matrix(cbind(1, .80, .2, .80, 1, .7, .2, .7, 1), nrow=3)
> nvar = 3 # Three columns of correlated data points
> nobs = 1e6 # One million observations for each column
> std_norm = matrix(rnorm(nvar * nobs),nrow=nobs, ncol=nvar) # N(0,1)   

Đúng= =[1.số 8.2.số 81.7.2.71]

N= =[[,1][,2][,3][1,]-1.08063380,65639130.8400443[2,]-1.1434241-0,1729738-0,9884772[999999,]0.48618270,03563006-2.1176976[1000000,]-0,43945511.69265517-1.9534729]

1. PHƯƠNG PHÁP SVD:

[Bạn[3×3]Σ0,5[d1000d2000d3]NT[3×106]]T
> ptm <- proc.time()
> # Singular Value Decomposition method:
> svd = svd(corr_matrix)   
> rand_data_svd = t(svd$u %*% (diag(3) * sqrt(svd$d)) %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.29    0.05    0.34 
> 
> ptm <- proc.time()

2. PHƯƠNG PHÁP CHOLESKY:

[Ch[c1100c21c220c31c32c33]NT[3×106]]T
> # Cholesky method:
> chole = t(chol(corr_matrix))
> rand_data_chole = t(chole %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.25    0.03    0.31 

Cảm ơn bạn @ userr11852 đã chỉ ra cho tôi rằng có một cách tốt hơn để tính toán sự khác biệt về hiệu suất giữa SVD và Cholesky, có lợi cho cái sau, sử dụng hàm này microbenchmark. Theo đề nghị của ông, đây là kết quả:

microbenchmark(chol(corr_matrix), svd(corr_matrix))
Unit: microseconds
              expr     min     lq      mean  median      uq     max neval cld
 chol(corr_matrix)  24.104  25.05  28.74036  25.995  26.467  95.469   100  a 
  svd(corr_matrix) 108.701 110.12 116.27794 111.065 112.719 223.074   100   b

@ user11852 Cảm ơn bạn. Tôi đọc con trỏ mục trên microbenchmarkvà nó thực sự làm cho một sự khác biệt.
Antoni Parellada

Chắc chắn, nhưng nó có một sự khác biệt trong hiệu suất ước tính?
Damien

Điểm tốt. Tôi đã không có thời gian để khám phá các gói.
Antoni Parellada
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.