İlk önce, optimal olmayan bir cevap olduğuna inandığım şeyi sağladım; bu nedenle cevabımı daha iyi bir öneri ile başlamak için düzenledim.
Asma yöntemini kullanma
Bu konuda: Rasgele pozitif-semidefinite korelasyon matrisleri nasıl verimli bir şekilde üretilir? - Rastgele korelasyon matrisleri oluşturmak için iki verimli algoritmanın kodunu tanımladım ve sağladım. Her ikisi de Lewandowski, Kurowicka ve Joe (2009) tarafından hazırlanan bir makaleden alınmıştır .
Çok sayıda figür ve matlab kodu için lütfen cevabımı bakın . Burada sadece asma yönteminin kısmi korelasyonların herhangi bir dağılımıyla rastgele korelasyon matrisleri üretmeye izin verdiğini ("kısmi" kelimesine dikkat edin) ve büyük diyagonal olmayan değerlere sahip korelasyon matrislerini üretmek için kullanılabileceğini söylemek istiyorum. İşte o iplikten ilgili rakam:
Alt grafikler arasında değişen tek şey, kısmi korelasyonların dağılımının civarında ne kadar yoğunlaştığını kontrol eden bir parametredir . OP diyagonal olarak yaklaşık normal bir dağılım istediğinden, burada diyagonal olmayan elemanların histogramları olan grafik (yukarıdaki ile aynı matrisler için):±1
Bu dağılımların makul "normal" olduğunu düşünüyorum ve standart sapmanın kademeli olarak nasıl arttığını görebilirsiniz. Eklemeliyim ki algoritma çok hızlı. Ayrıntılar için bağlantılı konuya bakın.
Orijinal cevabım
Senin yöntemin bir düz ileri modifikasyon olabilir hile yapmak (eğer dağıtım normale olmak istiyorum ne kadar yakın bağlı olarak). Bu cevap, @ cardinal'in yukarıdaki yorumları ve @ psarka'nın kendi soruma verdiği yanıttan ilham aldı. Bazı güçlü korelasyonları olan büyük bir tam dereceli rastgele korelasyon matrisi nasıl üretilir?
İşin püf noktası örneklerini birbiriyle ilişkilendirmektir (özellikler değil, örnekler). Bir örnek: rastgele matris oluşturmak bir boyutu (standart normal tüm elemanları) ve daha sonra bir rastgele sayı eklemek her satır için, için . İçin bağıntı matrisinin (özelliklerini standartlaştırılması sonra) yaklaşık olarak normal standart sapma ile dağıtılmış elemanları diyagonal kapalı olacaktır . ForX 1000 × 100 [ - a / 2 , a / 2 ] a = 0 , 1 , 2 , 5 a = 0 X ⊤ X 1 / √XX1000×100[−a/2,a/2]a=0,1,2,5a=0X⊤X a>0aa=0,1,2,51/1000−−−−√a>0, Ben değişkenleri ortalamadan korelasyon matrisini hesaplarım (eklenen korelasyonları korur) ve diyagonal olmayan elemanların standart sapması bu şekilde gösterildiği gibi ile büyür (satırlar karşılık gelir ):aa=0,1,2,5
Tüm bu matrisler elbette pozitif tanımlıdır. İşte matlab kodu:
offsets = [0 1 2 5];
n = 1000;
p = 100;
rng(42) %// random seed
figure
for offset = 1:length(offsets)
X = randn(n,p);
for i=1:p
X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
end
C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)
%// convert to correlation
d = diag(C);
C = diag(1./sqrt(d))*C*diag(1./sqrt(d));
%// displaying C
subplot(length(offsets),3,(offset-1)*3+1)
imagesc(C, [-1 1])
%// histogram of the off-diagonal elements
subplot(length(offsets),3,(offset-1)*3+2)
offd = C(logical(ones(size(C))-eye(size(C))));
hist(offd)
xlim([-1 1])
%// QQ-plot to check the normality
subplot(length(offsets),3,(offset-1)*3+3)
qqplot(offd)
%// eigenvalues
eigv = eig(C);
display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end
Bu kodun çıktısı (minimum ve maksimum özdeğerler):
0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48