Làm thế nào để tạo hiệu quả các ma trận tương quan dương-semidefinite ngẫu nhiên?


38

Tôi muốn có thể tạo hiệu quả các ma trận tương quan bán chính xác (PSD) một cách hiệu quả. Phương pháp của tôi chậm lại đáng kể khi tôi tăng kích thước ma trận được tạo.

  1. Bạn có thể đề xuất bất kỳ giải pháp hiệu quả? Nếu bạn biết bất kỳ ví dụ nào trong Matlab, tôi sẽ rất biết ơn.
  2. Khi tạo ma trận tương quan PSD, bạn sẽ chọn các tham số để mô tả ma trận được tạo như thế nào? Một tương quan trung bình, độ lệch chuẩn của tương quan, giá trị riêng?

Câu trả lời:


16

Bạn có thể làm điều đó ngược lại: mọi ma trận (tập hợp tất cả các ma trận đối xứng PSD) có thể được phân tách thành p × pCR++pp×p

C=OTDO trong đó là ma trận trực giaoO

Để nhận , trước tiên hãy tạo cơ sở ngẫu nhiên (trong đó( v 1 , . . . , V p )O(v1,...,vp) là các vectơ ngẫu nhiên, thường là trong ( - 1 , 1 ) ). Từ đó, sử dụng quá trình orthogonalization Gram-Schmidt để có được ( u 1 , . . . . , U p ) = Ovi(1,1)(u1,....,up)=O

có một số gói có thể thực hiện trực giao GS một cách hiệu quả một cơ sở ngẫu nhiên, thậm chí là cho các kích thước lớn, ví dụ như gói 'xa'. Mặc dù bạn sẽ tìm thấy thuật toán GS trên wiki, nhưng tốt hơn hết là không nên phát minh lại bánh xe và thực hiện triển khai MATLAB (chắc chắn tồn tại, tôi chỉ không thể đề xuất bất kỳ).R

Cuối cùng, là một ma trận đường chéo mà các thành phần đều là tích cực (đây là, một lần nữa, dễ dàng để tạo: tạo ra p số ngẫu nhiên, vuông chúng, sắp xếp chúng và đặt chúng cho đến các đường chéo của một bản sắc p bởi p ma trận).Dppp


3
(1) Lưu ý rằng kết quả sẽ không phải là ma trận tương quan (theo yêu cầu của OP), vì nó sẽ không có ma trận trên đường chéo. Tất nhiên nó có thể được thay đổi tỷ lệ có những người trên đường chéo, bằng cách thiết lập nó để E - 1 / 2 C E - 1 / 2 , nơi E là một ma trận đường chéo với đường chéo giống như C . (2) Nếu tôi không nhầm, điều này sẽ dẫn đến ma trận tương quan trong đó tất cả các yếu tố ngoài đường chéo tập trung quanh 0 , do đó OP không tìm kiếm sự linh hoạt (OP muốn có thể đặt "tương quan trung bình , độ lệch chuẩn của tương quan, giá trị riêng "CE1/2CE1/2EC0)
amip nói phục hồi Monica

@amoeba: Tôi sẽ giải quyết (2) vì, như bạn chỉ ra, giải pháp cho (1) là tầm thường. Đặc tính một số của "hình dạng" (mối quan hệ giữa các phần tử trong và ngoài đường chéo) của ma trận PSD (và do đó là hiệp phương sai và cũng là ma trận tương quan) là số điều kiện của nó. Và, phương pháp được mô tả ở trên cho phép toàn quyền kiểm soát nó. 'Nồng độ của các phần tử đường chéo xung quanh 0' không phải là một tính năng của phương pháp được sử dụng để tạo ma trận PSD, nhưng, do đó, hậu quả của các ràng buộc cần thiết để đảm bảo ma trận là PSD và thực tế là lớn. p
dùng603

Bạn đang nói rằng tất cả các ma trận PSD lớn có các phần tử đường chéo gần bằng 0? Tôi không đồng ý, nó không phải như vậy. Kiểm tra câu trả lời của tôi ở đây để biết một số ví dụ: Làm thế nào để tạo ma trận tương quan ngẫu nhiên có các mục ngoài đường chéo được phân phối bình thường với độ lệch chuẩn đã cho? Nhưng có một trực tiếp có thể thấy rằng nó không phải là trường hợp, vì một ma trận vuông có tất cả những người trên đường chéo và một giá trị cố định ở khắp mọi nơi off-đường chéo là PSD và ρ có thể tùy tiện lớn (nhưng tất nhiên dưới đây 1 ). ρρ1
amip nói phục hồi Monica

@amoeba: sau đó tôi đã sai khi cho rằng do sự cần thiết của đường chéo của ma trận tương quan lớn khi chúng được phép cả dương cũng như âm đều gần bằng 0. Cảm ơn ví dụ khai sáng.
dùng603

1
Tôi đã đọc một bài báo rất hay về việc tạo ma trận tương quan ngẫu nhiên và cung cấp câu trả lời của riêng tôi ở đây (cũng như một câu trả lời khác trong chuỗi liên kết đó). Tôi nghĩ rằng bạn có thể thấy nó thú vị.
amip nói rằng Phục hồi Monica

27

Một bài báo Tạo ma trận tương quan ngẫu nhiên dựa trên dây leo và phương pháp hành tây mở rộng của Lewandowski, Kurowicka và Joe (LKJ), 2009, cung cấp một phương pháp điều trị thống nhất và giải thích hai phương pháp hiệu quả tạo ra ma trận tương quan ngẫu nhiên. Cả hai phương pháp đều cho phép tạo ma trận từ một phân phối đồng đều theo một nghĩa chính xác nhất định được xác định dưới đây, đơn giản để thực hiện, nhanh chóng và có thêm lợi thế là có các tên gây cười.

Một ma trận đối xứng thực sự của kích thước với những người thân trên đường chéo có d ( d - 1 ) / 2 yếu tố off-đường chéo độc đáo và như vậy có thể được parametrized như một điểm trong R d ( d - 1 ) / 2 . Mỗi điểm trong không gian này tương ứng với một ma trận đối xứng, nhưng không phải tất cả chúng đều có giá trị dương xác định (như các ma trận tương quan phải có). Do đó ma trận tương quan tạo thành một tập hợp con của R d ( d - 1 ) / 2d×dd(d1)/2Rd(d1)/2Rd(d1)/2 (thực sự là một tập hợp con lồi được kết nối) và cả hai phương thức có thể tạo các điểm từ một phân phối đồng đều trên tập hợp con này.

Tôi sẽ cung cấp thực hiện MATLAB riêng của tôi về từng phương pháp và minh họa chúng với .d=100


Phương pháp hành tây

Phương pháp hành xuất phát từ giấy khác (ref # 3 trong LKJ) và sở hữu tên thành thực tế các ma trận tương quan được tạo ra bắt đầu với ma trận và phát triển nó cột theo cột và từng hàng. Kết quả phân phối là thống nhất. Tôi không thực sự hiểu toán học đằng sau phương thức này (và dù sao cũng thích phương pháp thứ hai), nhưng đây là kết quả:1×1

Phương pháp hành tây

Ở đây và bên dưới tiêu đề của mỗi ô phụ cho thấy giá trị riêng nhỏ nhất và lớn nhất và định thức (sản phẩm của tất cả các giá trị riêng). Đây là mã:

%// ONION METHOD to generate random correlation matrices distributed randomly
function S = onion(d)
    S = 1;
    for k = 2:d
        y = betarnd((k-1)/2, (d-k)/2); %// sampling from beta distribution
        r = sqrt(y);
        theta = randn(k-1,1);
        theta = theta/norm(theta);
        w = r*theta;
        [U,E] = eig(S);
        R = U*E.^(1/2)*U';             %// R is a square root of S
        q = R*w;
        S = [S q; q' 1];               %// increasing the matrix size
    end
end

Phương pháp hành tây mở rộng

LKJ sửa đổi phương thức này một chút, để có thể lấy mẫu ma trận tương quan từ một phân phối tỷ lệ với [ d e tC . Càng lớn thì η , lớn hơn sẽ là yếu tố quyết định, có nghĩa là ma trận tương quan được tạo ra sẽ ngày càng tiếp cận nhận dạng ma trận. Giá trị η = 1 tương ứng với phân phối đồng đều. Trên hình bên dưới các ma trận được tạo ra với η = 1 , 10 , 100 , 1000 , 10[detC]η1ηη=1 .η=1,10,100,1000,10000,100000

Phương pháp hành tây mở rộng

η=0η=1

%// EXTENDED ONION METHOD to generate random correlation matrices
%// distributed ~ det(S)^eta [or maybe det(S)^(eta-1), not sure]
function S = extendedOnion(d, eta)
    beta = eta + (d-2)/2;
    u = betarnd(beta, beta);
    r12 = 2*u - 1;
    S = [1 r12; r12 1];  

    for k = 3:d
        beta = beta - 1/2;
        y = betarnd((k-1)/2, beta);
        r = sqrt(y);
        theta = randn(k-1,1);
        theta = theta/norm(theta);
        w = r*theta;
        [U,E] = eig(S);
        R = U*E.^(1/2)*U';
        q = R*w;
        S = [S q; q' 1];
    end
end

Phương pháp Vine

d(d1)/2[1,1]η[detC]η1

Phương pháp Vine

%// VINE METHOD to generate random correlation matrices
%// distributed ~ det(S)^eta [or maybe det(S)^(eta-1), not sure]
function S = vine(d, eta)
    beta = eta + (d-1)/2;   
    P = zeros(d);           %// storing partial correlations
    S = eye(d);

    for k = 1:d-1
        beta = beta - 1/2;
        for i = k+1:d
            P(k,i) = betarnd(beta,beta); %// sampling from beta
            P(k,i) = (P(k,i)-0.5)*2;     %// linearly shifting to [-1, 1]
            p = P(k,i);
            for l = (k-1):-1:1 %// converting partial correlation to raw correlation
                p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
            end
            S(k,i) = p;
            S(i,k) = p;
        end
    end
end

Phương pháp Vine với lấy mẫu thủ công các mối tương quan một phần

±1[0,1][1,1]α=β=50,20,10,5,2,1. Các tham số của phân phối beta càng nhỏ, nó càng tập trung gần các cạnh.

Phương pháp Vine với lấy mẫu thủ công

Lưu ý rằng trong trường hợp này, phân phối không được đảm bảo là bất biến hoán vị, do đó tôi thêm ngẫu nhiên hoán vị các hàng và cột sau khi tạo.

%// VINE METHOD to generate random correlation matrices
%// with all partial correlations distributed ~ beta(betaparam,betaparam)
%// rescaled to [-1, 1]
function S = vineBeta(d, betaparam)
    P = zeros(d);           %// storing partial correlations
    S = eye(d);

    for k = 1:d-1
        for i = k+1:d
            P(k,i) = betarnd(betaparam,betaparam); %// sampling from beta
            P(k,i) = (P(k,i)-0.5)*2;     %// linearly shifting to [-1, 1]
            p = P(k,i);
            for l = (k-1):-1:1 %// converting partial correlation to raw correlation
                p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
            end
            S(k,i) = p;
            S(i,k) = p;
        end
    end

    %// permuting the variables to make the distribution permutation-invariant
    permutation = randperm(d);
    S = S(permutation, permutation);
end

Dưới đây là cách biểu đồ của các phần tử nằm ngoài đường tìm kiếm các ma trận ở trên (phương sai của phân phối tăng đơn điệu):

Các yếu tố ngoài đường chéo


Cập nhật: sử dụng các yếu tố ngẫu nhiên

k<dWk×dWWDB=WW+DC=E1/2BE1/2EBk=100,50,20,10,5,1

ma trận tương quan ngẫu nhiên từ các yếu tố ngẫu nhiên

Và mã:

%// FACTOR method
function S = factor(d,k)
    W = randn(d,k);
    S = W*W' + diag(rand(1,d));
    S = diag(1./sqrt(diag(S))) * S * diag(1./sqrt(diag(S)));
end

Đây là mã gói được sử dụng để tạo ra các số liệu:

d = 100; %// size of the correlation matrix

figure('Position', [100 100 1100 600])
for repetition = 1:6
    S = onion(d);

    %// etas = [1 10 100 1000 1e+4 1e+5];
    %// S = extendedOnion(d, etas(repetition));

    %// S = vine(d, etas(repetition));

    %// betaparams = [50 20 10 5 2 1];
    %// S = vineBeta(d, betaparams(repetition));

    subplot(2,3,repetition)

    %// use this to plot colormaps of S
    imagesc(S, [-1 1])
    axis square
    title(['Eigs: ' num2str(min(eig(S)),2) '...' num2str(max(eig(S)),2) ', det=' num2str(det(S),2)])

    %// use this to plot histograms of the off-diagonal elements
    %// offd = S(logical(ones(size(S))-eye(size(S))));
    %// hist(offd)
    %// xlim([-1 1])
end

2
Đây là một danh sách tuyệt vời, tôi rất vui vì tôi đã nói điều gì đó!
Shadowtalker

Khi tôi dịch mã MATLAB cho ma trận tương quan dựa trên cây nho sang R và kiểm tra nó, mật độ tương quan trong cột 1 luôn khác với các cột sau. Có thể là tôi đã dịch một cái gì đó không chính xác, nhưng có lẽ ghi chú này giúp được ai đó.
Charlie

3
Đối với người dùng R, hàm RCorrmatrix trong cụm clusterGeneration (được viết bởi W Qui và H. Joe) thực hiện phương thức vine.
RNM

15

AATAyT(ATA)y0yyT(ATA)y=(Ay)TAy=||Ay||đó là không âm. Vì vậy, trong Matlab, chỉ cần thử

A = randn(m,n);   %here n is the desired size of the final matrix, and m > n
X = A' * A;

Tùy thuộc vào ứng dụng, điều này có thể không cung cấp cho bạn phân phối giá trị riêng mà bạn muốn; Câu trả lời của Kwak tốt hơn nhiều về vấn đề đó. Các giá trị riêng Xđược sản xuất bởi đoạn mã này phải tuân theo phân phối Marchenko-Pastur.

Để mô phỏng ma trận tương quan của cổ phiếu, giả sử, bạn có thể muốn một cách tiếp cận hơi khác:

k = 7;      % # of latent dimensions;
n = 100;    % # of stocks;
A = 0.01 * randn(k,n);  % 'hedgeable risk'
D = diag(0.001 * randn(n,1));   % 'idiosyncratic risk'
X = A'*A + D;
ascii_hist(eig(X));    % this is my own function, you do a hist(eig(X));
-Inf <= x <  -0.001 : **************** (17)
-0.001 <= x <   0.001 : ************************************************** (53)
 0.001 <= x <   0.002 : ******************** (21)
 0.002 <= x <   0.004 : ** (2)
 0.004 <= x <   0.005 :  (0)
 0.005 <= x <   0.007 : * (1)
 0.007 <= x <   0.008 : * (1)
 0.008 <= x <   0.009 : *** (3)
 0.009 <= x <   0.011 : * (1)
 0.011 <= x <     Inf : * (1)

1
bạn có sẵn sàng chia sẻ chức năng ascii_hist của mình không?
btown

@btown lề quá nhỏ để chứa nó!
shabbychef

1
yT(ATA)y=(Ay)TAy=||Ay||

8

DA=QDQTQ


M .: Tham khảo tốt đẹp: Đây dường như là giải pháp hiệu quả nhất (không có triệu chứng).
whuber

3
@whuber: Heh, tôi đã nhặt nó từ Golub và Van Loan (tất nhiên); Tôi sử dụng tất cả thời gian này để giúp tạo ra các ma trận thử nghiệm cho các thói quen giá trị eigenvalue / số ít kiểm tra căng thẳng. Như có thể thấy từ bài báo, về cơ bản nó tương đương với việc phân tách QR một ma trận ngẫu nhiên như những gì kwak đề xuất, ngoại trừ việc nó được thực hiện hiệu quả hơn. Có một triển khai MATLAB về điều này trong Hộp công cụ văn bản ma trận của Higham, BTW.
JM không phải là một nhà thống kê

M.:> Cảm ơn bạn đã thực hiện MATLAB. Bạn có thể biết về trình tạo ma trận giả ngẫu nhiên Haar trong R không?
user603

@kwak: Không có ý kiến ​​gì, nhưng nếu chưa có triển khai, thì quá khó để dịch mã MATLAB sang R (Tôi có thể cố gắng đánh một cái nếu thực sự không có); điều kiện tiên quyết duy nhất là một trình tạo tốt cho các biến thể bình thường giả, mà tôi chắc chắn R có.
JM không phải là một nhà thống kê

M.:> Vâng tôi có thể sẽ tự dịch nó. Cảm ơn các liên kết, tốt nhất.
user603

4

Bạn chưa chỉ định phân phối cho ma trận. Hai cái phổ biến là phân phối Wishart và nghịch đảo Wishart. Các phân hủy Bartlett đưa ra một phân tích nhân tử Cholesky của một ma trận Wishart ngẫu nhiên (mà cũng có thể được giải quyết một cách hiệu quả để có được một nghịch đảo Wishart ma trận ngẫu nhiên).

Trong thực tế, không gian Cholesky là một cách thuận tiện để tạo các loại ma trận PSD ngẫu nhiên khác, vì bạn chỉ phải đảm bảo rằng đường chéo là không âm.


> Không ngẫu nhiên: hai ma trận được tạo từ cùng một Whishard sẽ không độc lập với nhau. Nếu bạn có kế hoạch thay đổi Whishart ở mỗi thế hệ, thì bạn dự định tạo Whishart như thế nào ngay từ đầu?
user603

@kwak: Tôi không hiểu câu hỏi của bạn: phân tách Bartlett sẽ thu hút độc lập từ cùng một phân phối Wishart.
Simon Byrne

> Hãy để tôi viết lại điều này, bạn lấy ma trận tỷ lệ phân phối whishart của bạn từ đâu?
user603

1
@kwak: đó là một tham số của phân phối và đã được sửa. Bạn chọn nó khi bắt đầu, dựa trên các đặc điểm mong muốn của phân phối của bạn (chẳng hạn như giá trị trung bình).
Simon Byrne

3

UTSU


Nếu các mục nhập được tạo từ phân phối Bình thường chứ không phải thống nhất, phân tách mà bạn đề cập phải là bất biến SO (n) (và do đó được phân bổ tương đối so với số đo Haar).
whuber

Hấp dẫn. Bạn có thể cung cấp một tài liệu tham khảo cho điều này?
vui vẻ

1
> vấn đề với phương pháp này là bạn không thể kiểm soát tỷ lệ giữa giá trị riêng nhỏ nhất và lớn nhất (và tôi nghĩ rằng khi kích thước của tập dữ liệu được tạo ngẫu nhiên của bạn đạt đến vô cùng, tỷ lệ này sẽ hội tụ đến 1).
user603

1

Nếu bạn muốn có nhiều quyền kiểm soát hơn đối với ma trận PSD đối xứng được tạo của mình, ví dụ: tạo bộ dữ liệu xác thực tổng hợp, bạn có sẵn một số tham số. Một ma trận PSD đối xứng tương ứng với một siêu hình elip trong không gian N chiều, với tất cả các mức độ tự do liên quan:

  1. Xoay vòng.
  2. Độ dài của trục.

Vì vậy, đối với ma trận 2 chiều (tức là hình elip 2d), bạn sẽ có 1 vòng quay + 2 trục = 3 tham số.

Σ=ODOTΣOD

Σ

figure;
mu = [0,0];
for i=1:16
    subplot(4,4,i)
    theta = (i/16)*2*pi;   % theta = rand*2*pi;
    U=[cos(theta), -sin(theta); sin(theta) cos(theta)];
    % The diagonal's elements control the lengths of the axes
    D = [10, 0; 0, 1]; % D = diag(rand(2,1));    
    sigma = U*D*U';
    data = mvnrnd(mu,sigma,1000);
    plot(data(:,1),data(:,2),'+'); axis([-6 6 -6 6]); hold on;
end

U


0

Một cách tiếp cận rẻ tiền và vui vẻ mà tôi đã sử dụng để thử nghiệm là tạo ra m N (0,1) n-vectơ V [k] và sau đó sử dụng P = d * I + Sum {V [k] * V [k] '} như một ma trận px nxn. Với m <n, số này sẽ là số ít cho d = 0 và với d nhỏ sẽ có số điều kiện cao.


2
> vấn đề với phương pháp này là bạn không thể kiểm soát tỷ lệ giữa giá trị riêng nhỏ nhất và lớn nhất (và tôi nghĩ rằng khi kích thước của tập dữ liệu được tạo ngẫu nhiên của bạn đạt đến vô cùng, tỷ lệ này sẽ hội tụ đến 1).
user603

> bên cạnh đó, phương pháp này không hiệu quả lắm (theo quan điểm tính toán)
user603

1
"Ma trận ngẫu nhiên" của bạn là một ma trận có cấu trúc đặc biệt được gọi là "ma trận đường chéo cộng cấp 1" (ma trận DR1), do đó không thực sự là một ma trận ngẫu nhiên đại diện tốt.
JM không phải là một nhà thống kê
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.