กระดาษสร้างเมทริกซ์สหสัมพันธ์แบบสุ่มโดยยึดตามเถาและวิธีการหอมใหญ่โดย Lewandowski, Kurowicka และ Joe (LKJ), 2009, ให้การรักษาแบบครบวงจรและการแสดงออกของทั้งสองวิธีที่มีประสิทธิภาพในการสร้างเมทริกซ์สหสัมพันธ์แบบสุ่ม ทั้งสองวิธีอนุญาตให้สร้างเมทริกซ์จากการแจกแจงแบบสม่ำเสมอในความหมายบางอย่างที่กำหนดไว้ด้านล่างง่ายต่อการติดตั้งรวดเร็วและมีข้อได้เปรียบเพิ่มเติมจากการมีชื่อที่น่าขบขัน
เมทริกซ์สมมาตรที่แท้จริงของขนาดกับคนที่อยู่บนเส้นทแยงมุมมีd ( d - 1 ) / 2องค์ประกอบปิดเส้นทแยงมุมที่ไม่ซ้ำกันและเพื่อให้สามารถ parametrized เป็นจุดในR d ( d - 1 ) / 2 แต่ละจุดในพื้นที่นี้สอดคล้องกับเมทริกซ์สมมาตร แต่ไม่ใช่ทั้งหมดที่เป็นบวกแน่นอน (เป็นเมทริกซ์สหสัมพันธ์จะต้องมี) เมทริกซ์สหสัมพันธ์จึงเกิดชุดย่อยของR d ( d - 1 ) / 2d×dd(d−1)/2Rd(d−1)/2Rd(d−1)/2 (อันที่จริงแล้วเซตย่อยนูนที่เชื่อมต่อ) และทั้งสองวิธีสามารถสร้างคะแนนจากการแจกแจงแบบสม่ำเสมอเหนือเซ็ตย่อยนี้
ฉันจะช่วยให้การดำเนินงาน MATLAB ของตัวเองของแต่ละวิธีและแสดงให้เห็นถึงพวกเขาด้วย 100d=100
วิธีการหอม
วิธีหอมมาจากกระดาษอื่น (Ref # 3 ใน lkj) และเป็นเจ้าของชื่อเป็นความจริงที่การฝึกอบรมความสัมพันธ์จะมีการสร้างที่เริ่มต้นด้วยเมทริกซ์และการเจริญเติบโตมันคอลัมน์คอลัมน์และแถวโดยแถว การกระจายผลลัพธ์เป็นแบบสม่ำเสมอ ฉันไม่เข้าใจคณิตศาสตร์ที่อยู่เบื้องหลังวิธีการ (และชอบวิธีที่สองอยู่ดี) แต่นี่คือผลลัพธ์:1×1
ที่นี่และด้านล่างชื่อของแต่ละแผนย่อยแสดงค่าลักษณะเฉพาะที่เล็กที่สุดและใหญ่ที่สุดและตัวกำหนด (ผลิตภัณฑ์ของค่าลักษณะเฉพาะทั้งหมด) นี่คือรหัส:
%// 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
วิธีการหอมใหญ่
C[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
วิธีการเถาวัลย์
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
วิธีการ Vine ด้วยการสุ่มตัวอย่างแบบสหสัมพันธ์บางส่วน
±1[0,1][−1,1]α=β=50,20,10,5,2,1. ยิ่งพารามิเตอร์ของการแจกแจงเบต้าน้อยเท่าไหร่ก็ยิ่งมีความเข้มข้นใกล้กับขอบมากขึ้นเท่านั้น
โปรดทราบว่าในกรณีนี้การกระจายไม่รับประกันว่าจะมีการเปลี่ยนแปลงอย่างต่อเนื่องดังนั้นฉันจึงสุ่มเปลี่ยนแถวและคอลัมน์หลังจากการสร้าง
%// 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
นี่คือวิธีที่ฮิสโทแกรมขององค์ประกอบนอกแนวทแยงมองหาเมทริกซ์ด้านบน (ความแปรปรวนของการแจกแจงแบบ monotonically เพิ่มขึ้น):
อัปเดต: ใช้ปัจจัยสุ่ม
k<dWk×dWW⊤DB=WW⊤+DC=E−1/2BE−1/2EBk=100,50,20,10,5,1
และรหัส:
%// 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
นี่คือรหัสการห่อที่ใช้ในการสร้างตัวเลข:
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