Me gustaría poder generar eficientemente matrices de correlación semidefinidas positivas (PSD). Mi método se ralentiza dramáticamente a medida que aumento el tamaño de las matrices que se generarán.
- ¿Podría sugerir alguna solución eficiente? Si conoce algún ejemplo en Matlab, estaría muy agradecido.
- Al generar una matriz de correlación PSD, ¿cómo elegiría los parámetros para describir las matrices que se generarán? ¿Una correlación promedio, desviación estándar de correlaciones, valores propios?
random-generation
correlation-matrix
Eduardas
fuente
fuente
Respuestas:
Puede hacerlo al revés: cada matriz (el conjunto de todas las matrices PSD simétricas ) se puede descomponer comoC∈Rp++ p×p
Para obtener , primero genere una base aleatoria (donde son vectores aleatorios, generalmente en ). A partir de ahí, use el proceso de ortogonalización de Gram-Schmidt para obtener( v 1 , . . . , V p ) v i ( - 1 , 1 ) ( u 1 , . . . . , U p ) = OO (v1,...,vp) vi (−1,1) (u1,....,up)=O
Finalmente, es una matriz diagonal cuyos elementos son todos positivos (esto es, nuevamente, fácil de generar: generar p números aleatorios, cuadrarlos, clasificarlos y colocarlos en la diagonal de una identidad p por p matriz).D p p p
fuente
Un documento que genera matrices de correlación aleatorias basadas en vides y método de cebolla extendida por Lewandowski, Kurowicka y Joe (LKJ), 2009, proporciona un tratamiento unificado y una exposición de los dos métodos eficientes de generar matrices de correlación aleatorias. Ambos métodos permiten generar matrices a partir de una distribución uniforme en un cierto sentido preciso definido a continuación, son fáciles de implementar, rápidos y tienen la ventaja adicional de tener nombres divertidos.
Una matriz simétrica real de tamaño con unos en la diagonal tiene d ( d - 1 ) / 2 elementos únicos fuera de la diagonal y, por lo tanto, se puede parametrizar como un punto en R d ( d - 1 ) / 2 . Cada punto en este espacio corresponde a una matriz simétrica, pero no todos son positivos definidos (como deben ser las matrices de correlación). Las matrices de correlación, por lo tanto, forman un subconjunto de R d ( d - 1 ) / 2d×d d(d−1)/2 Rd(d−1)/2 Rd(d−1)/2 (en realidad, un subconjunto convexo conectado), y ambos métodos pueden generar puntos a partir de una distribución uniforme sobre este subconjunto.
Proporcionaré mi propia implementación de MATLAB de cada método y los ilustraré con .d=100
Método de cebolla
El método de la cebolla proviene de otro artículo (ref. # 3 en LKJ) y su nombre se debe al hecho de que las matrices de correlación se generan comenzando con una matriz y creciendo columna por columna y fila por fila. La distribución resultante es uniforme. Realmente no entiendo las matemáticas detrás del método (y prefiero el segundo método de todos modos), pero aquí está el resultado:1×1
Aquí y debajo, el título de cada subtrama muestra los valores propios más pequeños y más grandes, y el determinante (producto de todos los valores propios). Aquí está el código:
Método de cebolla extendida
LKJ modifica ligeramente este método para poder muestrear matrices de correlación de una distribución proporcional a [ d e tC . Cuanto mayor sea η , mayor será el determinante, lo que significa que las matrices de correlación generadas se acercarán cada vez más a la matriz de identidad. El valor η = 1 corresponde a una distribución uniforme. En la figura siguiente, las matrices se generan con η = 1 , 10 , 100 , 1000 , 10[detC]η−1 η η=1 .η=1,10,100,1000,10000,100000
Por alguna razón para obtener el determinante del mismo orden de magnitud que en el método de la cebolla de vainilla, necesito poner y no η = 1 (como afirma LKJ). No estoy seguro de dónde está el error.η=0 η=1
Método de la vid
El método Vine fue originalmente sugerido por Joe (J en LKJ) y mejorado por LKJ. Me gusta más, porque es conceptualmente más fácil y también más fácil de modificar. La idea es generar correlaciones parciales (son independientes y pueden tener cualquier valor de [ - 1 , 1 ]d(d−1)/2 [−1,1] sin restricciones) y luego conviértalos en correlaciones crudas a través de una fórmula recursiva. Es conveniente organizar el cálculo en un cierto orden, y este gráfico se conoce como "vid". Es importante destacar que si se muestrean correlaciones parciales de distribuciones beta particulares (diferentes para diferentes células en la matriz), la matriz resultante se distribuirá uniformemente. Aquí nuevamente, LKJ introduce un parámetro adicional para muestrear desde una distribución proporcional a [ d e tη . El resultado es idéntico a la cebolla extendida:[detC]η−1
Método de vid con muestreo manual de correlaciones parciales.
Tenga en cuenta que en este caso no se garantiza que la distribución sea invariante de permutación, por lo que adicionalmente permuto aleatoriamente filas y columnas después de la generación.
Así es como los histogramas de los elementos fuera de la diagonal buscan las matrices anteriores (la variación de la distribución aumenta monotónicamente):
Actualización: utilizando factores aleatorios
Y el codigo:
Aquí está el código de ajuste utilizado para generar las figuras:
fuente
Dependiendo de la aplicación, esto puede no darle la distribución de los valores propios que desea; La respuesta de Kwak es mucho mejor en ese sentido. Los valores propios
X
producidos por este fragmento de código deben seguir la distribución Marchenko-Pastur.Para simular las matrices de correlación de acciones, por ejemplo, es posible que desee un enfoque ligeramente diferente:
fuente
fuente
No ha especificado una distribución para las matrices. Dos comunes son las distribuciones Wishart y Wishart inversa. La descomposición de Bartlett proporciona una factorización de Cholesky de una matriz aleatoria de Wishart (que también se puede resolver de manera eficiente para obtener una matriz inversa aleatoria de Wishart).
De hecho, el espacio Cholesky es una forma conveniente de generar otros tipos de matrices PSD aleatorias, ya que solo debe asegurarse de que la diagonal no sea negativa.
fuente
fuente
Si desea tener más control sobre su matriz PSD simétrica generada, por ejemplo, generar un conjunto de datos de validación sintética, tiene una serie de parámetros disponibles. Una matriz PSD simétrica corresponde a una hiper-elipse en el espacio N-dimensional, con todos los grados de libertad relacionados:
Entonces, para una matriz bidimensional (es decir, elipse 2d), tendrá 1 rotación + 2 ejes = 3 parámetros.
Si las rotaciones traen a la mente matrices ortogonales, es un tren correcto, ya que la construcción es nuevamenteΣ = O D OT , con Σ siendo la matriz Sym.PSD producida, O la matriz de rotación (que es ortogonal) y re 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 distribuidos en Gauss bidimensionales basados enΣ , con un ángulo creciente. El código para la generación aleatoria de parámetros está en los comentarios.
Para más dimensiones, la matriz Diagonal es directa (como arriba), y elU debe derivar de la multiplicación de las matrices de rotación.
fuente
Un enfoque barato y alegre que he usado para probar es generar m N (0,1) n-vectores V [k] y luego usar P = d * I + Suma {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 número de condición alto.
fuente