46 votos

¿Cómo generar eficazmente matrices de correlación aleatorias semidefinidas positivas?

Me gustaría ser capaz de generar eficientemente matrices de correlación positivas-semidefinidas (PSD). Mi método se ralentiza drásticamente a medida que aumenta el tamaño de las matrices a generar.

  1. ¿Podría sugerir alguna solución eficaz? Si conoces algún ejemplo en Matlab, te lo agradecería mucho.
  2. A la hora de generar una matriz de correlación PSD, ¿cómo elegiría los parámetros para describir las matrices que se van a generar? ¿Una correlación media, la desviación estándar de las correlaciones, los valores propios?

3voto

Grant Puntos 5366

El método más sencillo es el anterior, que consiste en la simulación de un conjunto de datos aleatorios y el cálculo de la Gramian . Unas palabras de precaución: La matriz resultante no será uniformemente aleatoria, ya que su descomposición, digamos $U^TSU$ tendrá rotaciones no distribuidas según la medida de Haar. Si desea tener matrices PSD "uniformemente distribuidas", puede utilizar cualquiera de los enfoques descritos aquí .

3voto

PeriRamm Puntos 46

Si desea tener un mayor control sobre la matriz PSD simétrica generada, por ejemplo, para generar un conjunto de datos de validación sintético, dispone de una serie de parámetros. Una matriz PSD simétrica corresponde a una hiperelipse en el espacio N-dimensional, con todos los grados de libertad relacionados:

  1. Rotaciones.
  2. Longitudes de los ejes.

Así, para una matriz bidimensional (es decir, una elipse 2d), tendrá 1 rotación + 2 ejes = 3 parámetros.

Si las rotaciones nos traen a la mente las matrices ortogonales, es un tren de pensamiento correcto, ya que la construcción es de nuevo $\Sigma=ODO^T$ con $\Sigma$ siendo la matriz Sym.PSD producida, $O$ la matriz de rotación (que es ortogonal), y $D$ la matriz diagonal, cuyos elementos diagonales controlarán la longitud de los ejes de la elipse.

El siguiente código de Matlab traza 16 conjuntos de datos bidimensionales con distribución gaussiana basados en $\Sigma$ con un ángulo creciente. El código para la generación aleatoria de los parámetros está en los comentarios.

figure;
mu = [0,0];
for i=1:16
    subplot(4,4,i)
    theta = (i/16)*2*pi;   % theta = rand*2*pi;
    U=[cos(theta), -sin(theta); sin(theta) cos(theta)];
    % The diagonal's elements control the lengths of the axes
    D = [10, 0; 0, 1]; % D = diag(rand(2,1));    
    sigma = U*D*U';
    data = mvnrnd(mu,sigma,1000);
    plot(data(:,1),data(:,2),'+'); axis([-6 6 -6 6]); hold on;
end

Para más dimensiones, la matriz Diagonal es sencilla (como la anterior), y la $U$ debe derivar de la multiplicación de las matrices de rotación.

2voto

Jonathan Fingland Puntos 26224

Si quieres muestrear matrices de correlación aleatorias a partir de una distribución empírica, puedes intentar utilizar modelos generativos de aprendizaje automático para hacerlo.

Un ejemplo de ello es CorrGAN: muestreo de matrices de correlación financiera realistas mediante redes adversariales generativas

La idea básica es ajustar redes generativas adversariales (o autocodificadores variacionales) a un conjunto de matrices de correlación empíricas (que tienen ciertas propiedades que son difíciles de capturar/generar matemáticamente).

A continuación, puede utilizar estos modelos para muestrear tantas matrices de correlación aleatorias como desee que verifiquen las propiedades de las empíricas.

Dependiendo de las redes que utilice, puede querer proyectar la salida (que puede no ser totalmente PSD) en el conjunto de matrices de correlación ( con la proyección de Higham, por ejemplo ).

A sample of random correlation matrices obtained from CorrGAN

1voto

stovroz Puntos 111

Puede crear una matriz de covarianza arbitraria a partir de la distribución de Wishart utilizando la función estadística rWishart (incluida en R básico) y luego transformarla en una matriz de correlación

p <- 4
S <- drop(rWishart(1,p,diag(p)))
S * (diag(S)^(-1/2) %o% diag(S)^(-1/2))

La distribución Wishart toma dos parámetros: los grados de libertad $\nu$ y la matriz de escala $\Sigma$ . Para entender cómo influyen en el resultado, condier $X_i \overset{iid}{\sim} N_p(0,\Sigma)$ entonces $$ S = \sum\limits_{i=1}^\nu X_iX_i' \sim W_p(\nu,\Sigma) $$ Es decir, S sigue una distribución de Wishart en $p\times p$ matrices con $\nu$ grados de libertad y $\Sigma$ como matriz de escala. Como se ve, si $\nu$ es mayor que $p$ entonces $S$ será definida positiva a.s.(P). Además, $$ E(S) = \nu \Sigma $$ lo que significa que, en promedio, las extracciones aleatorias S se aproximarán a un valor proporcional a los verdaderos parámetros poblacionales $\Sigma$ en la probabilidad. Esta tasa de convergencia depende del valor de $\nu$ Así que si $p$ es muy grande, trate de mantener $\nu$ cerca de $p$ Si no fuera así, los sorteos aleatorios se aproximarían unos a otros.

0voto

Un enfoque barato y alegre que he utilizado para las pruebas es generar m N(0,1) n-vectores V[k] y luego usar P = d*I + Sum{ V[k]*V[k]'} como una matriz nxn psd. Con m < n esto será singular para d=0, y para d pequeño tendrá un alto número de condición.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X