Tengo N sensores que se ha muestreado M veces, así que tengo una N por M lectura de la matriz. Si quiero saber la relación y dependencias de estos sensores cosa más simple es hacer una correlación de Pearson, que me da un N por N matriz de correlación. Ahora vamos a decir si tengo la matriz de correlación, pero quiero explorar tho posible lectura de espacio que puede conducir a tales matriz de correlación ¿qué puedo hacer? Así que la pregunta es: dado un N por N matriz de correlación de cómo se puede llegar a una matriz que tendrían matriz de correlación? Cualquier comentario se agradece.
Respuestas
¿Demasiados anuncios?Usted puede hacer un cholesky descomposición, de tal manera que si la correlación de la matriz es R , entonces si
$ L*transpose(L) = R $
a continuación, $ L = cholesky(R)$
Aquí L es triangular de tamaño N. Ahora también se podría entender L como un simple giro de su original lectura de la matriz de donde la M columnas se rotan para encajar en N (<=M ) columnas/vectorspace.
Así que usted puede aplicar a cualquier rotación arbitraria a las columnas de L, que puede ser arbitrariamente extendido a algunos M columnas anexando null-columnas.
Usted también puede aplicar un "estiramiento" de las filas en que reconstruidas "lectura"de la matriz por la multiplicación de cada fila por algún estándar de la desviación desde el Lde la matriz representa las filas con la norma 1.
(Si lo desea, puede descargar mi (gratis) MatMate-programa para la matriz de visualización y consulte con un simple script lo que quiero decir aquí/¿cómo funciona esto. Aquí está la página de descarga .)
[actualización] Aquí les doy un ejemplo. Después de leer más comentarios que yo entiendo, que el objetivo era construir una base de datos-matriz de correlación de la matriz. En el ejemplo he construido un azar de correlación de la matriz de 4 por 4. Entonces me producen datos y, a continuación, puedo comprobar, si los datos, corrleated, reproducir la correlación de la matriz. Lo hacen, y porque la matriz álgebra es simple también podemos ver que esto es exacto.
;===========================================
;MatMate-Listing vom:16.01.2011 18:33:13
;============================================
[1] cor = covtocorr(cov) // this is the correlation-matrix from a given covariance.
cor :
1.00 -0.38 0.22 -0.85
-0.38 1.00 0.30 0.57
0.22 0.30 1.00 0.27
-0.85 0.57 0.27 1.00
[2] lad = cholesky(cor) // this provides a "loadings"-matrix by cholesky-decomposition
// of matrix cor
lad :
1.00 0.00 0.00 0.00
-0.38 0.93 0.00 0.00
0.22 0.42 0.88 0.00
-0.85 0.27 0.39 0.25
Now we want to construct 200 columns of data. As I wrote earlier, the cholesky
matrix L of a given correlationmatrix R is just a rotation of the data-matrix
One should add, that the data must be centered (mean=0) and normed(stddev=1)
Now I do the inverse: I construct a valid rotation-matrix t by just rotating a
dummy random-matrix of 200 columns to the first column(rotation method:"triangular").
[3] n=200
[4] dummy = randomu(1,n)
[5] t = gettrans(dummy,"tri")
[6] hide t,dummy
So I've got a valid rotation-matrix t.
Now I provide columns to rotate the cholesky/loadings-matrix within
and insert the cholesky matrix in the first 4 columns
[7] data = (lad || null(v,n-v)) * sqrt(n)
Then I rotate that data-matrix with that random rotation
[8] data = data * t
[9] disp = data[*,1..10] // show the first 10 columns of the created dataset
disp :
1.71 -0.11 -0.20 -0.05 -0.06 -0.21 -0.16 -0.14 -0.11 -0.21
0.23 13.12 0.08 0.02 0.02 0.08 0.06 0.05 0.04 0.08
2.22 5.77 12.34 -0.01 -0.01 -0.05 -0.03 -0.03 -0.02 -0.05
-0.46 3.83 5.63 3.52 0.05 0.18 0.13 0.12 0.09 0.17
Check whether that data really give the correlation-matrix
[10] chk_cor = data * data' /n
chk_cor :
1.00 -0.38 0.22 -0.85
-0.38 1.00 0.30 0.57
0.22 0.30 1.00 0.27
-0.85 0.57 0.27 1.00
Vemos que la correlación de la matriz se reproduce.
El "misterio" aquí es, simplemente, que en la definición de correlación (de la normativa de datos, para realizar el ejemplo corto)
R = los datos * datos' / n
aquí los datos pueden tener arbitraria muchas columnas
y t*t' es la identidad de la matriz, por lo que
R = los datos * t * t' * ' / n
R = (datos*t) * (datos*t)' / n
y el cholesky-factorización es sólo la operación para obtener L y L' de un correlationmatrix
L = cholesky(R) ==> L*L' = R
(Así, el resultado es también exacto)
[actualización]
[actualización 2] En respuesta a la observación de mpiktas voy a añadir una variante que permite establecer el estándar de la desviación y de los medios en los datos generados de manera explícita.
La discusión en la primera actualización fue mostrar, cómo el formulario de datos de un m-dimensional vectorspace, y el cholesky-descomposición de la función de correlación de la matriz pueden, simplemente, ser entendido como un especial de la rotación de los datos en que vectorspace.
Sin embargo, los medios de los datos generados de la manera que he descrito anteriormente no están garantizados para ser de cero. Soe aquí es una variante que produce medios=cero, stddevs=1 y los datos son escalables a otros stddevs y traducible a prediefined medios.
Aquí la idea es utilizar la L-matriz como de "receta para la composición de" de la no correlación entre los "factores" como se entiende en el análisis de los factores/PCA. Tener un centrado y normativa de la matriz de datos D se supone que el cholesky de la matriz de L describe una combinación lineal de correlación de datos de la unidad de la varianza ("factores") en una matriz de F con el mismo número de columnas de D tales que
L * F = D
Ahora, algunos aleatoria F puede ser creado por un azar del generador de la prestación de distribución normal con media=0 y stddev=1 por fila. Si las filas de F fueron verdaderamente no correlacionados, tuvimos la anterior composición de L * F = D una solución simple. Después de que podríamos escala de las filas de D estándar de las desviaciones y también traducir predefinidas medios.
Por desgracia randomgenerators exactamente no dar la no correlación de los datos, así que las correlaciones en F debe ser eliminado primero. Esto es posible por la inversa de la cholesky de la matriz de las correlaciones de F. Aquí está una secuencia de comandos de pseudocódigo
v = 4 // set number of variables/of rows, make a small example
n = 200 // set number of observations/ of columns
F = randomn(v,n,0,1) // generate randomdata in F where rows have mean=0, stddev=1
covF = F * F' /n
cholF = cholesky(covF)
L = cholesky( R ) // R is the targetted correlation-matrix
data = L * inv(cholF) * F
sdevs = diag([1,2,3,4]) // provide four stddevs
means = colvector([20,10,40,30]) // provide four means
simuldata = sdevs*data + means // here the means-vector must be expanded to
// be added to all columns in simuldata
Los datos simulados son en la matriz simuldata.
Mientras podemos establecer stddevs y significa explícitamente todavía hay un problema que pertenece: por el leftmultiplication de inv(cholF) y L la normal distribución en simuldata como originalmente proporcionada por el randomgenerator en F puede ser afectado/distorsiona un poco. No tengo una idea de cómo resolver este...
Lo que quieres hacer se llama muestreo de una distribución multivariante. No es difícil buscar cómo hacerlo, aunque en su caso si algunas de las variables que se supone normal y algunos de Poisson vas a tener que calcular la articulación PDF de su modelo de sí mismo. En lugar de tratar de explicar todo el proceso aquí, te voy a dar algunas cosas para que se lea:
http://en.wikipedia.org/wiki/Multivariate_normal_distribution
Puede hacer que su "10%" de aplicación más rápido mediante el uso de gradiente de la pendiente
He aquí un ejemplo de lo que es para la matriz de covarianza, porque es más fácil.
Ha $k\times k$ matriz de covarianza C y desea obtener $k \times n$ observación de la matriz de $A$ que la produce.
La tarea es encontrar a $A$ tal que
$$A A' = n^2 C$$
Usted podría comenzar con una estimación aleatoria para $A$ e intente minimizar la suma de los cuadrados de los errores. El uso de Frobenius de la norma, podemos escribir este objetivo como sigue
$$J=\|A A'-n^2 C\|^2_F$$
Deje $D$ ser nuestra matriz de errores, es decir,$D=A A'-n^2 C$. La comprobación con la Matriz de libro de cocina me sale el siguiente para el degradado
$$\frac{\partial J}{\partial a_{iy}} \propto a_{iy} \sum_j D_{i,j}$$
En otras palabras, la actualización de la matriz de datos para el sensor de $i$, observación de $y$ debe ser proporcional a la suma de los errores en $i$ésima fila de la matriz de covarianza multiplicado por el valor de $i,y$'th observación.
Gradiente de la pendiente paso sería la actualización de todos los pesos de una vez. Podría ser más robusto para actualizar la peor de las filas, es decir, calcular la suma de los errores para cada fila, la actualización de las entradas correspondientes a la peor de las filas, a continuación, volver a calcular los errores.
Puedo decirles a ustedes mi tonto solución a este problema? Sólo si no se ríen de mí! Pensé que necesitan para explorar este espacio lo quiero al azar de la muestra (el espacio de las lecturas del sensor). Yo sé lo que la matriz de correlación debería ser y sé que las lecturas de los sensores vienen de una distribución de Gauss. Así que me genera al azar de N por M matriz y comenzó a ajustar los valores en los pequeños pasos. y comprobar si cada cambio se mueve el matriv hacia el objetivo o de distancia y se mantienen los cambios hacia el objetivo. Así que elijo una al azar celda de esta matriz y aumentar en un 10% y calcular la matriz de correlación y compararlo con el destino de la matriz de correlación de la diferencia es menor de lo que era antes el 10% de aumento sigo el cambio y pasar a la siguiente seleccionados al azar de la célula y continuar hasta que consiga lo suficientemente cerca como para el destino de la matriz de correlación. Este método, aunque es una tontería, funciona bien y me pueden obtener diferentes muestras de la lectura del sensor de espacio. ¿Qué les parece?! En la práctica, en el que estoy trabajando bastante grande de matrices como N = 8000, M = 1000