주어진 표본 공분산 행렬로 데이터 생성


22

공분산 행렬 주어지면 샘플 공분산 행렬 가되도록 데이터를 생성하는 방법은 무엇입니까?Σ = Σ (S)ΣsΣ^=Σs


더 일반적으로 : 우리는 종종 밀도 에서 데이터를 생성하는 데 관심이 있으며 , 데이터 x 에 일부 매개 변수 벡터 \ boldsymbol \ theta가 있습니다. 그 결과 샘플이되며, 여기서 \ boldsymbol {\ hat \ theta} 값을 다시 추정 할 수 있습니다 . 내가 관심이있는 것은 그 반대의 문제입니다 : \ boldsymbol \ theta_ {s} 매개 변수 집합이 주어지고 \ boldsymbol {\ hat \ theta} = \ boldsymbol 과 같은 샘플 x 를 생성하려면 어떻게해야 합니까? \ theta_ {의} .X θ θ θ X θ = θ f(x|θ)xθθ^θsxθ^=θs

이것은 알려진 문제입니까? 그러한 방법이 유용합니까? 알고리즘을 사용할 수 있습니까?


Attilio Meucci는 확장 가능한 솔루션을 제공합니다. 이 위험 기사matlab 코드 참조
Peter Cotton

답변:


16

이러한 종류의 문제에는 두 가지 일반적인 상황이 있습니다.

i) 모집단 특성이 지정된 분포와 일치하는 주어진 분포에서 표본을 생성하려고합니다 (그러나 표본 변동으로 인해 표본 특성이 정확히 일치하지는 않습니다).

ii) 표본 특성이 지정된 특성과 일치하는 표본을 생성하려고합니다 (단, 표본 수량을 미리 지정된 값 집합에 정확히 일치시켜야한다는 제약 때문에 실제로 원하는 분포에서 나오지는 않습니다).

두 번째 경우를 원하지만 추가 표준화 단계를 통해 첫 번째 경우와 동일한 접근 방식을 수행하면됩니다.

따라서 다변량 법선의 경우 다음과 같이 간단한 방법으로 수행 할 수 있습니다.

첫 번째 경우 모집단 구조 (예측 0 및 항등 공분산 행렬이있는 iid 표준 노멀)없이 임의의 법선을 사용한 다음 공분산 행렬을 얻고 원하는 것을 의미하도록 강요 할 수 있습니다. 경우 와 인구 평균이고 공분산 필요한 및 IID 표준 정상하면 계산 일부, (예 적합한 촐레 스키 분해를 통해 획득 될 수 있음) . 그러면 원하는 인구 특성을 갖는다.Σ z y = L z + μ L L L ' = Σ L yμΣzy=Lz+μLLL=ΣLy

두 번째로, 먼저 랜덤 평균을 변환하여 0 평균 및 항등 공분산에서 임의의 변동도 제거하고 (샘플 평균을 0으로 만들고 샘플 공분산 ) 이전과 같이 진행해야합니다. 그러나 정확한 평균 에서 표본 편차를 제거하는 초기 단계 에서 분산 은 분포를 방해합니다. (작은 샘플에서는 상당히 심할 수 있습니다.) 0 나는In0I

이것은 샘플 평균 ( ) 를 빼고 스키 분해 계산하여 수행 할 수 있습니다 . 만약 인 왼쪽 촐레 스키 인자 후 샘플 평균 0 및 신원 샘플 공분산을 가져야한다. 그런 다음 를 계산 하고 원하는 샘플 모멘트를 갖는 샘플을 가질 수 있습니다. (샘플 수량을 어떻게 정의 하느냐에 따라 과 같은 요소로 곱셈 / 나누기와 관련된 작은 바이올린이있을 수 있지만 그 필요성을 쉽게 식별 할 수 있습니다.)z = z ˉ z z L z ( 0 ) =zz=zz¯zL y = L zz(0)=(L)1zy=Lz(0)+μn1n


1
+1. 다른 날에는 주어진 샘플 공분산 행렬로 일부 데이터를 생성해야했으며 어떻게해야할지 몰랐으며 어떤 이유로 든 답을 찾는 데 많은 시간이 걸렸습니다. 이 스레드의 가시성을 높이고 제안을 설명하기 위해 Matlab 코드로 여기에 다른 답변을 게시했습니다.
amoeba는

@amoeba 아직 사용하지 않은 검색어 중 하나를 질문 태그에 넣을 가능성이 있는지 궁금하거나 질문의 ​​텍스트를 약간 편집하여 삽입하면 여전히 찾을 수 있습니다. ). 나는 R에서 똑같은 일을 해야하는지 궁금하지만 ... 내 대답이나 당신의 추가로 더 나아지나요?
Glen_b-복지 주 모니카

1
나는 이미 질문을 편집 할 자유를 얻었고 가능한 많은 키워드를 포함하도록 내 대답을 공식화하려고했습니다. 이것이 도움이되기를 바랍니다. 그건 그렇고,이 간단한 팁 (필요한 공분산으로 변환하기 전에 생성 된 데이터를 희게 함)이 구글에 너무 어렵다는 것에 놀랐습니다. 마지막으로 답을 찾을 때까지 CV 또는 다른 곳에서 아무것도 찾을 수 없었습니다.
amoeba는

1
@amoeba 아, 감사합니다. 예, 실제로, 나는 다변량 사례에 대해 언급 된 곳을 본 적이 있다고 생각할 수 없습니다. 일 변량 사례에서 이미 보았습니다).
Glen_b-복지 주 모니카

@Glen_b 당신이 말한 것처럼,이 "세척 된"샘플의 결과적인 분포는 정상일 수 없습니다. 결과 분포가 무엇인지 알 수 있습니까? 거나 같은지 여부 어쩌면 / 아닌 조건부 분포와 동일 Zz¯=μ,Cov(z)=Σ
GG

17

@Glen_b는 좋은 답변 (+1)을 주었으며 코드로 설명하고 싶습니다.

주어진 공분산 행렬 Σd- 차원 다변량 가우스 분포 로부터 샘플 을 생성하는 방법 ? 표준 가우시안에서 샘플을 생성하고 공분산 행렬의 제곱근, 예를 들어 c h o l ( Σ )로 곱하면 쉽게 수행 할 수 있습니다 . 이것은 CV의 많은 스레드에서 다룹니다. 예를 들면 다음과 같습니다 . 간단한 Matlab 구현은 다음과 같습니다.ndΣchol(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

결과 데이터의 샘플 공분산 행렬은 물론 정확히 아닙니다 . 위의 예에서 예를 들어 반환Σcov(X)

1.0690    0.7296
0.7296    1.0720

미리 지정된 샘플 상관 또는 공분산 행렬로 데이터를 생성하는 방법은 무엇입니까?

@Glen_b가 쓴 것처럼 표준 가우시안에서 데이터를 생성 한 후 샘플 공분산 행렬 갖도록 중심을 맞추고, 희게하고 표준화합니다 . 그런 다음에 만 c h o l ( Σ ) 를 곱하십시오 .Ichol(Σ)

Matlab 예제의 연속은 다음과 같습니다.

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

이제 cov(X)필요에 따라

1.0000    0.7000
0.7000    1.0000

+1. 어떻게 든이 질문은 이력서의 여러 위치에서 다양한 형태로 나타납니다. 다변량 분포가 비 가우시안이라는 것을 알고 있다면 진행할 수있는 방법이 있습니까?
rgk

다변량 분포의 형태를 알고 있다면 아마도 어떤 경우에 보이기를 원할 것입니다.
Glen_b-복지 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.