ICA - Indépendance statistique et valeurs propres de la matrice de covariance

14

Je crée actuellement différents signaux à l'aide de Matlab, je les mélange en les multipliant par une matrice de mélange A, puis j'essaie de récupérer les signaux d'origine en utilisant FastICA .

Jusqu'à présent, les signaux récupérés sont vraiment mauvais par rapport aux signaux d'origine, ce qui n'était pas ce à quoi je m'attendais.

J'essaie de voir si je fais quelque chose de mal. Les signaux que je génère sont les suivants:

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

Signaux originaux

Une condition pour que l'ICA réussisse est qu'au plus un signal soit gaussien, et je l'ai observé dans ma génération de signal.

Cependant, une autre condition est que tous les signaux soient statistiquement indépendants.

Tout ce que je sais, c'est que cela signifie que, étant donné deux signaux A et B, connaître un signal ne donne aucune information par rapport à l'autre, c'est-à-dire: P (A | B) = P (A) où P est la probabilité .

Maintenant, ma question est la suivante: mes signaux sont-ils statistiquement indépendants? Existe-t-il un moyen de déterminer cela? Peut-être une propriété qui doit être observée?

Une autre chose que j'ai remarquée est que lorsque je calcule les valeurs propres de la matrice de covariance (calculées pour la matrice contenant les signaux mixtes), le spectre propre semble montrer qu'il n'y a qu'une seule composante principale (principale) . Qu'est-ce que cela signifie vraiment? Ne devrait-il pas y en avoir 5, car j'ai 5 signaux (supposés) indépendants?

Par exemple, lorsque vous utilisez la matrice de mélange suivante:

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

Les valeurs propres sont: 0.0000 0.0005 0.0022 0.0042 0.0345(seulement 4!)

Lors de l' utilisation de la matrice d'identité de la matrice de mélange ( à savoir les signaux mixtes sont les mêmes que ceux d' origine), le eigenspectrum est: 0.0103 0.0199 0.0330 0.0811 0.1762. Il y a encore une valeur beaucoup plus grande que les autres ..

Merci de votre aide.

Je m'excuse si les réponses à mes questions sont douloureusement évidentes, mais je suis vraiment nouveau dans les statistiques, l'ICA et Matlab. Merci encore.

ÉDITER

J'ai 500 échantillons de chaque signal, dans la plage [0,2, 100], par pas de 0,2, soit x = 0: 0,1: 100.

De plus, étant donné le modèle ICA: X = As + n (je n'ajoute aucun bruit pour le moment), je me réfère au spectre propre de la transposition de X, c'est-à-dire eig (cov (X ')).

MISE À JOUR

Comme suggéré (se référer aux commentaires), j'ai essayé FastICA sur seulement 2 signaux. Les résultats étaient assez bons (voir photo ci-dessous). La matrice de mélange utilisée était A = [0.75 0.25; 0.25 0.75]. Cependant, le spectre eigens 0.1657 0.7732n'a montré qu'une seule composante principale principale.

Ma question se résume donc à ce qui suit: Quelle fonction / équation / propriété puis-je utiliser pour vérifier si un certain nombre de vecteurs de signaux sont statistiquement indépendants?

Sine & Gaussian - FastICA

Rachel
la source
1
Excellente question. J'ai demandé comment nous pouvons savoir quand deux signaux sont indépendants ici ( dsp.stackexchange.com/questions/1242/… ) mais je ne suis pas allé trop loin avec cela. :-) Je suis également nouveau à l'ICA mais je pourrais peut-être faire la lumière.
Spacey
@Mohammad Êtes-vous toujours intéressé par une réponse à cette question? Je mettrai volontiers une prime dessus pour susciter l'intérêt.
Phonon
@Mohammad J'ai voté pour votre question. J'espère que vous obtiendrez une bonne réponse, elle est vraiment liée à la mienne. J'ai lu les commentaires à ce sujet jusqu'à présent, et il y a beaucoup de statistiques en cours que je ne comprends pas. Avez-vous réussi à trouver un moyen précis de conclure si deux signaux sont indépendants ou non?
Rachel
@Rachel Pas encore pour le moment, mais je vais faire des recherches supplémentaires et vous en informer. C'est un concept très important, qui, je pense, est généralement vitré malheureusement.
Spacey
Merci @Mohammad. Je suis d'accord. Les signaux indépendants observent la propriété que E (s1, s2) = E (s1) x E (s2), mais je ne sais pas comment le calculer réellement pour des signaux réels.
Rachel

Réponses:

8

Les signaux 3 et 5 semblent être assez corrélés - ils partagent leur première harmonique. Si on me donnait deux mélanges de ceux-ci, je ne serais pas en mesure de les séparer, je serais tenté de mettre l'harmonique commune comme un signal et les harmoniques supérieures comme un deuxième signal. Et je me trompe! Cela pourrait expliquer la valeur propre manquante.

Les signaux 1 et 2 ne semblent pas indépendants non plus.

Un "contrôle de santé mentale" rapide et sale pour l'indépendance de deux séries consiste à faire un (x, y) tracé d'un signal par rapport à l'autre:

plot (sig3, sig5)

puis de faire le même tracé (x, y) avec un signal mélangé:

indices = randperm(length(sig3))
plot(sig3(indices), sig5)

Si les deux tracés ont un aspect différent, vos signaux ne sont pas indépendants. Plus généralement, si le tracé (x, y) des données montre des "caractéristiques", des dissymétries, etc., c'est un mauvais présage.

Des tests d'indépendance appropriés (et ce sont les fonctions objectives utilisées dans la boucle d'optimisation ICA) incluent, par exemple, des informations mutuelles.

ICA récupère les signaux les plus indépendants dont un mélange linéaire produit vos données d'entrée . Il fonctionnera comme une méthode de séparation des signaux et ne récupérera les signaux d'origine que si ceux-ci étaient au maximum indépendants selon le critère d'optimisation utilisé dans votre implémentation ICA.

pichenettes
la source
1
Question: Si les 5 signaux dans son cas étaient en fait tous indépendants, alors nous nous attendrions à ce qu'il n'y ait AUCUN composant principal correct? (En d'autres termes, toutes les valeurs propres seraient en quelque sorte les mêmes). Géométriquement, on aurait un «nuage» guassien en 5 dimensions, d'accord?
Spacey
J'avais également contacté un auteur de l'ICA au sujet de l'élimination de deux sinusoïdes d'un mélange, et il a dit que cela pouvait en fait être fait avec l'ICA. Cela me déroute un peu en fonction de ce que vous dites en ce qui concerne les signaux 3 et 5 car (je suis d'accord avec vous), ils semblent corrélés.
Spacey
@pichenettes J'ai tracé ces graphiques comme vous l'avez suggéré - et les graphiques ont en effet un aspect différent. Malheureusement, je ne sais toujours pas comment tester l'indépendance. J'ai vraiment besoin d'un moyen de générer des signaux statistiquement indépendants, afin de pouvoir évaluer les performances de FastICA.
Rachel
X1[n]X2[n]
@Mohammad Je n'ai pas enregistré ma propre voix mais j'ai essayé d'utiliser FastICA sur un mélange de signaux sinusodiaux et gaussiens. Je pense qu'ils sont indépendants .. FastICA s'est assez bien comporté mais le spectre de la musique était toujours bizarre. Je mettrai à jour ma question pour afficher les résultats.
Rachel
7

Je ne suis pas un expert de l'ICA, mais je peux vous parler un peu de l'indépendance.

Comme certains des commentaires l'ont mentionné, l'indépendance statistique entre deux variables aléatoires peut être grossièrement interprétée comme «la quantité d'informations que l'observation d'une variable donne sur une autre».

XOuiXOuip(X,y)XOuip(X,y)=p(X)p(y)

p(X,y)

XOuiXOuip(X=je,Oui=j)=pjejP(X=je)=pjeP(Oui=j)=pj

je(X,Oui)=jejpjejJournalpjejpjepj

Voici un code matlab qui générera deux signaux indépendants à partir d'une distribution conjointe construite, et deux à partir d'une distribution conjointe non indépendante, puis calculera les informations mutuelles des liaisons.

La fonction "computeMIplugin.m" est une fonction simple que j'ai écrite qui calcule les informations mutuelles en utilisant la formule de sommation ci-dessus.

Ndist = 25;
xx = linspace(-pi, pi, Ndist);

P1 = abs(sin(xx)); P2 = abs(cos(xx)); 
P1 = P1/sum(P1); P2 = P2/sum(P2); % generate marginal distributions

%% Draw independent samples.
Nsamp = 1e4;
X = randsample(xx, Nsamp, 'true', P1);
Y = randsample(xx, Nsamp, 'true', P2);

Pj1 = P1'*P2;
computeMIplugin(Pj1)

% I get approx 8e-15 ... independent!

% Now Sample the joint distribution 
cnt = {}; cnt{1} = xx; cnt{2} = xx; % bin centers
Pj1_samp= hist3([X' Y'],cnt); Pj1_samp = Pj1_samp/sum(Pj1_samp(:));
computeMIplugin(Pj1_samp)
% I get approx .02; since we've estimated the distribution from
% samples, we don't know the true value of the MI. This is where
% a confidence interval would come in handy. We'd like to know 
% whether value of MI is significantly different from 0. 

% mean square difference between true and sampled?
% (this is small for these parameter settings... 
% depends on the sample size and # bins in the distribution).
mean( (Pj1_samp(:) - Pj1(:)).^2)

%% Draw samples that aren't independent. 

tx = linspace(0,30,Nsamp);
X = pi*sin(tx);
Y = pi*cos(tx);

% estimate the joint distribution
cnt = {}; cnt{1} = xx; cnt{2} = xx; % bin centers
Pj2= hist3([X' Y'],cnt); Pj2 = Pj2/sum(Pj2(:));
computeMIplugin(Pj2)

% I get 1.9281  - not independent!

%% make figure
figure(1); 
colormap gray
subplot(221)
imagesc(xx,xx,Pj1_samp)
title('sampled joint distribution 1')
subplot(222)
imagesc(xx,xx,Pj2)
title('sampled joint distribution 2')
subplot(223)
imagesc(xx,xx,Pj1)
title('true joint distribution 1')

Encore une fois, cela suppose que vous avez une bonne estimation de la distribution conjointe (ainsi que d'autres hypothèses), mais cela devrait être utile en règle générale.

oui
la source
C'est une bonne réponse merci sydeulissie, je vais devoir y réfléchir un peu plus profondément.
Spacey
Tout d'abord, merci pour la longue réponse, c'était très instructif. J'ai juste quelques questions. Vous avez mentionné l'utilisation d'un test du chi carré. Je l'ai étudié et j'ai l'air vraiment intéressant, mais comment puis-je l'utiliser sur des signaux? Ne peut-il pas être appliqué uniquement aux données catégorielles?
Rachel
De plus, vous utilisez Pj1 = P1 '* P2 pour calculer la distribution conjointe, n'est-ce pas? Mais, techniquement, je pense que cela ne peut pas être fait. Peut-être que vous le faites parce que vous supposez que les signaux d'origine sont indépendants et que le résultat est donc valable? Mais comment pouvez-vous alors calculer l'information mutuelle - puisque son résultat dépend de la distribution conjointe ..? Il se peut que j'aie mal compris quelque chose, mais j'aimerais une clarification, s'il vous plaît.
Rachel
Je serai heureux de - même si ce sera un peu avant d'avoir le temps :).
oui
Merci @sydeulissie. Je voudrais une réponse qui ne suppose pas que je connaisse la distribution conjointe, s'il vous plaît.
Rachel
3

Comme mentionné ci-dessus, les signaux 3 et 5 semblent être assez corrélés et ont une période similaire.

Nous pouvons penser que deux signaux sont corrélés si nous pouvons décaler l'une des sources vers la gauche ou vers la droite et augmenter ou diminuer son amplitude afin qu'elle s'adapte au-dessus de l'autre source. Notez que nous ne modifions pas la fréquence de la source, nous effectuons simplement un décalage de phase et d'amplitude.

Dans le cas ci-dessus, nous pouvons déplacer la source 3 de sorte que ses pics coïncident avec la source 5. C'est le genre de chose qui gâchera l'extraction de la source lors de l'utilisation de l'ICA en raison de l'hypothèse d'indépendance.

Remarque : Une belle illustration du concept ci-dessus consiste à penser à deux ondes sinusoïdales. Ce sont tous deux complètement déterministes. S'ils ont tous les deux la même fréquence (même avec une phase différente) alors ils sont parfaitement corrélés et l'ICA ne pourra pas les séparer. Si au contraire ils ont des fréquences différentes (qui ne sont pas des multiples entiers les uns des autres), alors ils sont indépendants et peuvent être séparés.

Vous trouverez ci-dessous un code Matlab pour que vous puissiez le voir par vous-même

%Sine waves of equal frequency
X = 1:1000;
Y(1,:) = sin(2*pi*X*10/1000);
Y(2,:) = sin(1+2*pi*X*10/1000);

figure
subplot(3,2,1)
plot(Y(1,:))
title('Initial Source 1')
subplot(3,2,2)
plot(Y(2,:))
title('Initial Source 2')
A = [1, 2; 4, -1];
Y = A*Y;
subplot(3,2,3)
plot(Y(1,:))
title('Signal 1')
subplot(3,2,4)
plot(Y(2,:))
title('Signal 2')

Z = fastica(Y);

subplot(3,2,5)
plot(Z(1,:))
title('Source 1')
subplot(3,2,6)
plot(Z(2,:))
title('Source 2')

%Sine waves of different frequency
X = 1:1000;
Y(1,:) = sin(2*pi*X*10/1000);
Y(2,:) = sin(1+2*pi*X*8/1000);

figure
subplot(3,2,1)
plot(Y(1,:))
title('Initial Source 1')
subplot(3,2,2)
plot(Y(2,:))
title('Initial Source 2')
A = [1, 2; 4, -1];
Y = A*Y;
subplot(3,2,3)
plot(Y(1,:))
title('Signal 1')
subplot(3,2,4)
plot(Y(2,:))
title('Signal 2')

Z = fastica(Y);

subplot(3,2,5)
plot(Z(1,:))
title('Source 1')
subplot(3,2,6)
plot(Z(2,:))
title('Source 2')

Notez que pour les ondes de même fréquence, ICA ne renvoie que les signaux d'entrée, mais pour différentes fréquences, il renvoie les sources d'origine.

rwolst
la source
2

Rachel,

D'après mes recherches, j'ai jusqu'à présent pu trouver quelque chose appelé `` test Chi-Squared pour l'indépendance '', mais je ne sais pas comment cela fonctionne pour le moment, mais cela pourrait valoir le coup d'œil.

Spacey
la source
J'ai trouvé ces deux didacticiels expliquant comment effectuer le test du chi carré: ling.upenn.edu/~clight/chisquared.htm & math.hws.edu/javamath/ryan/ChiSquare.html . Cependant, le test ne peut être effectué que sur des données catégorielles. Je ne sais pas si cela peut être appliqué à nos observations de signaux ..
Rachel