PSD (positive-semidefinite) 상관 행렬을 효율적으로 생성 할 수 있기를 원합니다. 생성 할 행렬의 크기를 늘리면 메서드 속도가 크게 느려집니다.
- 효율적인 솔루션을 제안 할 수 있습니까? Matlab의 예를 알고 있다면 매우 감사하겠습니다.
- PSD 상관 행렬을 생성 할 때 생성 할 행렬을 설명하기 위해 매개 변수를 어떻게 선택합니까? 평균 상관 관계, 상관 관계의 표준 편차, 고유 값?
PSD (positive-semidefinite) 상관 행렬을 효율적으로 생성 할 수 있기를 원합니다. 생성 할 행렬의 크기를 늘리면 메서드 속도가 크게 느려집니다.
답변:
모든 행렬 (모든 대칭 p × p PSD 행렬 세트)는 다음과 같이 분해 할 수 있습니다.
여기서 O 는 직교 정규 행렬
얻기 위해서는 먼저 임의의 기준 생성 ( V 1 , . . . , 브이 P ) ( V 제가 일반적 랜덤 벡터이며, ( - 1 , 1 ) ). 여기에서 얻을 수있는 그램 - 슈미트 직교 화 과정을 사용하여 ( U (1) , . . . . , U , P ) = O
은 무작위 기준의 GS 직교 화를 효율적으로 수행 할 수있는 다수의 패키지, 즉 심지어 'far'패키지와 같은 큰 차원에도 적용됩니다. 위키에서 GS 알고리즘을 찾을 수는 있지만 휠을 재발 명하지 않고 matlab 구현을 시도하는 것이 좋습니다 (하나는 반드시 존재하지만 권장하지는 않습니다).
마지막으로, 는 요소가 모두 양수인 대각선 행렬입니다 (이는 다시 생성하기 쉽습니다. p 난수 생성 , 제곱, 정렬 및 p 행렬에 의해 항등 p 의 대각선에 배치 ).
2009 년 Lewandowski, Kurowicka 및 Joe (LKJ)의 덩굴과 확장 양파 방법 을 기반으로하는 임의 상관 행렬 생성 종이 무작위 상관 행렬 을 생성하는 두 가지 효율적인 방법의 통합 된 처리 및 노출을 제공합니다. 두 방법 모두 아래에 정의 된 특정 정확한 의미 로 균일 한 분포 에서 행렬을 생성 할 수 있으며 구현이 간단하고 빠르며 재미있는 이름을 가질 수 있다는 이점이 있습니다.
의 진짜 대칭 행렬 대각선들과 크기가 갖는 D ( D - 1 ) / 2 고유 비대 각 원소 등의 점으로 매개 변수화 될 수 R에 D ( D - 1 ) / 2 . 이 공간의 각 점은 대칭 행렬에 해당하지만, 상관 행렬이 반드시 필요하기 때문에 모두 양의 한정된 것은 아닙니다. 상관 행렬은 그러므로 R d ( d - 1 ) / 2 의 부분 집합을 형성 (실제로 연결된 볼록한 부분 집합), 두 방법 모두이 부분 집합에 대한 균일 한 분포에서 점을 생성 할 수 있습니다.
각 메소드의 MATLAB 구현을 제공하고 합니다.
양파 방법은 다른 논문 (LKJ의 3 번 참조)에서 나 왔으며 행렬로 시작하여 열 단위로, 행 단위로 상관 관계 행렬이 생성된다는 사실에서 그 이름을 소유합니다 . 결과 분포가 균일합니다. 나는 실제로 방법의 배후에있는 수학을 이해하지 못하고 (두 번째 방법을 선호합니다) 결과는 다음과 같습니다.
각 서브 플롯의 제목 아래에 가장 작은 고유 값과 가장 큰 고유 값과 결정자 (모든 고유 값의 곱)가 표시됩니다. 코드는 다음과 같습니다.
%// 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
LKJ 상관 행렬 를 샘플링 할 수 있도록이 방법을 약간 수정합니다.
%// 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
제약 조건없이) 다음 재귀 수식을 통해 원시 상관 관계로 변환합니다. 특정 순서로 계산을 구성하는 것이 편리하며이 그래프를 "바인"이라고합니다. 중요하게도, 부분 상관 관계가 특정 베타 분포 (매트릭스의 다른 셀에 따라 다름)에서 샘플링되면 결과 매트릭스가 균일하게 분포됩니다. 여기서 다시 LKJ는 추가 파라미터 도입합니다.
%// 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 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
다음은 비 대각선 요소의 히스토그램이 위의 행렬을 찾는 방법입니다 (분포의 분산이 단조 증가합니다).
그리고 코드 :
%// 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
음이 아닙니다. Matlab에서 간단히 시도하십시오.
A = randn(m,n); %here n is the desired size of the final matrix, and m > n
X = A' * A;
응용 프로그램에 따라 원하는 고유 값의 분포를 얻지 못할 수 있습니다. 곽의 대답은 그 점에서 훨씬 낫습니다. X
이 코드 스 니펫 으로 생성 된 고유 값은 Marchenko-Pastur 분포를 따라야합니다.
예를 들어, 주식의 상관 행렬을 시뮬레이션하기 위해 약간 다른 접근법을 원할 수 있습니다.
k = 7; % # of latent dimensions;
n = 100; % # of stocks;
A = 0.01 * randn(k,n); % 'hedgeable risk'
D = diag(0.001 * randn(n,1)); % 'idiosyncratic risk'
X = A'*A + D;
ascii_hist(eig(X)); % this is my own function, you do a hist(eig(X));
-Inf <= x < -0.001 : **************** (17)
-0.001 <= x < 0.001 : ************************************************** (53)
0.001 <= x < 0.002 : ******************** (21)
0.002 <= x < 0.004 : ** (2)
0.004 <= x < 0.005 : (0)
0.005 <= x < 0.007 : * (1)
0.007 <= x < 0.008 : * (1)
0.008 <= x < 0.009 : *** (3)
0.009 <= x < 0.011 : * (1)
0.011 <= x < Inf : * (1)
행렬에 대한 분포를 지정하지 않았습니다. 두 가지 일반적인 것은 Wishart와 역 Wishart 분포입니다. 바틀 분해 (또한 효율적으로 랜덤 Wishart 역 행렬을 획득하기 위해 해결 될 수있는) 임의 Wishart 행렬의 촐레 스키 인수 분해를 제공한다.
실제로 Cholesky 공간은 대각선이 음이 아닌지 확인하기 만하면되기 때문에 다른 유형의 랜덤 PSD 매트릭스를 생성하는 편리한 방법입니다.
생성 된 대칭 PSD 매트릭스를보다 잘 제어하려면 (예 : 합성 유효성 검사 데이터 세트 생성) 사용할 수있는 여러 매개 변수가 있습니다. 대칭 PSD 매트릭스는 N 차원 공간의 하이퍼 타원에 해당하며 모든 관련 자유도는 다음과 같습니다.
따라서 2 차원 행렬 (예 : 2 차원 타원)의 경우 1 회전 + 2 축 = 3 매개 변수가 있습니다.
figure;
mu = [0,0];
for i=1:16
subplot(4,4,i)
theta = (i/16)*2*pi; % theta = rand*2*pi;
U=[cos(theta), -sin(theta); sin(theta) cos(theta)];
% The diagonal's elements control the lengths of the axes
D = [10, 0; 0, 1]; % D = diag(rand(2,1));
sigma = U*D*U';
data = mvnrnd(mu,sigma,1000);
plot(data(:,1),data(:,2),'+'); axis([-6 6 -6 6]); hold on;
end
내가 테스트에 사용한 싸고 유쾌한 접근법은 m N (0,1) n- 벡터 V [k]를 생성 한 다음 P = d * I + Sum {V [k] * V [k] '}를 사용하는 것입니다. nxn psd 매트릭스로 m <n이면 d = 0에 대해 단수이고 작은 d에 대해서는 조건 수가 높습니다.