ICA - Indipendenza statistica e autovalori della matrice di covarianza


14

Attualmente sto creando segnali diversi usando Matlab, mescolandoli moltiplicandoli per una matrice di missaggio A, e quindi cercando di recuperare i segnali originali usando FastICA .

Finora, i segnali recuperati sono davvero cattivi rispetto a quelli originali, che non era quello che mi aspettavo.

Sto cercando di vedere se sto facendo qualcosa di sbagliato. I segnali che sto generando sono i seguenti:

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

Segnali originali

Una condizione affinché l'ICA abbia successo è che al massimo un segnale è gaussiano e l'ho osservato nella mia generazione del segnale.

Tuttavia, un'altra condizione è che tutti i segnali siano statisticamente indipendenti.

Tutto quello che so è che ciò significa che, dati due segnali A e B, conoscere un segnale non fornisce alcuna informazione rispetto all'altro, ovvero: P (A | B) = P (A) dove P è la probabilità .

Ora la mia domanda è questa: i miei segnali sono statisticamente indipendenti? C'è un modo per determinarlo? Forse qualche proprietà che deve essere osservata?

Un'altra cosa che ho notato è che quando calcolo gli autovalori della matrice di covarianza (calcolata per la matrice contenente i segnali misti), l'eigenspectrum sembra mostrare che esiste un solo componente principale (principale) . Cosa significa veramente? Non dovrebbero esserci 5, dato che ho 5 (presumibilmente) segnali indipendenti?

Ad esempio, quando si utilizza la seguente matrice di miscelazione:

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

Gli autovalori sono: 0.0000 0.0005 0.0022 0.0042 0.0345(solo 4!)

Quando si utilizza la matrice identità come matrice di miscelazione (cioè i segnali misti sono uguali a quelli originali), il eigenspectrum è: 0.0103 0.0199 0.0330 0.0811 0.1762. C'è ancora un valore molto più grande del resto ..

Grazie per l'aiuto.

Mi scuso se le risposte alle mie domande sono dolorosamente ovvie, ma sono davvero nuovo alle statistiche, ICA e Matlab. Grazie ancora.

MODIFICARE

Ho 500 campioni di ciascun segnale, nell'intervallo [0,2, 100], con incrementi di 0,2, ovvero x = 0: 0,1: 100.

Inoltre, dato il modello ICA: X = As + n (al momento non sto aggiungendo alcun rumore), mi riferisco all'eigenspectrum del trasposizione di X, cioè eig (cov (X ')).

AGGIORNARE

Come suggerito (fare riferimento ai commenti), ho provato FastICA su solo 2 segnali. I risultati sono stati abbastanza buoni (vedi foto sotto). La matrice di miscelazione utilizzata era A = [0.75 0.25; 0.25 0.75]. Tuttavia, l'eigenspectrum 0.1657 0.7732mostrava ancora solo un componente principale principale.

La mia domanda si riduce quindi a quanto segue: Quale funzione / equazione / proprietà posso usare per verificare se un numero di vettori di segnale sono statisticamente indipendenti?

Seno & gaussiano - FastICA


1
Ottima domanda Ho chiesto come possiamo sapere quando due segnali sono indipendenti qui ( dsp.stackexchange.com/questions/1242/… ) ma non sono andato troppo lontano. :-) Sono anche nuovo all'ICA ma potrei essere in grado di far luce.
Spacey,

@Mohammad Sei ancora interessato a una risposta a questa domanda? Ci metterò volentieri una taglia per attirare l'interesse.
Phonon,

@Mohammad Ho valutato la tua domanda. Spero che tu abbia una buona risposta, è davvero legata alla mia. Finora ho letto i commenti e ci sono molte statistiche che non capisco. Sei riuscito a trovare un modo preciso per concludere se due segnali sono indipendenti o no?
Rachel,

@ Rachel Non ancora al momento, ma lo cercherò ancora e ti farò sapere. È un concetto molto importante, che a mio avviso sfortunatamente di solito viene smaltato.
Spacey,

Grazie @Mohammad. Sono d'accordo. I segnali indipendenti osservano la proprietà che E (s1, s2) = E (s1) x E (s2), ma non so come calcolarlo effettivamente per segnali reali.
Rachel,

Risposte:


8

I segnali 3 e 5 sembrano essere abbastanza correlati: condividono la loro prima armonica. Se mi venissero date due miscele di quelle, non sarei in grado di separarle, sarei tentato di mettere l'armonica comune come un segnale e le armoniche superiori come un secondo segnale. E mi sbaglierei! Questo potrebbe spiegare l'autovalore mancante.

Anche i segnali 1 e 2 non sembrano indipendenti.

Un "controllo di integrità" rapido e sporco per l'indipendenza di due serie è quello di fare un diagramma (x, y) di un segnale rispetto all'altro:

plot (sig3, sig5)

e poi fare lo stesso diagramma (x, y) con un segnale mischiato:

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

Se i due grafici hanno un aspetto diverso, i tuoi segnali non sono indipendenti. Più in generale, se il grafico (x, y) dei dati mostra "caratteristiche", simmetrie ecc., È di cattivo auspicio.

Test adeguati per l'indipendenza (e queste sono le funzioni oggettive utilizzate nel ciclo di ottimizzazione dell'ICA) includono, ad esempio, informazioni reciproche.

L'ICA sta recuperando i segnali più indipendenti una miscelazione lineare di cui produce i dati di input . Funzionerà come metodo di separazione dei segnali e recupererà i segnali originali solo se quelli fossero al massimo indipendenti secondo il criterio di ottimizzazione utilizzato nella tua implementazione ICA.


1
Domanda: Se i 5 segnali nel suo caso fossero effettivamente tutti indipendenti, ci aspetteremmo che NON ci siano componenti principali corretti? (In altre parole, tutti gli autovalori sarebbero più o meno gli stessi). Geometricamente, avremmo una 'nuvola' guassiana in 5 dimensioni, d'accordo?
Spacey,

Avevo anche contattato un autore su ICA per la rimozione di due sinusoidi da una miscela, e mi disse che in realtà poteva essere fatto con ICA. Questo mi confonde un po 'in base a quello che stai dicendo riguardo ai segnali 3 e 5 perché (sono d'accordo con te) sembrano correlati.
Spacey,

@pichenettes Ho tracciato quei grafici come mi hai suggerito - e le trame hanno davvero un aspetto diverso. Purtroppo sono ancora bloccato su come test per l'indipendenza. Ho davvero bisogno di un modo per generare segnali statisticamente indipendenti, in modo da poter valutare le prestazioni di FastICA.
Rachel,

X1[n]X2[n]

@Mohammad Non ho registrato la mia voce, ma ho provato a usare FastICA su una combinazione di segnali sinusodiali e gaussiani. PENSO che siano indipendenti .. FastICA si è comportato abbastanza bene, ma l'eigenspectrum era ancora strano. Aggiornerò la mia domanda per mostrare i risultati.
Rachel,

7

Non sono un esperto di ICA, ma posso dirti un po 'di indipendenza.

Come alcuni dei commenti hanno citato, l'indipendenza statistica tra due variabili casuali può essere approssimativamente interpretata come "la quantità di informazioni che l'osservazione di una variabile fornisce su un'altra".

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

p(X,y)

XYXYp(X=io,Y=j)=piojP(X=io)=pioP(Y=j)=pj

io(X,Y)=ΣioΣjpiojlogpiojpiopj

Ecco un codice matlab che genererà due segnali indipendenti da una distribuzione articolata costruita e due da una distribuzione articolare non indipendente, quindi calcolerà le informazioni reciproche delle articolazioni.

La funzione "computeMIplugin.m" è una semplice funzione che ho scritto che calcola le informazioni reciproche utilizzando la formula di sommatoria sopra.

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

Ancora una volta, questo presuppone che tu abbia una buona stima della distribuzione congiunta (insieme ad altre ipotesi blithe), ma dovrebbe essere utile come regola empirica.


Questa è una buona risposta, grazie Sydeulissie, devo approfondire un po 'più a fondo.
Spacey

Prima di tutto, grazie per la lunga risposta, è stato molto istruttivo. Ho solo un paio di domande. Hai menzionato usando un test chi-quadrato. Ci ho guardato e sembra davvero interessante, ma come posso usarlo sui segnali? Non può essere applicato solo ai dati categorici?
Rachel

Inoltre, stai usando Pj1 = P1 '* P2 per calcolare la distribuzione del giunto, giusto? Ma, tecnicamente, credo che questo non possa essere fatto. Forse lo stai facendo perché stai assumendo che i segnali originali siano indipendenti, e il risultato vale quindi? Ma come si possono quindi calcolare le informazioni reciproche, poiché il loro risultato dipende dalla distribuzione congiunta ..? Forse ho capito male qualcosa, ma vorrei un chiarimento, per favore.
Rachel

Sarò felice - anche se passerà un po 'prima di avere il tempo :).
Sì, l'

Grazie @sydeulissie. Vorrei una risposta che non presupponga di essere a conoscenza della distribuzione congiunta, per favore.
Rachel

3

Come accennato in precedenza, entrambi i segnali 3 e 5 sembrano essere abbastanza correlati e hanno un periodo simile.

Possiamo pensare a due segnali correlati se possiamo spostare una delle sorgenti a sinistra o a destra e aumentare o diminuire la sua ampiezza in modo che si adatti all'altra sorgente. Nota che non stiamo cambiando la frequenza della sorgente, stiamo solo eseguendo uno spostamento di fase e ampiezza.

Nel caso sopra, possiamo spostare la fonte 3 in modo che i suoi picchi coincidano con la fonte 5. Questo è il genere di cose che rovinerà l'estrazione della fonte quando si usa ICA a causa del presupposto di indipendenza.

Nota : una bella illustrazione del concetto di cui sopra è pensare a due onde sinusoidali. Questi sono entrambi completamente deterministici. Se entrambi hanno la stessa frequenza (anche con fasi diverse), sono perfettamente correlati e ICA non sarà in grado di separarli. Se invece hanno frequenze diverse (che non sono multipli interi l'uno dell'altro), allora sono indipendenti e possono essere separate.

Di seguito è riportato un codice Matlab per consentirti di vederlo da solo

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

Si noti che per le onde della stessa frequenza, ICA restituisce solo i segnali di ingresso, ma per frequenze diverse restituisce le sorgenti originali.


2

Rachele,

Dalla mia ricerca sono stato finora in grado di trovare qualcosa chiamato " Test Chi-quadrato per l'indipendenza ", ma non sono sicuro di come funzioni al momento, ma potrebbe valere la pena dare un'occhiata.


Ho trovato questi due tutorial che spiegano come eseguire il test chi-quadrato: ling.upenn.edu/~clight/chisquared.htm & math.hws.edu/javamath/ryan/ChiSquare.html . Tuttavia, il test può essere eseguito solo su dati categorici. Non so se questo possa essere applicato alle nostre osservazioni di segnale.
Rachel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.