Wenn Sie von N (μ, Q -1) und Q ist nur zur Probe verfügbar sind, können Sie die Cholesky-Faktorisierung von Q nehmen, L, so dass LL T = Q. Als nächstes nehme man das Inverse von L T, L -T, und teste Z aus einer Standardnormalverteilung N (0, I).
Anbetracht dessen, dass L -T ist eine obere Dreiecks dxd Matrix und Z ein d-dimensionalen Spaltenvektor, μ + L -T Z als N verteilt werden (μ, Q -1) .
Wenn Sie vermeiden möchten, die Inverse von L zu verwenden, können Sie stattdessen das Dreieckssystem der Gleichungen L T v = Z durch Rücksubstitution lösen. μ + v wird dann als N verteilt (μ, Q -1).
einigen anschaulichen Matlab Code:
% einer 2x2 Kovarianzmatrix und einen Durchschnittsvektor machen
covm = [3 0,4 * (sqrt (3 * 7)); 0.4 * (sqrt (3 * 7)) 7];
mu = [100; 2];
% Holen der Präzision Matrix
Q = inv (covm);
% die Cholesky-Zerlegung von Q nehmen (Chol in Matlab liefert bereits das obere Dreieck factor)
L = Chol (Q);
% Ziehen 2000 Proben aus einer Standard bivariate Normalverteilung
Z = normrnd (0,1, [2, 2000]); Die mittlere
X = repmat (mu, 1, 2000) + L \ Z
% lösen das System und fügen;
% überprüft das Ergebnis
Mittelwert (X ')
var (X')
corrcoef (X ')
% zur Probennahme aus der Kovarianzmatrix vergleichen
Y = mvrnd (mu, covm, 2000) ';
Mittelwert (Y ')
var (Y')
corrcoef (Y ')
scatter (X (1, :), X (2 :),' b‘)
Halt auf
Streuung (Y (1, :), Y (2 :), 'r')
für mehr Effizienz, ich denke, Sie som suchen Ein Paket, das dreieckige Systeme effizient löst.
Können Sie die Mathematik dieses Teils erweitern, "Wenn Sie nur inv (A) wissen, kann dies immer noch ohne eine Matrixinverse durchgeführt werden, indem stattdessen ein lineares System gelöst wird (zB über den Backslash-Operator)" in anderen Sprachen nachgeahmt werden? – NewNameStat