La función de Matlab 'randn' aleatoriza una distribución gaussiana con $\mu= \begin {pmatrix} 0\\0\end{pmatrix}$ y $cov= \begin {pmatrix} 1&0\\0&1\end{pmatrix}$ Ineed para aleatorizar un vector de distribución gaussiana con $cov= \begin {pmatrix} 3&1\\1&3\end{pmatrix}$ . ¿cómo puedo cambiar la matriz de covarianza?
Respuesta
¿Demasiados anuncios?El Caja de herramientas de estadística tiene una función mvnrnd
(ver su documentación ) para generar conjuntamente variables aleatorias gaussianas con medias y matriz de covarianza especificadas:
N = 10; % desired number of samples of each variable
mu = [10; 10]; % vector of means
cov = [3 1; 1 3]; % covariance matrix
samples = mvnrnd(mu, cov, N);
Si quieres hacerlo manualmente se pueden generar RV gaussianas estándar independientes (con randn
) y aplicar una transformación afín que dará el vector medio y la matriz de covarianza deseados. Para ello es necesario calcular la descomposición de Cholesy de esta última. Vea los detalles del ejemplo aquí . Obsérvese que la salida del programa de Matlab chol
(véase su documentación ) necesita ser (conjugado-)transpuesto para ajustarse al procedimiento descrito en el enlace.
El código sería:
N = 10; % desired number of samples of each variable
mu = [10; 10]; % vector of means
cov = [3 1; 1 3]; % covariance matrix
independent_samples = randn(N, size(cov,1));
A = chol(cov)';
samples = bsxfun(@plus, mu, A*independent_samples.').';
Ejemplo de realización con sus entradas y N=1e5
muestras, trazadas con
plot(samples(:,1), samples(:,2), '.', 'markersize', .1)
axis square