ICA - Độc lập thống kê & giá trị bản địa của ma trận hiệp phương sai


14

Tôi hiện đang tạo các tín hiệu khác nhau bằng Matlab, trộn chúng bằng cách nhân chúng với ma trận trộn A, và sau đó cố gắng lấy lại các tín hiệu gốc bằng FastICA .

Cho đến nay, các tín hiệu phục hồi thực sự tồi tệ khi so sánh với các tín hiệu ban đầu, đó không phải là điều tôi mong đợi.

Tôi đang cố gắng xem liệu tôi có làm gì sai không. Các tín hiệu tôi đang tạo như sau:

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

Tín hiệu gốc

Một điều kiện để ICA thành công là nhiều nhất một tín hiệu là Gaussian và tôi đã quan sát điều này trong quá trình tạo tín hiệu của mình.

Tuy nhiên, một điều kiện khác là tất cả các tín hiệu là độc lập thống kê.

Tất cả những gì tôi biết là điều này có nghĩa là, đưa ra hai tín hiệu A & B, biết một tín hiệu không cung cấp bất kỳ thông tin nào liên quan đến tín hiệu kia, tức là: P (A | B) = P (A) trong đó P là xác suất .

Bây giờ câu hỏi của tôi là: Các tín hiệu của tôi có độc lập thống kê không? Có cách nào tôi có thể xác định điều này? Có lẽ một số tài sản phải được quan sát?

Một điều khác mà tôi nhận thấy là khi tôi tính toán giá trị riêng của ma trận hiệp phương sai (tính cho ma trận chứa các tín hiệu hỗn hợp), eigenspectrum dường như chỉ có một thành phần chính (chính) . Ý nghĩa thực sự của điều này là gì? Không nên có 5, vì tôi có 5 tín hiệu độc lập (được cho là)?

Ví dụ: khi sử dụng ma trận trộn sau:

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

Các giá trị riêng là: 0.0000 0.0005 0.0022 0.0042 0.0345(chỉ 4!)

Khi sử dụng ma trận danh tính làm ma trận trộn (tức là các tín hiệu hỗn hợp giống với ma trận gốc), eigenspectrum là : 0.0103 0.0199 0.0330 0.0811 0.1762. Vẫn còn một giá trị lớn hơn nhiều so với phần còn lại ..

Cảm ơn sự giúp đỡ của bạn.

Tôi xin lỗi nếu câu trả lời cho câu hỏi của tôi rất rõ ràng, nhưng tôi thực sự mới đối với thống kê, ICA và Matlab. Cảm ơn một lần nữa.

BIÊN TẬP

Tôi có 500 mẫu của mỗi tín hiệu, trong phạm vi [0,2, 100], trong các bước 0,2, tức là x = 0: 0,1: 100.

Ngoài ra, với Mô hình ICA: X = As + n (Hiện tại tôi không thêm bất kỳ tiếng ồn nào), tôi đang đề cập đến eigenspectrum của chuyển vị của X, tức là eig (cov (X ')).

CẬP NHẬT

Theo đề xuất (tham khảo ý kiến), tôi đã thử FastICA chỉ với 2 tín hiệu. Kết quả khá tốt (xem pic dưới đây). Ma trận trộn được sử dụng là A = [0.75 0.25; 0.25 0.75]. Tuy nhiên, eigenspectrum 0.1657 0.7732vẫn chỉ hiển thị một thành phần chính.

Do đó, câu hỏi của tôi rút ra những điều sau: Tôi có thể sử dụng hàm / phương trình / thuộc tính nào để kiểm tra xem một số vectơ tín hiệu có độc lập thống kê không?

Sine & Gaussian - FastICA


1
Câu hỏi tuyệt vời. Tôi đã hỏi về cách chúng ta có thể biết khi nào hai tín hiệu độc lập ở đây ( dsp.stackexchange.com/questions/1242/ ( )) nhưng không đi quá xa với điều đó. :-) Tôi cũng mới biết về ICA nhưng tôi có thể làm sáng tỏ một chút.
Spacey

@Mohammad Bạn vẫn quan tâm đến câu trả lời cho câu hỏi đó chứ? Tôi sẵn sàng đặt tiền thưởng vào đó để thu hút sự quan tâm.
Phonon

@Mohammad Tôi nêu lên câu hỏi của bạn. Hy vọng bạn nhận được một câu trả lời tốt, nó thực sự liên quan đến tôi. Tôi đã đọc các bình luận về nó cho đến nay, và có rất nhiều số liệu thống kê về tôi không hiểu. Bạn đã quản lý để đưa ra một cách xác định để kết luận liệu hai tín hiệu có độc lập hay không?
Rachel

@Rachel Hiện tại chưa có, nhưng tôi sẽ nghiên cứu thêm và cho bạn biết. Đó là một khái niệm rất quan trọng, một điều mà tôi cảm thấy thường được dán lên một cách đáng tiếc.
Spacey

Cảm ơn bạn @Mohammad. Tôi đồng ý. Các tín hiệu độc lập quan sát thuộc tính rằng E (s1, s2) = E (s1) x E (s2), nhưng tôi không biết làm thế nào để thực sự tính toán nó cho các tín hiệu thực.
Rachel

Câu trả lời:


8

Tín hiệu 3 và 5 dường như khá tương quan - chúng chia sẻ điều hòa đầu tiên của chúng. Nếu tôi được cho hai hỗn hợp của những hỗn hợp đó, tôi sẽ không thể tách chúng ra, tôi sẽ bị cám dỗ đặt sóng hài chung làm một tín hiệu và sóng hài cao hơn làm tín hiệu thứ hai. Và tôi sẽ sai! Điều này có thể giải thích các giá trị riêng bị thiếu.

Tín hiệu 1 và 2 trông cũng không độc lập.

Một "kiểm tra vệ sinh" nhanh chóng và bẩn thỉu cho tính độc lập của hai chuỗi là thực hiện một âm mưu (x, y) của một tín hiệu đối với tín hiệu kia:

plot (sig3, sig5)

và sau đó thực hiện cùng một âm mưu (x, y) với một tín hiệu được xáo trộn:

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

Nếu hai lô có giao diện không giống nhau, tín hiệu của bạn không độc lập. Tổng quát hơn, nếu biểu đồ (x, y) của dữ liệu hiển thị "tính năng", không đối xứng, v.v., đó là một điềm xấu.

Các thử nghiệm thích hợp cho tính độc lập (và đó là các hàm mục tiêu được sử dụng trong vòng tối ưu hóa ICA), ví dụ, bao gồm thông tin lẫn nhau.

ICA đang phục hồi các tín hiệu độc lập nhất, pha trộn tuyến tính mang lại dữ liệu đầu vào của bạn . Nó sẽ hoạt động như một phương pháp tách tín hiệu và chỉ phục hồi các tín hiệu gốc nếu chúng là độc lập tối đa theo tiêu chí tối ưu hóa được sử dụng trong triển khai ICA của bạn.


1
Câu hỏi: Nếu 5 tín hiệu trong trường hợp của cô ấy thực tế hoàn toàn độc lập, thì chúng ta sẽ mong đợi KHÔNG có thành phần chính nào đúng không? (Nói cách khác, tất cả các giá trị riêng sẽ giống nhau). Về mặt hình học, chúng ta sẽ có một "đám mây" theo 5 chiều, có đồng ý không?
Spacey

Tôi cũng đã liên hệ với một tác giả trên ICA về việc loại bỏ hai sin trong hỗn hợp và anh ta nói rằng thực tế nó có thể được thực hiện với ICA. Điều này làm tôi bối rối một chút dựa trên những gì bạn đang nói liên quan đến tín hiệu 3 và 5 bởi vì (tôi đồng ý với bạn) chúng có vẻ tương quan.
Spacey

@pichenettes Tôi đã vẽ các biểu đồ như bạn đề xuất - và các ô thực sự có một cái nhìn không giống nhau. Thật không may, tôi vẫn còn bế tắc về cách kiểm tra tính độc lập. Tôi thực sự cần một cách để tạo ra các tín hiệu độc lập thống kê, để tôi có thể đánh giá hiệu suất của FastICA.
Rachel

x1[n]x2[n]

@Mohammad Tôi không ghi lại giọng nói của mình nhưng tôi đã thử sử dụng FastICA trên hỗn hợp tín hiệu Sinusodial và Gaussian. Tôi nghĩ rằng họ độc lập .. FastICA hoạt động khá tốt nhưng eigenspectrum vẫn kỳ lạ. Tôi sẽ cập nhật câu hỏi của tôi để hiển thị kết quả.
Rachel

7

Tôi không phải là chuyên gia về ICA, nhưng tôi có thể nói với bạn một chút về sự độc lập.

Như một số ý kiến ​​đã đề cập, tính độc lập thống kê giữa hai biến ngẫu nhiên có thể được hiểu một cách đại khái là "lượng thông tin quan sát một biến mang lại cho một biến khác".

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

Đây là một số mã MATLAB sẽ tạo ra hai tín hiệu độc lập từ phân phối chung được xây dựng và hai từ phân phối chung không độc lập, sau đó tính toán thông tin lẫn nhau của các khớp.

Hàm "computeMIplugin.m" là một hàm đơn giản mà tôi đã viết để tính toán thông tin lẫn nhau bằng cách sử dụng công thức tính tổng ở trên.

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

Một lần nữa, điều này giả định rằng bạn có một ước tính tốt về phân phối chung (cùng với các giả định blithe khác), nhưng nó sẽ hữu ích như một quy tắc của ngón tay cái.


Đó là một câu trả lời tốt sydeulissie cảm ơn, Ill phải nhìn vào nó sâu hơn một chút.
Spacey

Trước hết, cảm ơn bạn đã trả lời dài dòng, nó rất nhiều thông tin. Tôi chỉ có một vài câu hỏi. Bạn đã đề cập bằng cách sử dụng một bài kiểm tra chi bình phương. Tôi đã nhìn vào nó và trông thực sự thú vị, nhưng làm thế nào tôi có thể sử dụng nó trên các tín hiệu? Nó không thể chỉ được áp dụng cho dữ liệu phân loại?
Rachel

Ngoài ra, bạn đang sử dụng Pj1 = P1 '* P2 để tính toán phân phối chung, đúng không? Nhưng, về mặt kỹ thuật, tôi tin rằng điều này không thể được thực hiện. Có lẽ bạn đang làm điều đó vì bạn cho rằng các tín hiệu ban đầu là độc lập và kết quả là như vậy? Nhưng làm thế nào bạn có thể tính toán thông tin lẫn nhau - vì kết quả của nó phụ thuộc vào phân phối chung ..? Có thể là tôi đã hiểu nhầm điều gì đó, nhưng tôi muốn làm rõ.
Rachel

Tôi sẽ rất vui - mặc dù sẽ có một chút trước khi tôi có thời gian :).
vâng

Cảm ơn bạn @sydeulissie. Tôi muốn một câu trả lời mà không cho rằng tôi có kiến ​​thức về phân phối chung, xin vui lòng.
Rachel

3

Như đã đề cập ở trên, cả hai tín hiệu 3 và 5 dường như khá tương quan và có khoảng thời gian tương tự nhau.

Chúng ta có thể nghĩ về hai tín hiệu tương quan nếu chúng ta có thể dịch chuyển một trong các nguồn sang trái hoặc phải và tăng hoặc giảm biên độ của nó để nó phù hợp với đầu nguồn khác. Lưu ý rằng chúng tôi không thay đổi tần số của nguồn, chúng tôi chỉ thực hiện thay đổi pha và biên độ.

Trong trường hợp trên, chúng ta có thể dịch chuyển nguồn 3 sao cho các đỉnh của nó trùng với nguồn 5. Đây là loại điều sẽ gây rối khi trích xuất nguồn khi sử dụng ICA do giả định độc lập.

Lưu ý : Một minh họa đẹp cho khái niệm trên là nghĩ về hai sóng hình sin. Cả hai đều hoàn toàn xác định. Nếu cả hai đều có cùng tần số (ngay cả với các pha khác nhau) thì chúng có mối tương quan hoàn hảo và ICA sẽ không thể tách chúng ra. Nếu thay vào đó, chúng có tần số khác nhau (không phải là bội số nguyên của nhau), thì chúng độc lập và có thể được tách biệt.

Dưới đây là một số mã Matlab để bạn thấy điều này cho chính mình

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

Lưu ý rằng đối với các sóng có cùng tần số, ICA chỉ trả về các tín hiệu đầu vào, nhưng đối với các tần số khác nhau, nó sẽ trả về các nguồn ban đầu.


2

Rachel,

Từ nghiên cứu của tôi, cho đến nay tôi đã có thể tìm thấy một thứ gọi là ' Thử nghiệm bình phương Chi-Độc lập ', nhưng tôi không chắc nó hoạt động như thế nào vào lúc này, nhưng nó có thể đáng xem.


Tôi đã tìm thấy hai hướng dẫn này giải thích cách thực hiện kiểm tra chi bình phương: ling.upenn.edu/~clight/chisquared.htmlm & math.hws.edu/javamath/ryan/ChiSapes.html . Tuy nhiên, thử nghiệm chỉ có thể được thực hiện trên dữ liệu phân loại. Tôi không biết liệu điều này có thể được áp dụng cho các quan sát tín hiệu của chúng tôi không ..
Rachel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.