ICA - 协方差矩阵的统计独立性和特征值

信息处理 matlab 伊卡 统计数据 独立
2021-12-29 05:17:57

我目前正在使用 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 成功的一个条件是至多一个信号是高斯信号,我在信号生成中观察到了这一点。

然而,另一个条件是所有信号在统计上都是独立的。

我所知道的是,这意味着,给定两个信号 A 和 B,知道一个信号不会提供关于另一个信号的任何信息,即: P(A|B) = P(A)其中 P 是概率

现在我的问题是:我的信号在统计上是独立的吗?有什么办法可以确定吗?也许一些必须遵守的属性?

我注意到的另一件事是,当我计算协方差矩阵的特征值(针对包含混合信号的矩阵计算)时,特征谱似乎表明只有一个(主要)主成分这到底是什么意思?不应该有 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 个!)

当使用单位矩阵作为混合矩阵时(即混合后的信号与原始信号相同),特征谱为:0.0103 0.0199 0.0330 0.0811 0.1762仍然有一个值比其他值大得多..

谢谢您的帮助。

如果我的问题的答案非常明显,我深表歉意,但我对统计、ICA 和 Matlab 真的很陌生。再次感谢。

编辑

我有每个信号的 500 个样本,范围为 [0.2, 100],步长为 0.2,即 x = 0:0.1:100。

另外,给定 ICA 模型:X = As + n(我现在没有添加任何噪声),我指的是 X 的转置的特征谱,即 eig(cov(X'))。

更新

按照建议(请参阅评论),我仅在 2 个信号上尝试了FastICA 。结果非常好(见下图)。使用的混合矩阵是A = [0.75 0.25; 0.25 0.75]. 然而,特征谱 0.1657 0.7732仍然只显示一个主要的主成分。

因此,我的问题归结为以下几点:我可以使用什么函数/方程/属性来检查多个信号向量在统计上是否独立?

正弦和高斯 - FastICA

4个回答

信号 3 和 5 似乎非常相关——它们共享它们的一次谐波。如果给我它们的两种混合,我将无法将它们分开,我很想将公共谐波作为一个信号,将高次谐波作为第二个信号。我错了!这可以解释缺失的特征值。

信号 1 和 2 看起来也不独立。

对两个系列的独立性进行快速而肮脏的“健全性检查”是对一个信号与另一个信号进行 (x, y) 绘图:

plot (sig3, sig5)

然后做同样的 (x, y) 绘图,其中一个信号被打乱:

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

如果两个图的外观不同,则您的信号不是独立的。更一般地说,如果数据的 (x, y) 图显示“特征”、不对称等,这是一个不祥之兆。

适当的独立性测试(这些是 ICA 优化循环中使用的目标函数)包括,例如,互信息。

ICA 正在恢复最独立的信号,通过线性混合产生您的输入数据它将作为一种信号分离方法工作,并且只有在根据您的 ICA 实现中使用的优化标准最大程度独立的情况下才能恢复原始信号。

我不是 ICA 方面的专家,但我可以告诉你一些关于独立性的事情。

正如一些评论所提到的,两个随机变量之间的统计独立性可以粗略地解释为“观察一个变量给出的关于另一个变量的信息量”。

但是,因为我们谈论的是统计独立性,所以所有这些都与分布有关。特别是,如果您观察两个随机变量的独立性等价于它们的联合分布的条件。特别是,当且仅当是独立的。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

这是一些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')

同样,这假设您对联合分布有一个很好的估计(以及其他快乐的假设),但作为经验法则,它应该是有用的。

如上所述,信号 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 只返回输入信号,但对于不同频率的波,它返回原始源。

雷切尔,

根据我的研究,到目前为止,我已经能够找到一种叫做“独立卡方检验”的东西,但我目前不确定它是如何工作的,但它可能值得一看。