ICA - Statistische Unabhängigkeit und Eigenwerte der Kovarianzmatrix

14

Ich erstelle derzeit mit Matlab verschiedene Signale, mische sie, indem ich sie mit einer Mischmatrix A multipliziere, und versuche dann, die ursprünglichen Signale mit FastICA wiederzuerlangen .

Bisher sind die wiederhergestellten Signale im Vergleich zu den ursprünglichen Signalen wirklich schlecht, was nicht das war, was ich erwartet hatte.

Ich versuche zu sehen, ob ich etwas falsch mache. Die Signale, die ich generiere, sind die folgenden:

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

Ursprüngliche Signale

Eine Voraussetzung für den Erfolg von ICA ist, dass höchstens ein Signal Gauß ist, und das habe ich bei meiner Signalerzeugung beobachtet.

Eine andere Bedingung ist jedoch, dass alle Signale statistisch unabhängig sind.

Ich weiß nur, dass dies bedeutet, dass bei zwei Signalen A & B das Wissen um ein Signal keine Informationen bezüglich des anderen gibt, dh: P (A | B) = P (A) wobei P die Wahrscheinlichkeit ist .

Meine Frage ist nun: Sind meine Signale statistisch unabhängig? Kann ich das irgendwie feststellen? Vielleicht eine Eigenschaft, die beachtet werden muss?

Eine andere Sache, die mir aufgefallen ist, ist, dass wenn ich die Eigenwerte der Kovarianzmatrix (berechnet für die Matrix mit den gemischten Signalen) berechne, das Eigenspektrum zu zeigen scheint, dass es nur eine (Haupt-) Hauptkomponente gibt . Was heißt das eigentlich? Sollte es nicht 5 geben, da ich 5 (angeblich) unabhängige Signale habe?

Zum Beispiel bei Verwendung der folgenden Mischmatrix:

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

Die Eigenwerte sind: 0.0000 0.0005 0.0022 0.0042 0.0345(nur 4!)

Wenn die Einheitsmatrix als Mischmatrix (dh die gemischten Signale die gleiche wie die Originale sind), ist das Eigenspektrum: 0.0103 0.0199 0.0330 0.0811 0.1762. Es gibt immer noch einen Wert, der viel größer ist als der Rest.

Danke für deine Hilfe.

Ich entschuldige mich, wenn die Antworten auf meine Fragen schmerzlich offensichtlich sind, aber ich bin wirklich neu in Statistik, ICA und Matlab. Danke noch einmal.

BEARBEITEN

Ich habe 500 Abtastwerte von jedem Signal im Bereich [0,2, 100] in Schritten von 0,2, dh x = 0: 0,1: 100.

Unter Berücksichtigung des ICA-Modells: X = As + n (ich füge im Moment kein Rauschen hinzu) beziehe ich mich auch auf das Eigenspektrum der Transponierten von X, dh eig (cov (X ')).

AKTUALISIEREN

Wie vorgeschlagen (siehe Kommentare), habe ich FastICA auf nur 2 Signalen ausprobiert . Die Ergebnisse waren recht gut (siehe Bild unten). Die verwendete Mischmatrix war A = [0.75 0.25; 0.25 0.75]. Das Eigenspektrum 0.1657 0.7732zeigte jedoch nur eine Hauptkomponente.

Meine Frage beschränkt sich daher auf Folgendes: Mit welcher Funktion / Gleichung / Eigenschaft kann ich prüfen, ob eine Reihe von Signalvektoren statistisch unabhängig sind?

Sinus & Gauß - FastICA

Rachel
quelle
1
Hervorragende Frage. Ich habe gefragt, wie wir wissen können, wann zwei Signale hier unabhängig sind ( dsp.stackexchange.com/questions/1242/… ), bin aber nicht zu weit gekommen. :-) Ich bin auch neu bei ICA, aber vielleicht kann ich etwas Licht ins Dunkel bringen.
Spacey
@Mohammad Bist du immer noch an einer Antwort auf diese Frage interessiert? Ich werde gerne ein Kopfgeld darauf setzen, um Interesse zu wecken.
Phonon
@ Mohammad Ich habe deine Frage positiv bewertet. Ich hoffe, du bekommst eine gute Antwort, sie hängt wirklich mit meiner zusammen. Ich habe die Kommentare dazu bis jetzt gelesen und es gibt eine Menge Statistiken, die ich nicht verstehe. Haben Sie es geschafft, einen eindeutigen Weg zu finden, um festzustellen, ob zwei Signale unabhängig sind oder nicht?
Rachel
@ Rachel Im Moment noch nicht, aber ich werde es noch etwas genauer untersuchen und dich wissen lassen. Es ist ein sehr wichtiges Konzept, von dem ich der Meinung bin, dass es in der Regel leider glasiert ist.
Spacey
Vielen Dank, dass Sie @Mohammad. Genau. Unabhängige Signale beobachten die Eigenschaft, dass E (s1, s2) = E (s1) x E (s2), aber ich weiß nicht, wie ich es tatsächlich für reale Signale berechnen soll.
Rachel

Antworten:

8

Die Signale 3 und 5 scheinen ziemlich korreliert zu sein - sie teilen ihre erste Harmonische. Wenn ich zwei Mischungen von diesen erhalten hätte, wäre ich nicht in der Lage, diese zu trennen. Ich wäre versucht, die gemeinsame Harmonische als ein Signal und die höheren Harmonischen als ein zweites Signal zu setzen. Und ich würde mich irren! Dies könnte den fehlenden Eigenwert erklären.

Die Signale 1 und 2 sehen auch nicht unabhängig aus.

Ein schneller und unsauberer "Sanity-Check" für die Unabhängigkeit zweier Serien besteht darin, ein (x, y) Diagramm eines Signals gegen das andere zu erstellen:

plot (sig3, sig5)

und dann das gleiche (x, y) Diagramm mit einem Signal zu machen, das gemischt wird:

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

Wenn die beiden Darstellungen unterschiedlich aussehen, sind Ihre Signale nicht unabhängig. Im Allgemeinen ist es ein schlechtes Omen, wenn die (x, y) -Darstellung der Daten "Merkmale", Disymmetrien usw. zeigt.

Geeignete Tests für die Unabhängigkeit (und dies sind die Zielfunktionen, die in der ICA-Optimierungsschleife verwendet werden) umfassen beispielsweise gegenseitige Informationen.

ICA stellt die unabhängigsten Signale wieder her, deren lineares Mischen Ihre Eingabedaten ergibt . Es funktioniert als Signaltrennungsmethode und stellt die ursprünglichen Signale nur dann wieder her, wenn diese gemäß dem in Ihrer ICA-Implementierung verwendeten Optimierungskriterium maximal unabhängig waren.

Pichenetten
quelle
1
Frage: Wenn die 5 Signale in ihrem Fall tatsächlich alle unabhängig wären, würden wir erwarten, dass KEINE Hauptkomponenten korrekt sind? (Mit anderen Worten, alle Eigenwerte wären gleich). Geometrisch hätten wir eine Guassianische 'Wolke' in 5 Dimensionen, stimme zu?
Spacey
Ich hatte auch einen ICA-Autor wegen der Entfernung von zwei Sinuskurven aus einer Mischung kontaktiert, und er sagte, dass dies tatsächlich mit ICA möglich sei. Dies verwirrt mich ein wenig, wenn man bedenkt, was Sie zu den Signalen 3 und 5 sagen, weil sie (da stimme ich Ihnen zu) korreliert aussehen.
Spacey
@pichenettes Ich habe diese Diagramme wie von Ihnen vorgeschlagen gezeichnet - und die Diagramme sehen tatsächlich anders aus. Leider stecke ich immer noch fest, wie ich die Unabhängigkeit testen soll. Ich brauche wirklich eine Möglichkeit, Signale zu generieren, die statistisch unabhängig sind, damit ich die Leistung von FastICA bewerten kann.
Rachel
x1[n]x2[n]
@Mohammad Ich habe meine eigene Stimme nicht aufgenommen, aber ich habe versucht, FastICA für eine Mischung aus Sinus- und Gauß-Signalen zu verwenden. Ich würde denken, dass sie unabhängig sind. FastICA schnitt ziemlich gut ab, aber das Eigenspektrum war immer noch seltsam. Ich werde meine Frage aktualisieren, um die Ergebnisse anzuzeigen.
Rachel
7

Ich bin kein Experte für ICA, aber ich kann Ihnen ein bisschen über Unabhängigkeit erzählen.

Wie in einigen Kommentaren erwähnt, kann die statistische Unabhängigkeit zwischen zwei Zufallsvariablen grob als "die Informationsmenge interpretiert werden, die die Beobachtung einer Variablen über eine andere ergibt".

XYXYp(x,y)XYp(x,y)=p(x)p(y)

p(x,y)

XYXYp(X=i,Y=j)=pijP(X=i)=piP(Y=j)=pj

I(X,Y)=ijpijlogpijpipj

Hier ist ein Matlab-Code, der zwei unabhängige Signale aus einer konstruierten Gelenkverteilung und zwei aus einer nicht unabhängigen Gelenkverteilung generiert und dann die gegenseitigen Informationen der Gelenke berechnet.

Die Funktion "computeMIplugin.m" ist eine einfache Funktion, die ich geschrieben habe und die die gegenseitigen Informationen unter Verwendung der obigen Summenformel berechnet.

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')

Dies setzt wiederum voraus, dass Sie eine gute Schätzung der Gelenkverteilung haben (zusammen mit anderen guten Annahmen), aber dies sollte als Faustregel nützlich sein.

ja
quelle
Das ist eine gute Antwort sydeulissie danke, ich muss es ein wenig tiefer untersuchen.
Spacey
Zunächst einmal vielen Dank für die lange Antwort, es war sehr informativ. Ich habe nur ein paar Fragen. Sie erwähnten die Verwendung eines Chi-Quadrat-Tests. Ich habe es mir angeschaut und es sieht wirklich interessant aus, aber wie kann ich es für Signale verwenden? Kann es nicht nur auf kategoriale Daten angewendet werden?
Rachel
Außerdem verwenden Sie Pj1 = P1 '* P2, um die Gelenkverteilung zu berechnen, richtig? Aber technisch gesehen glaube ich, dass dies nicht möglich ist. Vielleicht tun Sie das, weil Sie davon ausgehen, dass die ursprünglichen Signale unabhängig sind und das Ergebnis somit zutrifft? Aber wie kann man dann die gegenseitige Information berechnen - da das Ergebnis von der gemeinsamen Verteilung abhängt? Es kann sein, dass ich etwas falsch verstanden habe, aber ich hätte gerne eine Klarstellung, bitte.
Rachel
Ich werde es gerne tun - obwohl es ein bisschen dauern wird, bis ich die Zeit dafür habe :).
ja
Danke @sydeulissie. Ich hätte gerne eine Antwort, die nicht davon ausgeht, dass ich Kenntnisse über die gemeinsame Verteilung habe.
Rachel
3

Wie oben erwähnt, scheinen beide Signale 3 und 5 ziemlich korreliert zu sein und eine ähnliche Periode aufzuweisen.

Wir können uns vorstellen, dass zwei Signale korreliert sind, wenn wir eine der Quellen nach links oder rechts verschieben und ihre Amplitude erhöhen oder verringern können, sodass sie auf die andere Quelle passt. Beachten Sie, dass wir die Frequenz der Quelle nicht ändern, sondern lediglich eine Phasen- und Amplitudenverschiebung durchführen.

Im obigen Fall können wir die Quelle 3 so verschieben, dass ihre Spitzen mit der Quelle 5 übereinstimmen. Dies ist die Art von Dingen, die die Quellenextraktion bei Verwendung von ICA aufgrund der Unabhängigkeitsannahme durcheinander bringen.

Hinweis : Eine schöne Illustration des obigen Konzepts ist die Betrachtung von zwei Sinuswellen. Diese sind beide vollständig deterministisch. Wenn beide dieselbe Frequenz haben (auch mit unterschiedlicher Phase), sind sie perfekt korreliert und ICA kann sie nicht trennen. Wenn sie stattdessen unterschiedliche Frequenzen haben (die keine ganzzahligen Vielfachen voneinander sind), sind sie unabhängig und können getrennt werden.

Nachfolgend finden Sie einen Matlab-Code, mit dem Sie sich selbst davon überzeugen können

%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')

Beachten Sie, dass ICA für Wellen derselben Frequenz nur die Eingangssignale zurückgibt, für verschiedene Frequenzen jedoch die ursprünglichen Quellen.

rwolst
quelle
2

Rachel,

Aufgrund meiner Recherchen konnte ich bisher etwas namens " Chi-Quadrat-Test für Unabhängigkeit " finden, aber ich bin nicht sicher, wie es im Moment funktioniert, aber es könnte einen Blick wert sein.

Spacey
quelle
Ich habe diese beiden Tutorials gefunden, die erklären, wie der Chi-Quadrat-Test durchgeführt wird: ling.upenn.edu/~clight/chisquared.htm & math.hws.edu/javamath/ryan/ChiSquare.html . Der Test kann jedoch nur für kategoriale Daten durchgeführt werden. Ich weiß nicht, ob dies auf unsere Signalbeobachtungen angewendet werden kann.
Rachel