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(d−1)/2Rd(d−1)/2Rd(d−1)/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
Ở đâ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
η=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(d−1)/2[−1,1]η[detC]η−1
%// 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.
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ập nhật: sử dụng các yếu tố ngẫu nhiên
k<dWk×dWW⊤DB=WW⊤+DC=E−1/2BE−1/2EBk=100,50,20,10,5,1
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