임의의 양의 반음계 상관 행렬을 효율적으로 생성하는 방법은 무엇입니까?


38

PSD (positive-semidefinite) 상관 행렬을 효율적으로 생성 할 수 있기를 원합니다. 생성 할 행렬의 크기를 늘리면 메서드 속도가 크게 느려집니다.

  1. 효율적인 솔루션을 제안 할 수 있습니까? Matlab의 예를 알고 있다면 매우 감사하겠습니다.
  2. PSD 상관 행렬을 생성 할 때 생성 할 행렬을 설명하기 위해 매개 변수를 어떻게 선택합니까? 평균 상관 관계, 상관 관계의 표준 편차, 고유 값?

답변:


16

모든 행렬 (모든 대칭 p × p PSD 행렬 세트)는 다음과 같이 분해 할 수 있습니다.CR++pp×p

여기서 O 는 직교 정규 행렬C=OTDOO

얻기 위해서는 먼저 임의의 기준 생성 ( V 1 , . . . , 브이 P ) ( V 제가 일반적 랜덤 벡터이며, ( - 1 , 1 ) ). 여기에서 얻을 수있는 그램 - 슈미트 직교 화 과정을 사용하여 ( U (1) , . . . . , U , P ) = OO(v1,...,vp)vi(1,1)(u1,....,up)=O

은 무작위 기준의 GS 직교 화를 효율적으로 수행 할 수있는 다수의 패키지, 즉 심지어 'far'패키지와 같은 큰 차원에도 적용됩니다. 위키에서 GS 알고리즘을 찾을 수는 있지만 휠을 재발 명하지 않고 matlab 구현을 시도하는 것이 좋습니다 (하나는 반드시 존재하지만 권장하지는 않습니다).R

마지막으로, 는 요소가 모두 양수인 대각선 행렬입니다 (이는 다시 생성하기 쉽습니다. p 난수 생성 , 제곱, 정렬 및 p 행렬에 의해 항등 p 의 대각선에 배치 ).Dppp


3
(1) 결과 는 (OP에서 요청한대로) 상관 행렬이 아니므로 대각선에 행렬이 없기 때문에 상관 행렬이 아닙니다. 물론 E - 1 / 2 C E - 1 / 2 로 설정하여 대각선에 1을 갖도록 크기를 조정할 수 있습니다 . 여기서 EC 와 같은 대각선을 갖는 대각선 행렬입니다 . (2) 내가 실수하지 않으면 모든 비 대각선 요소가 0 주위에 집중되는 상관 행렬이 생성 되므로 OP가 찾고있는 유연성이 없습니다 (OP는 "평균 상관 관계 를 설정할 수 있기를 원했습니다. , 상관의 표준 편차, 고유 값 "CE1/2CE1/2EC0)
아메바는 모니카

@amoeba : (1)에 대한 해결책은 사소한 것이기 때문에 (2)를 다룰 것입니다. PSD 행렬 (따라서 공분산과 상관 행렬)의 '모양'(대각선 요소의 관계와 대각선 요소의 관계)의 숫자 특성은 조건 번호입니다. 그리고 위에서 설명한 방법으로 모든 것을 제어 할 수 있습니다. '0 주변의 오프 대각선 요소의 농도'는 PSD 매트릭스를 생성하는 데 사용되는 방법의 특징이 아니라, 매트릭스가 PSD이고 가 크다는 것을 보장하는 데 필요한 제약의 결과입니다 . p
user603

모든 대형 PSD 매트릭스에는 0에 가까운 대각선 이외의 요소가 있다고 말하고 있습니까? 동의하지 않습니다. 몇 가지 예를 보려면 여기에서 내 대답을 확인하십시오. 주어진 표준 편차를 가지고 대략 정규 분포 된 비 대각선 항목을 갖는 랜덤 상관 행렬을 생성하는 방법은 무엇입니까? 그러나 대각선 고정 된 값에 모두 1을 갖는 정방 행렬이 때문에 하나는 직접, 그것은 그렇지 않은 것을 볼 수 있습니다 오프 대각선 사방 PSD이며, ρ는 (그러나 아래 물론 임의적으로 클 수있다 1 ). ρρ1
amoeba는 Reinstate Monica가

@amoeba : 그런 다음 큰 상관 행렬의 양 대칭과 양수 모두 0에 가까워 질 때 필연적으로 큰 상관 행렬의 오프 대각선이 필요하다고 가정하면 잘못되었습니다. 깨달은 예에 감사드립니다.
user603

1
무작위 상관 행렬 생성에 대한 아주 좋은 논문을 읽고 여기에 자체 답변을 제공했습니다 (연결된 스레드의 다른 답변). 나는 당신이 그것을 흥미로울 것 같아요.
amoeba는

27

2009 년 Lewandowski, Kurowicka 및 Joe (LKJ)의 덩굴과 확장 양파 방법기반으로하는 임의 상관 행렬 생성 종이 무작위 상관 행렬 을 생성하는 두 가지 효율적인 방법의 통합 된 처리 및 노출을 제공합니다. 두 방법 모두 아래에 정의 된 특정 정확한 의미 로 균일 한 분포 에서 행렬을 생성 할 수 있으며 구현이 간단하고 빠르며 재미있는 이름을 가질 수 있다는 이점이 있습니다.

의 진짜 대칭 행렬 대각선들과 크기가 갖는 D ( D - 1 ) / 2 고유 비대 각 원소 등의 점으로 매개 변수화 될 수 R에 D ( D - 1 ) / 2 . 이 공간의 각 점은 대칭 행렬에 해당하지만, 상관 행렬이 반드시 필요하기 때문에 모두 양의 한정된 것은 아닙니다. 상관 행렬은 그러므로 R d ( d - 1 ) / 2 의 부분 집합을 형성d×dd(d1)/2Rd(d1)/2Rd(d1)/2 (실제로 연결된 볼록한 부분 집합), 두 방법 모두이 부분 집합에 대한 균일 한 분포에서 점을 생성 할 수 있습니다.

각 메소드의 MATLAB 구현을 제공하고 합니다.d=100


양파 방법

양파 방법은 다른 논문 (LKJ의 3 번 참조)에서 나 왔으며 행렬로 시작하여 열 단위로, 행 단위로 상관 관계 행렬이 생성된다는 사실에서 그 이름을 소유합니다 . 결과 분포가 균일합니다. 나는 실제로 방법의 배후에있는 수학을 이해하지 못하고 (두 번째 방법을 선호합니다) 결과는 다음과 같습니다.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

확장 양파 방법

LKJ 상관 행렬 를 샘플링 할 수 있도록이 방법을 약간 수정합니다.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(d1)/2[1,1]제약 조건없이) 다음 재귀 수식을 통해 원시 상관 관계로 변환합니다. 특정 순서로 계산을 구성하는 것이 편리하며이 그래프를 "바인"이라고합니다. 중요하게도, 부분 상관 관계가 특정 베타 분포 (매트릭스의 다른 셀에 따라 다름)에서 샘플링되면 결과 매트릭스가 균일하게 분포됩니다. 여기서 다시 LKJ는 추가 파라미터 도입합니다.η[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

부분 상관의 수동 샘플링을 사용하는 덩굴 방법

±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

다음은 비 대각선 요소의 히스토그램이 위의 행렬을 찾는 방법입니다 (분포의 분산이 단조 증가합니다).

비 대각선 요소


업데이트 : 임의의 요소 사용

k<dWk×dWWDB=WW+DC=E1/2BE1/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

2
이것은 환상적인 런 다운입니다. 제가 말한 것이 기쁩니다!
shadowtalker

포도 나무 기반 상관 행렬의 MATLAB 코드를 R로 변환하고 테스트 할 때 1 열의 상관 밀도는 항상 이후 열과 다릅니다. 내가 잘못 번역했을 수도 있지만이 메모가 누군가에게 도움이 될 수 있습니다.
Charlie

3
R 사용자의 경우 clusterGeneration 패키지의 함수 rcorrmatrix (W Qui 및 H. Joe가 작성)는 vine 메소드를 구현합니다.
RNM

14

AATAyT(ATA)y0yyT(ATA)y=(Ay)TAy=||Ay||음이 아닙니다. 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)

1
ascii_hist 함수를 우연히 공유 하시겠습니까?
btown

@btown 여백이 너무 작아서 포함 할 수 없습니다!
shabbychef

1
yT(ATA)y=(Ay)TAy=||Ay||

8

DA=QDQTQ


M. : Nice reference : 이것은 가장 효율적인 솔루션 인 것으로 보입니다 (무증상).
whuber

3
@ whuber : Heh, 나는 Golub과 Van Loan (물론)에서 픽업했습니다. 이 값을 항상 사용하여 고유 값 / 단수 값 루틴의 스트레스 테스트를위한 테스트 매트릭스를 생성합니다. 논문에서 볼 수 있듯이, kwak이 제안한 것과 같이 랜덤 매트릭스를 QR 분해하는 것과 본질적으로 동일합니다. Higham의 Text Matrix Toolbox, BTW에 MATLAB 구현이 있습니다.
JM은 통계가 아닙니다.

M. :> matlab 구현에 감사드립니다. R의 Haar 의사 난수 행렬 생성기를 알고 싶습니까?
user603

@kwak : 모릅니다. 그러나 아직 구현이 없다면 MATLAB 코드를 R로 변환하는 것이 너무 어렵지 않아야합니다 (실제로 존재하지 않는 경우 하나를 채울 수 있습니다). 유일한 전제 조건은 의사 난수 정규 변량에 대한 괜찮은 생성기입니다 .R은 가지고 있습니다.
JM은 통계학자가 아닙니다.

M. :> 네, 아마 내 자신을 번역 할 것입니다. 링크 고맙습니다.
user603

4

행렬에 대한 분포를 지정하지 않았습니다. 두 가지 일반적인 것은 Wishart와 역 Wishart 분포입니다. 바틀 분해 (또한 효율적으로 랜덤 Wishart 역 행렬을 획득하기 위해 해결 될 수있는) 임의 Wishart 행렬의 촐레 스키 인수 분해를 제공한다.

실제로 Cholesky 공간은 대각선이 음이 아닌지 확인하기 만하면되기 때문에 다른 유형의 랜덤 PSD 매트릭스를 생성하는 편리한 방법입니다.


> 무작위가 아님 : 동일한 Whishard에서 생성 된 두 매트릭스는 서로 독립적이지 않습니다. 각 세대에서 Whishart를 변경하려는 경우 어떻게하면 먼저 Whishart를 생성 할 계획입니까?
user603

@ kwak : 귀하의 질문을 이해하지 못합니다 : Bartlett 분해는 동일한 Wishart 분포에서 독립적 인 추첨을 제공합니다.
Simon Byrne

> 이것을 바꿔서, 휘슬러 분포의 스케일 매트릭스를 어디서 구할 수 있습니까?
user603

1
@kwak : 분포의 매개 변수이므로 고정되어 있습니다. 원하는 분포 특성 (예 : 평균)을 기준으로 시작시 선택합니다.
Simon Byrne

3

UTSU


항목이 균일하지 않고 정규 분포에서 생성 된 경우 언급 한 분해는 SO (n) 불변이어야합니다 (따라서 Haar 측정 값에 대해 등분 포).
whuber

흥미 롭군 이에 대한 참조를 제공 할 수 있습니까?
gappy

1
>이 방법의 문제점은 가장 작은 고유 값과 가장 큰 고유 값의 비율을 제어 할 수 없다는 것입니다 (그리고 무작위로 생성 된 데이터 세트의 크기가 무한대로되면이 비율은 1로 수렴한다고 생각합니다).
user603

1

생성 된 대칭 PSD 매트릭스를보다 잘 제어하려면 (예 : 합성 유효성 검사 데이터 세트 생성) 사용할 수있는 여러 매개 변수가 있습니다. 대칭 PSD 매트릭스는 N 차원 공간의 하이퍼 타원에 해당하며 모든 관련 자유도는 다음과 같습니다.

  1. 회전.
  2. 축 길이.

따라서 2 차원 행렬 (예 : 2 차원 타원)의 경우 1 회전 + 2 축 = 3 매개 변수가 있습니다.

Σ=ODOTΣOD

Σ

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

U


0

내가 테스트에 사용한 싸고 유쾌한 접근법은 m N (0,1) n- 벡터 V [k]를 생성 한 다음 P = d * I + Sum {V [k] * V [k] '}를 사용하는 것입니다. nxn psd 매트릭스로 m <n이면 d = 0에 대해 단수이고 작은 d에 대해서는 조건 수가 높습니다.


2
>이 방법의 문제점은 가장 작은 고유 값과 가장 큰 고유 값의 비율을 제어 할 수 없다는 것입니다 (그리고 무작위로 생성 된 데이터 세트의 크기가 무한대로되면이 비율은 1로 수렴한다고 생각합니다).
user603

> 게다가,이 방법은 매우 효율적이지 않다 (계산적 관점에서)
user603

1
"랜덤 매트릭스"는 "대각선 + 랭크 1 매트릭스"(DR1 매트릭스)라고하는 특수하게 구성된 것이므로 실제로 대표적인 랜덤 랜덤 매트릭스는 아닙니다.
JM은 통계가 아닙니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.