matlab - multivariante - ICA-Independencia estadística y valores propios de la matriz de covarianza
correlacion matlab codigo (2)
Actualmente estoy creando diferentes señales usando Matlab, mezclándolas multiplicándolas por una matriz de mezcla A, y luego tratando de recuperar las señales originales usando FastICA .
Hasta ahora, las señales recuperadas son realmente malas en comparación con las originales, que no era lo que esperaba.
Estoy tratando de ver si estoy haciendo algo mal. Las señales que estoy generando son las siguientes: (Las amplitudes están en el rango [0,1]).
s1 = (-x.^2 + 100*x + 500) / 3000; % quadratic
s2 = exp(-x / 10); % -ve exponential
s3 = (sin(x)+ 1) * 0.5; % sine
s4 = 0.5 + 0.1 * randn(size(x, 2), 1); % gaussian
s5 = (sawtooth(x, 0.75)+ 1) * 0.5; % sawtooth
Una condición para que ICA tenga éxito es que como mucho una señal es gaussiana, y he observado esto en mi generación de señal.
Sin embargo, otra condición es que todas las señales son estadísticamente independientes.
Todo lo que sé es que esto significa que, dadas dos señales A y B, conocer una señal no da ninguna información con respecto a la otra, es decir: P (A | B) = P (A) donde P es la probabilidad .
Ahora mi pregunta es esta: ¿Mis señales son estadísticamente independientes? ¿Hay alguna manera de que pueda determinar esto? Tal vez alguna propiedad que debe ser observada?
Otra cosa que he notado es que cuando calculo los valores propios de la matriz de covarianza (calculada para la matriz que contiene las señales mixtas), el espectro propio parece mostrar que solo hay un componente principal (principal) . ¿Qué significa esto realmente? ¿No debería haber 5, ya que tengo 5 señales (supuestamente) independientes?
Por ejemplo, cuando se utiliza la siguiente matriz de mezcla:
A =
0.2000 0.4267 0.2133 0.1067 0.0533
0.2909 0.2000 0.2909 0.1455 0.0727
0.1333 0.2667 0.2000 0.2667 0.1333
0.0727 0.1455 0.2909 0.2000 0.2909
0.0533 0.1067 0.2133 0.4267 0.2000
Los valores propios son: 0.0000 0.0005 0.0022 0.0042 0.0345
(¡solo 4!)
Cuando se utiliza la matriz de identidad como la matriz de mezcla (es decir, las señales mixtas son las mismas que las originales), el espectro propio es: 0.0103 0.0199 0.0330 0.0811 0.1762
. Todavía hay un valor mucho más grande que el resto.
Gracias por tu ayuda.
Me disculpo si las respuestas a mis preguntas son dolorosamente obvias, pero realmente soy nuevo en estadísticas, ICA y Matlab. Gracias de nuevo.
EDITAR - Tengo 500 muestras de cada señal, en el rango [0.2, 100], en pasos de 0.2, es decir, x = 0:0.1:100
.
EDITAR - Dado el Modelo ICA: X = As + n (No estoy agregando ningún ruido en este momento), pero me refiero al espectro propio de la transposición de X, es decir, eig(cov(X''))
.
Para encontrar si las señales son mutuamente independientes, puede ver las técnicas que se describen aquí. En general, dos variables aleatorias son independientes si son ortogonales. Esto significa que: E {s1 * s2} = 0 Significa que la expectativa de la variable aleatoria s1 multiplicada por la variable aleatoria s2 es cero. Esta condición de ortogonalidad es extremadamente importante en estadística y probabilidad y se muestra en todas partes. Desafortunadamente se aplica a 2 variables a la vez. Hay técnicas multivariables, pero ninguna que me gustaría recomendar. Otro enlace que desenterré fue este, no estoy seguro de cuál es tu aplicación, pero ese documento está muy bien hecho.
Cuando calculo la matriz de covarianza, obtengo:
cov(A) =
0.0619 -0.0284 -0.0002 -0.0028 -0.0010
-0.0284 0.0393 0.0049 0.0007 -0.0026
-0.0002 0.0049 0.1259 0.0001 -0.0682
-0.0028 0.0007 0.0001 0.0099 -0.0012
-0.0010 -0.0026 -0.0682 -0.0012 0.0831
Con vectores propios, V
y valores D
:
[V,D] = eig(cov(A))
V =
-0.0871 0.5534 0.0268 -0.8279 0.0063
-0.0592 0.8264 -0.0007 0.5584 -0.0415
-0.0166 -0.0352 0.5914 -0.0087 -0.8054
-0.9937 -0.0973 -0.0400 0.0382 -0.0050
-0.0343 0.0033 0.8050 0.0364 0.5912
D =
0.0097 0 0 0 0
0 0.0200 0 0 0
0 0 0.0330 0 0
0 0 0 0.0812 0
0 0 0 0 0.1762
Aquí está mi código:
x = transpose(0.2:0.2:100);
s1 = (-x.^2 + 100*x + 500) / 3000; % quadratic
s2 = exp(-x / 10); % -ve exponential
s3 = (sin(x)+ 1) * 0.5; % sine
s4 = 0.5 + 0.1 * randn(length(x), 1); % gaussian
s5 = (sawtooth(x, 0.75)+ 1) * 0.5; % sawtooth
A = [s1 s2 s3 s4 s5];
cov(A)
[V,D] = eig(cov(A))
Avíseme si puedo ayudar más, o si no entendí bien.
EDITAR Adecuadamente referido a autovalores y vectores, se usó un código de intervalo de muestreo de 0,2 agregado.
Tus señales están correlacionadas (no son independientes). Desde el principio, el diente de sierra y el seno son el mismo período. Dime el valor de uno, te diré el valor de la otra correlación perfecta.
Si cambia el período de uno de ellos, eso los hará más independientes.
También S1 y S2 están un poco correlacionados.
En cuanto a los valores propios, antes que nada sus señales no son independientes (ver arriba).
En segundo lugar, su matriz de filtro A tampoco está bien condicionada, extendiendo aún más sus valores propios.
Incluso si tuvieras que canalizar cinco señales totalmente independientes (iid, yada yada), la covarianza sería:
E[ A y y'' A'' ] = E[ A I A'' ] = A A''
Los valores propios de eso son:
eig(A*A'')
ans =
0.000167972216475
0.025688510850262
0.035666735304024
0.148813869149738
1.042451912479502
Entonces, realmente estás filtrando / aplastando todas las señales en una función básica / grado de libertad y, por supuesto, será difícil recuperarlas, sea cual sea el método que uses.