Generieren von Werten aus einer multivariaten Gaußschen Verteilung

14

Ich versuche gerade, Werte einer dimensionalen Zufallsvariablen zu simulieren , die eine multivariate Normalverteilung mit dem mittleren Vektor und der Kovarianzmatrix .NXμ=(μ1,...,μN)TS

Ich hoffe, eine Prozedur zu verwenden, die der inversen CDF-Methode ähnelt, was bedeutet, dass ich zuerst eine dimensionale einheitliche Zufallsvariable generieren und diese dann in die inverse CDF dieser Verteilung stecken möchte , um den Wert zu generieren .NUX

Ich habe Probleme, weil das Verfahren nicht gut dokumentiert ist und es leichte Unterschiede zwischen der Funktion mvnrnd in MATLAB und einer Beschreibung gibt, die ich auf Wikipedia gefunden habe .

In meinem Fall wähle ich auch die Parameter der Verteilung nach dem Zufallsprinzip aus. Insbesondere ich jedes der aus einer Gleichverteilung . Ich erstelle dann die Kovarianzmatrix mit der folgenden Prozedur:μiU(20,40)S

  1. Erstellen Sie eine untere Dreiecksmatrix mit für und für LL(i,i)=1i=1..NL(i,j)=U(1,1)i<j

  2. Sei wobei die Transponierte von .S=LLTLTL

Mit dieser Prozedur kann ich sicherstellen, dass symmetrisch und positiv bestimmt ist. Es gibt auch eine untere Dreiecksmatrix so dass , was meiner Meinung nach erforderlich ist, um Werte aus der Verteilung zu generieren.L S = L L TSLS=LLT

Unter Verwendung der Wikipedia-Richtlinien sollte es mir möglich sein, Werte mit einer dimensionalen Uniform wie folgt zu generieren :NXN

  • X=μ+LΦ1(U)

Gemäß der MATLAB-Funktion geschieht dies jedoch normalerweise wie folgt:

  • X=μ+LTΦ1(U)

Wobei die inverse CDF einer dimensionalen, trennbaren Normalverteilung ist und der einzige Unterschied zwischen beiden Methoden einfach darin besteht, ob oder L ^ T verwendet wird . N L L TΦ1NLLT

Ist MATLAB oder Wikipedia der richtige Weg? Oder sind beide falsch?

Berk U.
quelle
2
Wie bereits erwähnt, sind beide falsch , weil ein Zeilenvektor ist , während ist ein Spaltenvektor ist. Wenn Sie Ihre Zeilen und Spalten begradigt haben, sollte sich diese Frage von selbst beantworten, indem Sie einfach identifizieren, welche Version von oder ergibt Matrix und welche Version gibt nur eine Zahl: Überprüfen Sie, ob Sie die Erwartung der Matrix-Version berechnen können und ob es gibt . T * i n v n o r m ( U ) ( X - μ ) ' ( X - μ ) ( X - μ ) ( X - μ ) ' SμTinvnorm(U) (Xμ)(Xμ)(Xμ)(Xμ)S
Whuber
@whuber Yeap. Die Änderungen in der Formatierung für die Frage vorgenommen. Vielen Dank für den Tipp - auf jeden Fall der einfachste Weg, um zu überprüfen.
Berk U.

Antworten:

14

Wenn ist ein Spaltenvektor der Standardnormal RV, dann , wenn sie gesetzt , die Kovarianz von ist . Y = L X Y L L TXN(0,I)Y=LXYLLT

Ich denke, das Problem, das Sie haben, kann sich aus der Tatsache ergeben, dass die mvnrnd- Funktion von matlab Zeilenvektoren als Stichproben zurückgibt, auch wenn Sie den Mittelwert als Spaltenvektor angeben. z.B,

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

Beachten Sie, dass die Transformation eines Zeilenvektors die entgegengesetzte Formel ergibt. wenn ein Zeilenvektor ist, dann ist auch ein Zeilenvektor, also ist ein Spaltenvektor, und die Kovarianz von kann geschrieben werden . XZ=XLTZT=LXTZTE[ZTZ]=LLT

Basierend auf dem, was Sie geschrieben haben, ist die Wikipedia-Formel korrekt: Wenn ein von matlab zurückgegebener Zeilenvektor ist, können Sie ihn nicht mit linksmultiplizieren . ( Wenn Sie jedoch mit der rechten Maustaste mit multiplizieren , erhalten Sie eine Stichprobe mit der gleichen Kovarianz von )Φ1(U)LTLTLLT

Kissen
quelle
Beachten Sie, dass in der Hilfe für mvnrnd in matlab als Anzahl der Stichproben verwendet wird. die Anzahl der Dimensionen ist . Wenn Sie also nach Abtastwerten aus einer dimensionalen multivariaten Normalen fragen , werden diese als Matrix zurückgegeben. NDNDN×D
Jpillow