Generazione di valori da una distribuzione gaussiana multivariata


14

Attualmente sto cercando di valori Simula di un N -dimensionale variabile casuale X che ha una distribuzione normale multivariata con vettore medio μ=(μ1,...,μN)T e la matrice di covarianza .S

Spero di utilizzare una procedura simile al metodo inversa CDF, il che significa che voglio generare un primo -dimensionale variabile aleatoria uniforme e quindi collegare quello nel CDF inversa di questa distribuzione, quindi di generare valore .U XNUX

Sto riscontrando problemi perché la procedura non è ben documentata e ci sono lievi differenze tra la funzione mvnrnd in MATLAB e una descrizione che ho trovato su Wikipedia .

Nel mio caso, sto anche scegliendo i parametri della distribuzione in modo casuale. In particolare, generi ciascuno dei mezzi, μi , da una distribuzione uniforme U(20,40) . Quindi costruisco la matrice di covarianza S usando la seguente procedura:

  1. Crea una matrice triangolare inferiore L dove L(i,i)=1 per i=1..N e L(i,j)=U(1,1) per i<j

  2. Let S=LLT dove LT indica la trasposta di L .

Questa procedura mi consente di garantire che S sia simmetrica e definita positiva. Fornisce anche una matrice triangolare inferiore L modo che S=LLT , che credo sia necessario per generare valori dalla distribuzione.

Usando le linee guida su Wikipedia, dovrei essere in grado di generare valori di X usando un'uniforme N dimensionale come segue:

  • X=μ+LΦ1(U)

Secondo la funzione MATLAB, tuttavia, ciò viene generalmente eseguito come:

  • X=μ+LTΦ1(U)

Dove è l'inverso di un CDF N dimensionale, separabili, distribuzione normale, e l'unica differenza tra i due metodi è semplicemente se uso L o L T .Φ1NLLT

MATLAB o Wikipedia è la strada da percorrere? O sono entrambi sbagliati?


2
Come detto, entrambi sono sbagliati perché è un vettore di riga mentre T i n v n o r m ( U ) deve essere un vettore di colonna. Quando si raddrizzano le righe e le colonne, questa domanda dovrebbe rispondere semplicemente identificando quale versione di ( X - μ ) ( X - μ ) o ( X - μ ) ( X - μ ) μTinvnorm(U) (Xμ)(Xμ)(Xμ)(Xμ)dà una matrice e quale versione dà solo un numero: verifica che si può calcolare l'aspettativa della versione matrice e che dà . S
whuber

@whuber Yeap. Apportate le modifiche alla formattazione della domanda. Grazie per il suggerimento: sicuramente il modo più semplice per verificare.
Berk, U.

Risposte:


14

Se è un vettore colonna di normale standard RV, quindi se si imposta Y = L X , la covarianza di Y è L L T . XN(0,I)Y=LXYLLT

Penso che il problema che stai riscontrando potrebbe derivare dal fatto che la funzione mvnrnd di matlab restituisce i vettori di riga come campioni, anche se specifichi la media come vettore di colonna. per esempio,

 > size(mvnrnd(ones(10,1),eye(10))  
 > ans =
 >      1    10

E nota che trasformare un vettore di riga ti dà la formula opposta. se è un vettore di riga, Z = X L T è anche un vettore di riga, quindi Z T = L X TXZ=XLTZT=LXT è un vettore di colonna e la covarianza di può essere scritta E [ Z T Z ] = L L T . ZTE[ZTZ]=LLT

Sulla base di ciò che hai scritto, la formula di Wikipedia è corretta: se Φ1(U) erano un vettore riga restituita da MATLAB, non è possibile a sinistra moltiplicarlo per . (Ma moltiplicare a destra per L T ti darebbe un campione con la stessa covarianza di L L T ).LTLTLLT


Si noti che l'aiuto per mvnrnd in matlab usa come numero di campioni; il numero di dimensioni è D . Quindi, se chiedi N campioni da una normale multivariata D- dimensionale, li restituisce come una matrice N × D. NDNDN×D
jpillow,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.