ICA - ความเป็นอิสระทางสถิติและค่าลักษณะเฉพาะของเมทริกซ์ความแปรปรวนร่วม


14

ฉันกำลังสร้างสัญญาณที่แตกต่างกันโดยใช้ Matlab ผสมพวกเขาโดยการคูณพวกเขาโดยการผสมเมทริกซ์ A และจากนั้นพยายามที่จะได้รับกลับมาสัญญาณเดิมใช้FastICA

จนถึงตอนนี้สัญญาณที่กู้คืนมานั้นแย่มากเมื่อเทียบกับสัญญาณดั้งเดิมซึ่งไม่ใช่สิ่งที่ฉันคาดไว้

ฉันพยายามดูว่าฉันทำอะไรผิดหรือเปล่า สัญญาณที่ฉันกำลังสร้างมีดังต่อไปนี้:

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

สัญญาณดั้งเดิม

เงื่อนไขหนึ่งที่ทำให้ ICA ประสบความสำเร็จคือสัญญาณมากที่สุดคือ Gaussian และฉันได้สังเกตสิ่งนี้ในการสร้างสัญญาณของฉัน

อย่างไรก็ตามเงื่อนไขอื่นคือสัญญาณทั้งหมดมีความเป็นอิสระทางสถิติ

ทั้งหมดที่ฉันรู้ก็คือสิ่งนี้หมายความว่าเมื่อรับสัญญาณ A & B สองสัญญาณการรู้ว่าสัญญาณหนึ่งไม่ได้ให้ข้อมูลใด ๆ ที่เกี่ยวข้องกับสิ่งอื่นเช่น: P (A | B) = P (A) โดยที่ P คือความน่าจะเป็น

ตอนนี้คำถามของฉันคือ: สัญญาณของฉันมีความเป็นอิสระหรือไม่? มีวิธีใดบ้างที่ฉันจะตัดสินได้ บางทีคุณสมบัติบางอย่างที่ต้องปฏิบัติ?

สิ่งที่ฉันได้สังเกตเห็นก็คือว่าเมื่อผมคำนวณค่าลักษณะเฉพาะของเมทริกซ์ความแปรปรวนร่วม (การคำนวณเมทริกซ์ที่มีสัญญาณผสม) eigenspectrum ที่ดูเหมือนว่าจะแสดงให้เห็นว่ามีเพียงคนเดียว (หลัก) องค์ประกอบหลัก สิ่งนี้หมายความว่าอย่างไร ไม่ควรมี 5 เนื่องจากฉันมีสัญญาณอิสระ 5 (ตามที่คาดคะเน)

ตัวอย่างเช่นเมื่อใช้เมทริกซ์การผสมต่อไปนี้:

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

ค่าลักษณะเฉพาะคือ: 0.0000 0.0005 0.0022 0.0042 0.0345(เพียง 4!)

เมื่อใช้เมทริกซ์เอกลักษณ์เป็นเมทริกซ์ผสม (เช่นสัญญาณผสมเป็นเช่นเดียวกับคนเดิม) eigenspectrum 0.0103 0.0199 0.0330 0.0811 0.1762คือ: ยังคงมีค่าหนึ่งที่มีขนาดใหญ่กว่าส่วนที่เหลือ ..

ขอขอบคุณสำหรับความช่วยเหลือของคุณ.

ฉันขอโทษถ้าคำตอบสำหรับคำถามของฉันชัดเจนถึงความเจ็บปวด แต่ฉันยังใหม่กับสถิติ ICA และ Matlab ขอบคุณอีกครั้ง.

แก้ไข

ฉันมี 500 ตัวอย่างของแต่ละสัญญาณในช่วง [0.2, 100] เป็นขั้นตอนที่ 0.2 นั่นคือ x = 0: 0.1: 100

นอกจากนี้เมื่อพิจารณา ICA Model: X = As + n (ฉันไม่ได้เพิ่มเสียงรบกวนในขณะนี้) ฉันหมายถึง eigenspectrum ของ transpose ของ X คือ eig (cov (X '))

UPDATE

ตามที่แนะนำ (อ้างถึงความคิดเห็น) ฉันลองใช้FastICAเพียง 2 สัญญาณ ผลลัพธ์ค่อนข้างดี (ดูรูปด้านล่าง) A = [0.75 0.25; 0.25 0.75]เมทริกซ์ผสมใช้เป็น อย่างไรก็ตามไอเกนสเปคตรัม 0.1657 0.7732ยังคงแสดงองค์ประกอบหลักเพียงองค์ประกอบเดียวเท่านั้น

ดังนั้นคำถามของฉันจึงมีดังต่อไปนี้: ฉันสามารถใช้ฟังก์ชัน / สมการ / คุณสมบัติเพื่อตรวจสอบว่าเวกเตอร์สัญญาณจำนวนหนึ่งมีความเป็นอิสระทางสถิติหรือไม่

Sine & Gaussian - FastICA


1
คำถามที่ยอดเยี่ยม ฉันได้ถามว่าเราจะรู้ได้อย่างไรว่าสัญญาณทั้งสองมีความเป็นอิสระที่นี่ ( dsp.stackexchange.com/questions/1242/ ...... ) แต่ก็ไม่ได้ไกลไป :-) ฉันยังใหม่กับ ICA แต่ฉันอาจสามารถหลั่งน้ำตาบางอย่างได้
Spacey

@Mohammad คุณยังสนใจที่จะตอบคำถามนี้หรือไม่? ฉันยินดีที่จะให้ความสนใจเพื่อดึงดูดความสนใจ
Phonon

@ Mohammad ฉันอัปเกรดคำถามของคุณแล้ว หวังว่าคุณจะได้รับคำตอบที่ดีมันเกี่ยวข้องกับของฉันจริงๆ ฉันอ่านความคิดเห็นไปแล้วและมีสถิติมากมายที่ฉันไม่เข้าใจ คุณสามารถหาวิธีที่ชัดเจนเพื่อสรุปว่าสัญญาณสองสัญญาณนั้นมีความเป็นอิสระหรือไม่?
Rachel

@ ราเชลยังไม่ได้ตอนนี้ แต่ฉันจะค้นคว้าเพิ่มเติมและแจ้งให้คุณทราบ มันเป็นแนวคิดที่สำคัญมากอย่างหนึ่งที่ฉันรู้สึกมักจะเป็นที่น่าเสียดาย
Spacey

ขอบคุณ @Mammammad ฉันเห็นด้วย. สัญญาณอิสระสังเกตคุณสมบัติที่ E (s1, s2) = E (s1) x E (s2) แต่ฉันไม่รู้วิธีคำนวณจริง ๆ สำหรับสัญญาณจริง
Rachel

คำตอบ:


8

สัญญาณที่ 3 และ 5 ดูเหมือนจะมีความสัมพันธ์กันมาก - พวกเขาแบ่งปันความสามัคคีแรกของพวกเขา หากฉันได้รับการผสมสองอย่างฉันไม่สามารถแยกพวกมันออกได้ฉันจะถูกล่อลวงให้ใส่ฮาร์โมนิคทั่วไปเป็นสัญญาณเดียวและฮาร์โมนิกที่สูงกว่าเป็นสัญญาณที่สอง และฉันจะผิด! สิ่งนี้อาจอธิบายถึงค่าลักษณะเฉพาะที่หายไป

สัญญาณที่ 1 และ 2 ดูไม่เหมือนกัน

"สติตรวจสอบสติ" ที่รวดเร็วและสกปรกสำหรับความเป็นอิสระของทั้งสองซีรีส์คือทำพล็อต (x, y) ของสัญญาณหนึ่งต่ออีกอันหนึ่ง:

plot (sig3, sig5)

จากนั้นให้ทำพล็อตแบบเดียวกัน (x, y) โดยมีสัญญาณหนึ่งสัญญาณสับ:

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

หากทั้งสองแปลงมีลักษณะที่แตกต่างกันสัญญาณของคุณไม่ได้เป็นอิสระ โดยทั่วไปหากพล็อต (x, y) ของข้อมูลแสดงให้เห็นถึง "คุณสมบัติ" ความไม่สมดุล ฯลฯ มันเป็นลางไม่ดี

การทดสอบที่เหมาะสมสำหรับความเป็นอิสระ (และฟังก์ชันเหล่านั้นเป็นฟังก์ชันวัตถุประสงค์ที่ใช้ในลูปการเพิ่มประสิทธิภาพ ICA) รวมถึงตัวอย่างเช่นข้อมูลร่วมกัน

ICA กำลังกู้คืนสัญญาณที่เป็นอิสระมากที่สุดซึ่งเป็นการผสมกันแบบเส้นตรงซึ่งทำให้ได้ข้อมูลอินพุตของคุณ มันจะทำงานเป็นวิธีการแยกสัญญาณและกู้คืนสัญญาณดั้งเดิมเฉพาะเมื่อสัญญาณเหล่านั้นมีความเป็นอิสระสูงสุดตามเกณฑ์การปรับให้เหมาะสมที่ใช้ในการใช้งาน ICA ของคุณ


1
คำถาม: หากสัญญาณทั้งห้าในกรณีของเธอเป็นอิสระทั้งหมดแล้วเราคาดว่าจะไม่มีองค์ประกอบหลักที่ถูกต้องหรือไม่ (กล่าวอีกนัยหนึ่งค่าลักษณะเฉพาะทั้งหมดจะเหมือนกัน) ในทางเรขาคณิตเราจะมี 'เมฆ' guassian ใน 5 มิติเห็นด้วยไหม
Spacey

ฉันได้ติดต่อผู้เขียนเกี่ยวกับ ICA เกี่ยวกับการกำจัดไซนัสสองตัวออกจากส่วนผสมด้วยและเขาบอกว่าในความเป็นจริงแล้วสามารถทำได้ด้วย ICA สิ่งนี้ทำให้ฉันสับสนเล็กน้อยจากสิ่งที่คุณพูดเกี่ยวกับสัญญาณ 3 และ 5 เพราะ (ฉันเห็นด้วยกับคุณ) พวกเขาดูมีความสัมพันธ์
Spacey

@ pichenettes ฉันพล็อตกราฟเหล่านั้นตามที่คุณแนะนำ - และพล็อตก็มีรูปลักษณ์ที่แตกต่างกัน น่าเสียดายที่ฉันยังติดอยู่กับวิธีทดสอบความเป็นอิสระ ฉันต้องการวิธีการสร้างสัญญาณที่มีความเป็นอิสระทางสถิติเพื่อให้ฉันสามารถประเมินประสิทธิภาพของ FastICA ได้
Rachel

x1[n]x2[n]

@ Mohammad ฉันไม่ได้บันทึกเสียงของตัวเอง แต่ฉันลองใช้ FastICA กับส่วนผสมของสัญญาณ Sinusodial และ Gaussian ฉันคิดว่าพวกเขามีความเป็นอิสระ .. FastICA ทำงานได้ค่อนข้างดี แต่ eigenspectrum ก็ยังแปลก ฉันจะอัปเดตคำถามของฉันเพื่อแสดงผลลัพธ์
Rachel

7

ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับ ICA แต่ฉันสามารถบอกคุณได้เล็กน้อยเกี่ยวกับความเป็นอิสระ

ดังที่ความคิดเห็นบางส่วนได้กล่าวถึงความเป็นอิสระทางสถิติระหว่างตัวแปรสุ่มสองตัวแปรสามารถตีความคร่าวๆได้ว่า "ปริมาณข้อมูลที่สังเกตตัวแปรหนึ่งให้เกี่ยวกับอีกตัวแปร"

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

p(x,y)

XYXYพี(X=ผม,Y=J)=พีผมJP(X=ผม)=พีผมP(Y=J)=พีJ

ผม(X,Y)=ΣผมΣJพีผมJเข้าสู่ระบบพีผมJพีผมพีJ

นี่คือรหัส MATLAB บางส่วนที่จะสร้างสัญญาณอิสระสองสัญญาณจากการกระจายข้อต่อที่สร้างขึ้นและอีกสองสัญญาณจากการแจกแจงร่วมที่ไม่เป็นอิสระจากนั้นจึงคำนวณข้อมูลร่วมของข้อต่อ

ฟังก์ชั่น "computeMIplugin.m" เป็นฟังก์ชั่นง่าย ๆ ที่ฉันเขียนซึ่งคำนวณข้อมูลร่วมกันโดยใช้สูตรการสรุปข้างต้น

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

อีกครั้งสมมติว่าคุณมีการประเมินที่ดีของการกระจายข้อต่อ (พร้อมกับข้อสมมติอื่น ๆ ) แต่มันควรจะมีประโยชน์ในฐานะที่เป็นกฎง่ายๆ


นั่นเป็นคำตอบที่ดีขอบคุณ sydeulissie ฉันต้องมองลึกเข้าไปอีกหน่อย
Spacey

ก่อนอื่นขอขอบคุณสำหรับคำตอบที่ยาวมากมันให้ข้อมูลมาก ฉันมีคำถามสองสามข้อ คุณพูดถึงการใช้การทดสอบไคสแควร์ ฉันดูมันแล้วดูน่าสนใจจริงๆ แต่ฉันจะใช้มันกับสัญญาณได้อย่างไร ไม่สามารถใช้กับข้อมูลที่เป็นหมวดหมู่เท่านั้นหรือไม่
Rachel

นอกจากนี้คุณกำลังใช้ Pj1 = P1 '* P2 เพื่อคำนวณการกระจายตัวของข้อต่อให้ถูกต้องไหม? แต่ในทางเทคนิคแล้วฉันเชื่อว่าสิ่งนี้ไม่สามารถทำได้ บางทีคุณอาจกำลังทำอยู่เพราะคุณคิดว่าสัญญาณดั้งเดิมนั้นมีความเป็นอิสระและผลลัพธ์ก็คือ แต่คุณจะคำนวณข้อมูลร่วมกันได้อย่างไร - เนื่องจากผลลัพธ์นั้นขึ้นอยู่กับการแจกแจงร่วม .. อาจเป็นเพราะฉันเข้าใจผิดบางอย่าง แต่ฉันต้องการคำอธิบายเพิ่มเติม
Rachel

ฉันจะมีความสุขแม้ว่ามันจะเป็นบิตก่อนที่ฉันจะได้รับเวลา :)
อ๋อ

ขอบคุณ @sydeulissie ฉันต้องการคำตอบที่ไม่คิดว่าฉันมีความรู้เกี่ยวกับการกระจายข้อต่อโปรด
Rachel

3

ดังที่กล่าวไว้ข้างต้นสัญญาณทั้ง 3 และ 5 นั้นมีความสัมพันธ์กันค่อนข้างมากและมีระยะเวลาใกล้เคียงกัน

เราสามารถคิดถึงสัญญาณสองตัวที่มีความสัมพันธ์กันถ้าเราสามารถเลื่อนแหล่งสัญญาณหนึ่งไปทางซ้ายหรือขวาและเพิ่มหรือลดขนาดแอมพลิจูดของมันเพื่อให้พอดีกับด้านบนของแหล่งอื่น หมายเหตุเราไม่ได้เปลี่ยนความถี่ของแหล่งกำเนิดเราเพียงแค่ทำการเปลี่ยนเฟสและแอมพลิจูด

ในกรณีข้างต้นเราสามารถเลื่อนซอร์ส 3 เพื่อให้พีคของมันตรงกับแหล่งที่ 5 นี่คือประเภทของสิ่งที่จะทำให้เกิดการแตกแหล่งที่มาเมื่อใช้ ICA เนื่องจากสมมติฐานอิสระ

หมายเหตุ : ภาพประกอบที่ดีของแนวคิดด้านบนคือคิดถึงคลื่นไซน์สองคลื่น สิ่งเหล่านี้ทั้งสองกำหนดขึ้นอย่างสมบูรณ์ หากทั้งคู่มีความถี่เท่ากัน (แม้จะอยู่ในเฟสที่ต่างกัน) ก็จะมีความสัมพันธ์กันอย่างสมบูรณ์และ ICA จะไม่สามารถแยกพวกเขาออกได้ หากพวกเขามีความถี่ที่แตกต่างกัน (ซึ่งไม่ใช่จำนวนทวีคูณของกันและกัน) แสดงว่าพวกเขามีความเป็นอิสระและสามารถแยกได้

ด้านล่างนี้เป็นรหัส Matlab สำหรับให้คุณดูด้วยตัวคุณเอง

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

โปรดทราบว่าสำหรับคลื่นที่มีความถี่เท่ากัน ICA จะส่งคืนสัญญาณอินพุต แต่สำหรับความถี่ที่ต่างกันจะส่งคืนต้นฉบับ


2

ราเชล

จากการวิจัยของฉันฉันสามารถค้นหาสิ่งที่เรียกว่า ' การทดสอบ Chi-Squared เพื่อความเป็นอิสระ ' จนถึงขณะนี้ แต่ฉันไม่แน่ใจว่ามันทำงานอย่างไรในขณะนี้ แต่มันอาจคุ้มค่าที่จะดู


ฉันได้พบทั้งสองบทเรียนอธิบายวิธีการดำเนินการทดสอบไคสแควร์: ling.upenn.edu/~clight/chisquared.htm & math.hws.edu/javamath/ryan/ChiSquare.html อย่างไรก็ตามการทดสอบสามารถทำได้กับข้อมูลที่เป็นหมวดหมู่เท่านั้น ฉันไม่รู้ว่าสิ่งนี้สามารถนำไปใช้กับการสังเกตสัญญาณของเราได้ไหม
ราเชล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.