Bir kağıt Lewandowski, Kurowicka ve Joe (LKJ), 2009 tarafından asma ve genişletilmiş soğan yöntemine dayalı rastgele korelasyon matrisleri üretilmesi, rastgele korelasyon matrislerinin üretilmesi için iki verimli yöntemin birleşik bir muamele ve anlatımını sağlar. Her iki yöntem de , aşağıda tanımlanmış olan kesin bir anlamda düzgün bir dağılımdan matrisler üretilmesine izin verir , uygulanması kolaydır, hızlıdır ve eğlenceli adlara sahip olma avantajına sahiptir.
Çaprazdakilerle boyutunda gerçek simetrik bir matris , benzersiz çapraz elemanlar içerir ve bu nedenle . Bu uzaydaki her nokta simetrik bir matrise karşılık gelir, ancak hepsi pozitif-kesin değildir (korelasyon matrislerinin olması gerektiği gibi). Korelasyon matrisleri bu nedenle bir (aslında bağlı bir dışbükey alt küme) alt kümesi oluşturur ve her iki yöntem de bu alt küme üzerinde eşit bir dağılımdan noktalar oluşturabilir.d ( d - 1 ) / 2 R, D ( D - 1 ) / 2 R, D ( D - 1 ) / 2d×dd(d−1)/2Rd(d−1)/2Rd(d−1)/2
Her metodun kendi MATLAB uygulamasını sunacağım ve bunları ile göstereceğim .d=100
Soğan yöntemi
Soğan yöntemi başka bir kağıttan gelir (LKJ'de ref # 3) ve ismini, korelasyon matrislerinin matris ile başlayıp sütuna ve satır satır büyüterek ürettikleri gerçeğine sahiptir . Elde edilen dağılım aynı. Yöntemin arkasındaki matematiği gerçekten anlamıyorum (ve yine de ikinci yöntemi tercih ediyorum), ancak sonuç şu:1×1
Burada ve her alt grafiğin başlığının altında en küçük ve en büyük özdeğerler ve determinant (tüm özdeğerlerin çarpımı) gösterilir. İşte kod:
%// 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
Genişletilmiş soğan yöntemi
LKJ, korelasyon matrisleri 'nin orantılı bir dağılımdan örnek alabilmesi için bu yöntemi hafifçe değiştirir . Daha büyük , daha büyük oluşturulan korelasyon matrisleri daha kimlik matrisi yaklaşacaktır yani belirleyici olacaktır. değeri üniform dağılıma karşılık gelir. Aşağıdaki şekilde matrisler ile üretilir . [ d e tC η η = 1 η = 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
Asma yöntemi
d(d−1)/2[−1,1]herhangi bir kısıtlama olmadan) ve sonra bunları özyinelemeli bir formülle ham korelasyonlara dönüştürün. Hesaplamanın belirli bir düzende yapılması uygundur ve bu grafik "asma" olarak bilinir. Önemli olarak, kısmi korelasyonlar belirli beta dağılımlarından örneklenirse (matristeki farklı hücreler için farklı), elde edilen matris düzgün bir şekilde dağıtılacaktır. Yine burada, LKJ ek parametresi sunar.η[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
Kısmi korelasyonların manuel örneklemesi ile asma metodu
±1[0,1][−1,1]α=β=50,20,10,5,2,1. Beta dağılımının parametreleri ne kadar küçük olursa, kenarlara o kadar fazla konsantre olur.
Bu durumda dağılımın permütasyon değişmezliği garanti edilmediğine dikkat edin, bu yüzden üretimden sonra rastgele sıralara ve sütunlara izin veriyorum.
%// 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
Çapraz-olmayan elemanların histogramlarının yukarıdaki matrisleri nasıl aradığı (dağılımın değişmesi monoton olarak artar):
Güncelleme: rastgele faktörlerin kullanılması
k<dWk×dWW⊤DB=WW⊤+DC=E−1/2BE−1/2EBk=100,50,20,10,5,1
Ve kod:
%// 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
Şekilleri oluşturmak için kullanılan sarma kodu:
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