ฉันได้เตรียมสิ่งที่ฉันตอนนี้เชื่อว่าเป็นคำตอบที่ดีที่สุดย่อย; ดังนั้นฉันจึงแก้ไขคำตอบของฉันเพื่อเริ่มต้นด้วยคำแนะนำที่ดีกว่า
ใช้วิธีการเถาวัลย์
ในหัวข้อนี้: วิธีสร้างเมทริกซ์สหสัมพันธ์แบบกึ่งบวกแบบสุ่มที่มีประสิทธิภาพได้อย่างไร - ฉันอธิบายและให้รหัสสำหรับอัลกอริธึมที่มีประสิทธิภาพสองวิธีในการสร้างเมทริกซ์สหสัมพันธ์แบบสุ่ม ทั้งคู่มาจากบทความของLewandowski, Kurowicka และ Joe (2009)
โปรดดูคำตอบของฉันที่นั่นเพื่อดูตัวเลขและรหัส matlab ที่นี่ฉันอยากจะบอกว่าวิธีเถาวัลย์อนุญาตให้สร้างเมทริกซ์สหสัมพันธ์แบบสุ่มโดยมีการแจกแจงความสัมพันธ์บางส่วน (หมายเหตุคำว่า "บางส่วน") และสามารถใช้เพื่อสร้างเมทริกซ์สหสัมพันธ์ที่มีค่าเส้นทแยงมุมขนาดใหญ่ นี่คือรูปที่เกี่ยวข้องจากหัวข้อนั้น:
สิ่งเดียวที่เปลี่ยนแปลงระหว่างย่อยเป็นพารามิเตอร์หนึ่งว่าการควบคุมวิธีการมากการกระจายตัวของความสัมพันธ์บางส่วนมีความเข้มข้นรอบ1 เมื่อ OP ขอให้มีการแจกแจงแบบปกติประมาณแนวทแยงนี่คือพล็อตที่มีฮิสโตแกรมขององค์ประกอบนอกแนวทแยง (สำหรับเมทริกซ์เดียวกันกับด้านบน):±1
ฉันคิดว่าการแจกแจงแบบนี้มีเหตุผล "ปกติ" และสามารถเห็นได้ว่าค่าเบี่ยงเบนมาตรฐานนั้นเพิ่มขึ้นอย่างค่อยเป็นค่อยไปอย่างไร ฉันควรเพิ่มว่าอัลกอริทึมเร็วมาก ดูกระทู้ที่เชื่อมโยงสำหรับรายละเอียด
คำตอบเดิมของฉัน
การปรับเปลี่ยนวิธีการของคุณตรงไปตรงมาอาจทำเคล็ดลับ (ขึ้นอยู่กับว่าคุณต้องการให้การแจกแจงใกล้เคียงกับปกติ) คำตอบนี้ได้รับแรงบันดาลใจจากความคิดเห็นของ @ cardinal ด้านบนและโดย @ psarka สำหรับคำถามของฉันเองจะสร้างเมทริกซ์สหสัมพันธ์แบบสุ่มแบบเต็มอันดับขนาดใหญ่ได้อย่างไร
เคล็ดลับคือการสร้างตัวอย่างของสัมพันธ์กันของคุณ(ไม่ใช่คุณลักษณะ แต่เป็นตัวอย่าง) นี่คือตัวอย่าง: ฉันสร้างเมทริกซ์แบบสุ่มของขนาด (องค์ประกอบทั้งหมดจากมาตรฐานปกติ) แล้วเพิ่มจำนวนสุ่มจากเพื่อแต่ละแถวสำหรับ0,1,2,5 สำหรับเมทริกซ์ความสัมพันธ์องค์ประกอบ (หลังจากมาตรฐานคุณลักษณะ) จะมีการปิดเส้นทแยงมุมประมาณกระจายตามปกติที่มีค่าเบี่ยงเบนมาตรฐาน{1000} สำหรับX 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 >0=0,1,2,51/1000−−−−√a>0ผมคำนวณสัมพันธ์เมทริกซ์โดยไม่ต้องอยู่ตรงกลางตัวแปร (รักษาความสัมพันธ์นี้แทรก) และค่าเบี่ยงเบนมาตรฐานขององค์ประกอบปิดขวางเติบโตไปพร้อมกับดังแสดงในรูปนี้ (แถวตรงตามลักษณะที่ ):aa=0,1,2,5
เมทริกซ์เหล่านี้ทั้งหมดแน่นอนแน่นอนเป็นบวก นี่คือรหัส MATLAB:
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
ผลลัพธ์ของรหัสนี้ (eigenvalues ขั้นต่ำและสูงสุด) คือ:
0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48