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

时间:2012-02-21 13:38:02

标签: matlab machine-learning statistics

我目前正在使用Matlab创建不同的信号,通过将它们乘以混合矩阵A来混合它们,然后尝试使用FastICA来恢复原始信号。

到目前为止,与原始信号相比,恢复的信号非常糟糕,这不是我的预期。

我正试图看看我做错了什么。我正在生成的信号如下:(幅度在[0,1]范围内。)

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

Original Signals

ICA成功的一个条件是最多只有一个信号是高斯信号,我在信号生成中观察到了这一点。

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

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

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

我注意到的另一件事是,当我计算协方差矩阵的特征值(针对包含混合信号的矩阵计算)时,本征谱似乎表明只有一个(主要)主成分< / strong>即可。这究竟意味着什么?不应该有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 个答案:

答案 0 :(得分:1)

您的信号是相关的(不是独立的)。蝙蝠,锯齿和正弦是同一时期。告诉我一个人的价值我会告诉你另一个完美的相关性的价值。

如果你改变其中一个的周期,那将使他们更加独立。

S1和S2也有点相关。

至于特征值,首先你的信号不是独立的(参见上文)。

其次,你的滤波器矩阵A也没有很好的条件,进一步扩展你的特征值。

即使你要输入五个完全独立的(iid,yada yada)信号,协方差也将是:

E[ A y y' A' ] = E[ A I A' ]  =  A A'

特征值是:

eig(A*A')
ans =

   0.000167972216475
   0.025688510850262
   0.035666735304024
   0.148813869149738
   1.042451912479502

所以你真的将所有信号过滤/压缩到一个基本功能/自由度上,当然,无论你使用什么方法,它们都很难恢复。

答案 1 :(得分:0)

要查找信号是否相互独立,您可以查看所描述的技术here通常,如果两个随机变量是正交的,则它们是独立的。这意味着:E {s1 * s2} = 0意味着随机变量s1乘以随机变量s2的期望值为零。这种正交性条件在统计和概率中极为重要,并且随处可见。不幸的是,它一次适用于2个变量。有多变量技术,但没有一个我会觉得舒服推荐。我挖出的另一个链接是one,不知道你的申请是什么,但那篇论文非常做得很好。

当我计算协方差矩阵时,我得到:

cov(A) =
 0.0619   -0.0284   -0.0002   -0.0028   -0.0010
-0.0284    0.0393    0.0049    0.0007   -0.0026
-0.0002    0.0049    0.1259    0.0001   -0.0682
-0.0028    0.0007    0.0001    0.0099   -0.0012
-0.0010   -0.0026   -0.0682   -0.0012    0.0831

使用特征向量,V和值D

[V,D] = eig(cov(A))

V =

-0.0871    0.5534    0.0268   -0.8279    0.0063
-0.0592    0.8264   -0.0007    0.5584   -0.0415
-0.0166   -0.0352    0.5914   -0.0087   -0.8054
-0.9937   -0.0973   -0.0400    0.0382   -0.0050
-0.0343    0.0033    0.8050    0.0364    0.5912
D =
0.0097         0         0         0         0
     0    0.0200         0         0         0
     0         0    0.0330         0         0
     0         0         0    0.0812         0
     0         0         0         0    0.1762

这是我的代码:

x = transpose(0.2:0.2:100);
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(length(x), 1); % gaussian
s5 = (sawtooth(x, 0.75)+ 1) * 0.5; % sawtooth
A = [s1 s2 s3 s4 s5];
cov(A)
[V,D] = eig(cov(A))

让我知道我是否可以提供帮助,或者如果我误解了。

EDIT 正确引用特征值和向量,使用0.2采样间隔添加代码。