ICA - Kemandirian Statistik & Nilai Eigen dari Covariance Matrix

14

Saat ini saya membuat sinyal yang berbeda menggunakan Matlab, mencampurnya dengan mengalikannya dengan matriks pencampuran A, dan kemudian mencoba untuk mendapatkan kembali sinyal asli menggunakan FastICA .

Sejauh ini, sinyal yang dipulihkan benar-benar buruk jika dibandingkan dengan yang asli, yang tidak seperti yang saya harapkan.

Saya mencoba melihat apakah saya melakukan kesalahan. Sinyal yang saya hasilkan adalah sebagai berikut:

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

Sinyal Asli

Satu syarat untuk ICA untuk menjadi sukses adalah bahwa paling banyak satu sinyal adalah Gaussian, dan saya telah mengamati ini dalam generasi sinyal saya.

Namun, kondisi lain adalah bahwa semua sinyal secara statistik independen.

Yang saya tahu adalah bahwa ini berarti bahwa, mengingat dua sinyal A & B, mengetahui satu sinyal tidak memberikan informasi berkaitan dengan yang lain, yaitu: P (A | B) = P (A) di mana P adalah probabilitas .

Sekarang pertanyaan saya adalah ini: Apakah sinyal saya secara statistik independen? Apakah ada cara saya dapat menentukan ini? Mungkin beberapa properti yang harus diperhatikan?

Hal lain yang saya perhatikan adalah ketika saya menghitung nilai eigen dari matriks kovarians (dihitung untuk matriks yang berisi sinyal campuran), eigenspectrum tampaknya menunjukkan bahwa hanya ada satu komponen utama (utama) . Apa maksudnya ini? Bukankah seharusnya ada 5, karena saya memiliki 5 (seharusnya) sinyal independen?

Misalnya, saat menggunakan matriks pencampuran berikut:

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

Nilai eigen adalah: 0.0000 0.0005 0.0022 0.0042 0.0345(hanya 4!)

Bila menggunakan matriks identitas sebagai matriks pencampuran (yaitu sinyal campuran adalah sama dengan yang asli), eigenspectrum adalah: 0.0103 0.0199 0.0330 0.0811 0.1762. Masih ada satu nilai yang jauh lebih besar daripada yang lain ..

Terima kasih untuk bantuannya.

Saya minta maaf jika jawaban atas pertanyaan saya sangat jelas, tetapi saya benar-benar baru dalam statistik, ICA dan Matlab. Terima kasih lagi.

EDIT

Saya memiliki 500 sampel setiap sinyal, dalam kisaran [0,2, 100], dalam langkah-langkah 0,2, yaitu x = 0: 0,1: 100.

Juga, mengingat Model ICA: X = As + n (saya tidak menambahkan suara saat ini), saya mengacu pada eigenspectrum dari transpos X, yaitu eig (cov (X ')).

MEMPERBARUI

Seperti yang disarankan (lihat komentar), saya mencoba FastICA hanya pada 2 sinyal. Hasilnya cukup bagus (lihat gambar di bawah). Matriks pencampuran yang digunakan adalah A = [0.75 0.25; 0.25 0.75]. Namun, eigenspectrum 0.1657 0.7732masih menunjukkan hanya satu komponen utama.

Oleh karena itu pertanyaan saya intinya adalah sebagai berikut: Apa fungsi / persamaan / properti yang dapat saya gunakan untuk memeriksa apakah sejumlah vektor sinyal secara statistik independen?

Sine & Gaussian - FastICA

Rachel
sumber
1
Pertanyaan yang sangat bagus Saya telah bertanya tentang bagaimana kita bisa tahu kapan dua sinyal independen di sini ( dsp.stackexchange.com/questions/1242/… ) tetapi tidak terlalu jauh dengan itu. :-) Saya juga baru di ICA tapi saya mungkin bisa menjelaskan.
Spacey
@Mohammad Apakah Anda masih tertarik untuk menanggapi pertanyaan itu? Saya akan dengan senang hati memberikan hadiah untuk menarik minat.
Phonon
@Mohammad, aku mengangkat pertanyaanmu. Semoga Anda mendapatkan jawaban yang bagus, itu benar-benar terkait dengan saya. Saya sudah membaca komentar tentang itu sejauh ini, dan ada banyak statistik yang saya tidak mengerti. Sudahkah Anda berhasil menemukan cara yang pasti untuk menyimpulkan apakah dua sinyal independen atau tidak?
Rachel
@Rachel Belum saat ini, tapi saya akan meneliti lagi dan memberi tahu Anda. Ini adalah konsep yang sangat penting, yang saya rasa biasanya terlalu sayu.
Spacey
@Mohammad terima kasih. Saya setuju. Sinyal independen mengamati properti yang E (s1, s2) = E (s1) x E (s2), tetapi saya tidak tahu bagaimana cara menghitungnya untuk sinyal nyata.
Rachel

Jawaban:

8

Sinyal 3 dan 5 tampaknya sangat berkorelasi - mereka berbagi harmonik pertama mereka. Jika saya diberi dua campuran itu, saya tidak akan bisa memisahkan mereka, saya akan tergoda untuk menempatkan harmonik umum sebagai satu sinyal dan harmonik yang lebih tinggi sebagai sinyal kedua. Dan saya akan salah! Ini mungkin menjelaskan nilai eigen yang hilang.

Sinyal 1 dan 2 juga tidak terlihat independen.

"Pemeriksaan kesehatan" yang cepat dan kotor untuk independensi dua seri adalah dengan melakukan plot (x, y) dari satu sinyal terhadap yang lain:

plot (sig3, sig5)

dan kemudian melakukan plot (x, y) yang sama dengan satu sinyal yang dikocok:

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

Jika kedua plot memiliki tampilan yang berbeda, sinyal Anda tidak independen. Lebih umum, jika plot (x, y) dari data menunjukkan "fitur", disimetri dll, itu pertanda buruk.

Tes yang tepat untuk independensi (dan itu adalah fungsi objektif yang digunakan dalam loop pengoptimalan ICA) termasuk, misalnya, informasi timbal balik.

ICA memulihkan sinyal yang paling independen dengan pencampuran linier yang menghasilkan data input Anda . Ini akan berfungsi sebagai metode pemisahan sinyal dan memulihkan sinyal asli hanya jika mereka independen maksimal sesuai dengan kriteria optimasi yang digunakan dalam implementasi ICA Anda.

pichenettes
sumber
1
Pertanyaan: Jika 5 sinyal dalam kasusnya semuanya independen, maka kita harapkan TIDAK ada komponen utama yang benar? (Dengan kata lain, semua nilai eigen akan menjadi sama). Secara geometris, kita akan memiliki 'cloud' guassian dalam 5 dimensi, setuju?
Spacey
Saya juga telah menghubungi seorang penulis di ICA tentang penghapusan dua sinusoid dari campuran, dan dia mengatakan bahwa sebenarnya bisa dilakukan dengan ICA. Ini sedikit membingungkan saya berdasarkan apa yang Anda katakan mengenai sinyal 3 dan 5 karena (saya setuju dengan Anda) mereka terlihat berkorelasi.
Spacey
@pichenettes Saya membuat grafik seperti yang Anda sarankan - dan plot memang memiliki tampilan yang berbeda. Sayangnya saya masih buntu bagaimana ujian untuk kemerdekaan. Saya benar-benar membutuhkan cara untuk menghasilkan sinyal yang secara statistik independen, sehingga saya dapat mengevaluasi kinerja FastICA.
Rachel
x1[n]x2[n]
@Mohammad Saya tidak merekam suara saya sendiri tetapi saya mencoba menggunakan FastICA pada campuran sinyal Sinusodial dan Gaussian. Saya pikir mereka independen .. FastICA tampil cukup baik tetapi eigenspectrum masih aneh. Saya akan memperbarui pertanyaan saya untuk menunjukkan hasilnya.
Rachel
7

Saya bukan ahli ICA, tapi saya bisa memberi tahu Anda sedikit tentang kemerdekaan.

Seperti yang disebutkan oleh beberapa komentar, independensi statistik antara dua variabel acak dapat secara kasar diartikan sebagai "jumlah informasi yang diamati oleh satu variabel tentang variabel lain".

XYXYhal(x,y)XYhal(x,y)=hal(x)hal(y)

hal(x,y)

XYXYhal(X=saya,Y=j)=halsayajP(X=saya)=halsayaP(Y=j)=halj

saya(X,Y)=sayajhalsayajcatatanhalsayajhalsayahalj

Berikut adalah beberapa kode matlab yang akan menghasilkan dua sinyal independen dari distribusi bersama yang dibangun, dan dua dari distribusi bersama non-independen, dan kemudian menghitung informasi timbal balik dari sambungan tersebut.

Fungsi "computeMIplugin.m" adalah fungsi sederhana yang saya tulis yang menghitung informasi timbal balik menggunakan rumus penjumlahan di atas.

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

Sekali lagi, ini mengasumsikan Anda memiliki perkiraan yang baik dari distribusi bersama (bersama dengan asumsi blithe lainnya), tetapi harus berguna sebagai patokan.

ya
sumber
Itu jawaban yang bagus terima kasih sydeulissie, aku harus memeriksanya sedikit lebih dalam.
Spacey
Pertama-tama, terima kasih atas jawaban yang panjang, itu sangat informatif. Saya hanya punya beberapa pertanyaan. Anda menyebutkan menggunakan tes chi-squared. Saya sudah melihatnya dan terlihat sangat menarik, tetapi bagaimana saya bisa menggunakannya pada sinyal? Tidak bisakah itu hanya diterapkan pada data kategorikal?
Rachel
Juga, Anda menggunakan Pj1 = P1 '* P2 untuk menghitung distribusi bersama, benar? Tapi, secara teknis, saya percaya ini tidak bisa dilakukan. Mungkin Anda melakukannya karena Anda berasumsi bahwa sinyal asli independen, dan hasilnya bertahan? Tapi bagaimana Anda bisa menghitung informasi timbal balik - karena hasilnya tergantung pada distribusi bersama ..? Mungkin saya salah paham tentang sesuatu, tetapi saya ingin klarifikasi.
Rachel
Saya akan dengan senang hati - meskipun akan sedikit sebelum saya mendapatkan waktu :).
ya
@Sydeulissie terima kasih. Saya ingin jawaban yang tidak berasumsi bahwa saya memiliki pengetahuan tentang distribusi bersama.
Rachel
3

Seperti disebutkan di atas, kedua sinyal 3 dan 5 tampaknya sangat berkorelasi dan memiliki periode yang sama.

Kita dapat memikirkan dua sinyal yang dikorelasikan jika kita dapat menggeser salah satu sumber ke kiri atau ke kanan dan menambah atau mengurangi amplitudo sehingga pas di atas sumber lainnya. Catatan kami tidak mengubah frekuensi sumber, kami hanya melakukan pergeseran fase dan amplitudo.

Dalam kasus di atas, kita dapat menggeser sumber 3 sehingga puncaknya bertepatan dengan sumber 5. Ini adalah hal yang akan mengacaukan ekstraksi sumber ketika menggunakan ICA karena asumsi independensi.

Catatan : Ilustrasi yang bagus dari konsep di atas adalah memikirkan dua gelombang sinusoidal. Keduanya sama-sama deterministik. Jika mereka berdua memiliki frekuensi yang sama (bahkan dengan fase yang berbeda) maka mereka berkorelasi sempurna dan ICA tidak akan dapat memisahkan mereka. Jika sebaliknya mereka memiliki frekuensi yang berbeda (yang bukan bilangan bulat dari satu sama lain), maka mereka independen dan dapat dipisahkan.

Di bawah ini adalah beberapa kode Matlab untuk Anda lihat sendiri

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

Perhatikan bahwa untuk gelombang dengan frekuensi yang sama, ICA hanya mengembalikan sinyal input, tetapi untuk frekuensi yang berbeda ia mengembalikan sumber aslinya.

rwolst
sumber
2

Rachel,

Dari penelitian saya sejauh ini saya dapat menemukan sesuatu yang disebut ' Tes Chi-Squared Untuk Kemandirian ', tetapi saya tidak yakin bagaimana cara kerjanya saat ini, tetapi mungkin layak untuk dilihat.

Spacey
sumber
Saya telah menemukan dua tutorial ini menjelaskan bagaimana untuk melakukan uji chi-squared: ling.upenn.edu/~clight/chisquared.htm & math.hws.edu/javamath/ryan/ChiSquare.html . Namun, tes hanya dapat dilakukan pada data kategorikal. Saya tidak tahu apakah ini dapat diterapkan pada pengamatan sinyal kami ..
Rachel