Génération de valeurs à partir d'une distribution gaussienne multivariée

14

Je suis actuellement en train de valeurs Simuler d'une N variable aléatoire de dimension qui a une distribution normale à plusieurs variables avec le vecteur moyen et covariance matrice .μ = ( μ 1 , . . . , Μ N ) T SXμ=(μ1,...,μN)TS

J'espère que d'utiliser une procédure similaire à la méthode CDF inverse, ce qui signifie que je veux d' abord générer une variable aléatoire de dimension uniforme puis branchez que dans le CDF inverse de cette distribution, afin de générer une valeur X .U XNUX

J'ai des problèmes car la procédure n'est pas bien documentée et il y a de légères différences entre la fonction mvnrnd dans MATLAB et une description que j'ai trouvée sur Wikipedia .

Dans mon cas, je choisis également les paramètres de la distribution au hasard. En particulier, je génère chacun des moyens, , à partir d'une distribution uniforme U (20,40) . Je construis ensuite la matrice de covariance S en utilisant la procédure suivante: U ( 20 , 40 ) SμiU(20,40)S

  1. Créer une matrice triangulaire inférieure LL(i,i)=1 pour i=1..N et L(i,j)=U(1,1) pour i<j

  2. Laissez S=LLTLT désigne la transposition de L .

Cette procédure me permet de m'assurer que S est symétrique et défini positif. Il fournit également une matrice triangulaire inférieure L sorte que S=LLT , qui je crois est nécessaire pour générer des valeurs à partir de la distribution.

En utilisant les directives de Wikipedia, je devrais être capable de générer des valeurs de X utilisant un uniforme N dimensionnel comme suit:

  • X=μ+LΦ1(U)

Cependant, selon la fonction MATLAB, cela se fait généralement comme suit:

  • X=μ+LTΦ1(U)

Où est l'inverse d'un CDF répartition de dimension, dissociable, normal, et la seule différence entre les deux méthodes est simplement de savoir si l'utilisation ou . N L L TΦ1NLLT

MATLAB ou Wikipedia est-il la voie à suivre? Ou ont-ils tous les deux tort?

Berk U.
la source
2
Comme indiqué, les deux sont faux car est un vecteur ligne tandis que T i n v n o r m ( U ) doit être un vecteur colonne. Lorsque vous obtenez des lignes et des colonnes redressées, cette question devrait se répondre simplement en identifiant la version de ( X - μ ) ( X - μ ) ou ( X - μ ) ( X - μ ) μTinvnorm(U) (Xμ)(Xμ)(Xμ)(Xμ)donne une matrice et qui donne la version juste un numéro: vérifiez que vous pouvez calculer l'espérance de la version de la matrice et qui lui donne . S
whuber
@whuber Yeap. Apporté les modifications dans la mise en forme de la question. Merci pour l'astuce - certainement la façon la plus simple de vérifier.
Berk U.13

Réponses:

14

Si est un vecteur de colonne de la norme normale RV, alors si vous définissez Y = L X , la covariance de Y est L L T . XN(0,I)Y=LXYLLT

Je pense que le problème que vous rencontrez peut provenir du fait que la fonction mvnrnd de matlab renvoie des vecteurs de ligne comme échantillons, même si vous spécifiez la moyenne comme vecteur de colonne. par exemple,

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

Et notez que la transformation d'un vecteur ligne vous donne la formule opposée. si est un vecteur ligne, alors Z = X L T est également un vecteur ligne, donc Z T = L X T est un vecteur colonne, et la covariance de Z T peut s'écrire E [ Z T Z ] = L L T . XZ=XLTZT=LXTZTE[ZTZ]=LLT

Sur la base de ce que vous avez écrit bien, la formule Wikipedia est correcte: si était un vecteur de ligne renvoyée par Matlab, vous ne pouvez pas gauche multiplier par L T . (Mais multiplier à droite par L T vous donnerait un échantillon avec la même covariance de L L T ).Φ1(U)LTLTLLT

jpillow
la source
Notez que l'aide pour mvnrnd dans matlab utilise comme nombre d'échantillons; le nombre de dimensions est D . Donc, si vous demandez N échantillons à une normale multivariée D- dimensionnelle, il les renvoie comme une matrice N × D. NDNDN×D
jpillow