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が成功するための1つの条件は、最大で1つの信号がガウス分布であるということです。これは、信号生成で観察しました。

ただし、別の条件は、すべての信号が統計的に独立していることです。

私が知っているのは、これは、2つの信号AとBが与えられ、一方の信号が他方に関する情報を与えないことを意味するということです。つまり、P(A | B)= P(A)ここで、Pは確率です。

ここで私の質問は次のとおりです。私の信号は統計的に独立していますか?これを決定する方法はありますか?おそらく、いくつかのプロパティを観察する必要がありますか?

私が気づいたもう1つのことは、共分散行列の固有値を計算すると(混合信号を含む行列に対して計算されます)、固有スペクトルは1つの(主要な)主成分のみがあることを示すようです。これはどういう意味ですか?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ます。残りの値よりもはるかに大きい値が1つあります。

ご協力ありがとうございました。

私の質問に対する答えが痛々しいほど明白な場合は謝罪しますが、統計、ICA、およびMatlabは初めてです。再度、感謝します。

編集

[0.2、100]の範囲で、0.2のステップでx = 0:0.1:100の各信号のサンプルが500個あります。

また、ICAモデルを考えると、X = As + n(現時点ではノイズを追加していません)、Xの転置の固有スペクトル、つまりeig(cov(X '))を参照しています。

更新

提案されているように(コメントを参照)、2つの信号のみでFastICAを試しました。結果は非常に良好でした(下の写真を参照)。使用された混合行列はでしたA = [0.75 0.25; 0.25 0.75]。ただし、固有スペクトルには 0.1657 0.7732まだ主要な主成分が1つしか示されていません。

したがって、私の質問は次のように要約されます。多くの信号ベクトルが統計的に独立しているかどうかを確認するために、どの関数/方程式/プロパティを使用できますか?

サインとガウス-FastICA


1
素晴らしい質問です。ここでは、2つの信号が独立していることをどのように知ることができるかについて質問しました(dsp.stackexchange.com/questions/1242/…)。:-)私もICAが初めてですが、光を当てることができるかもしれません。
スペイシー

@Mohammadあなたはまだその質問への回答に興味がありますか?興味を引くために喜んで賞金をかけます。
フォノン

@Mohammad私はあなたの質問を支持しました。あなたが良い答えを得ることを願っています、それは本当に私のものに関連しています。私はこれまでにコメントを読んできましたが、理解できない統計がたくさんあります。2つの信号が独立しているかどうかを決定する明確な方法を思いついたのですか?
レイチェル

@Rachel現時点ではまだですが、もう少し調査してお知らせします。それは非常に重要な概念であり、残念ながら通常はusuallyめられていると感じています。
スペイシー

@Mohammadに感謝します。同意する。独立した信号は、E(s1、s2)= E(s1)x E(s2)というプロパティを観察しますが、実際の信号に対して実際に計算する方法はわかりません。
レイチェル

回答:


8

信号3と5は非常に相関しているように見えます。最初の高調波を共有しています。それらの2つの混合物が与えられた場合、それらを分離することはできません。私は共通の高調波を1つの信号として、高次の高調波を2番目の信号として配置したいと思います。そして、私は間違っているでしょう!これは、欠落した固有値を説明する場合があります。

信号1と2も独立して見えません。

2つのシリーズの独立性に関する迅速で汚い「健全性チェック」は、一方の信号を他方に対して(x、y)プロットすることです。

plot (sig3, sig5)

次に、1つの信号をシャッフルして同じ(x、y)プロットを実行します。

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

2つのプロットの外観が異なる場合、信号は独立していません。より一般的には、データの(x、y)プロットが「特徴」、非対称性などを示す場合、それは悪い兆候です。

独立性(およびICA最適化ループで使用される目的関数)の適切なテストには、たとえば相互情報が含まれます。

ICAは、線形混合によって入力データが生成される最も独立した信号を回復しています。信号分離方法として機能し、元の信号がICA実装で使用される最適化基準に従って最大限に独立している場合にのみ元の信号を復元します。


1
質問:彼女の場合の5つのシグナルが実際にはすべて独立している場合、正しい主成分が存在しないと予想されますか?(言い換えると、すべての固有値は同じものになります)。幾何学的に、5次元のガウスの「クラウド」がありますよね?
スペイシー

また、混合物から2つの正弦波を除去することについてICAの著者に連絡し、実際にICAを使用して行うことができると述べました。これは、信号3と5に関してあなたが何を言っているかに基づいて、私を少し混乱させます。
スペイシー

@pichenettesあなたが提案したように、私はそれらのグラフをプロットしました-そして、プロットは確かに異なる外観を持っています。残念ながら、独立性をどのようにテストするかについては、まだ固執しています。FastICAのパフォーマンスを評価できるように、統計的に独立した信号を生成する方法が本当に必要です。
レイチェル

x1[n]x2[n]

@Mohammad私は自分の声を録音しませんでしたが、正弦波とガウス信号の混合でFastICAを使用してみました。私は彼らが独立していると思います。FastICAは非常に良い性能を発揮しましたが、固有スペクトルはまだ奇妙でした。質問を更新して結果を表示します。
レイチェル

7

私はICAの専門家ではありませんが、独立性について少しお話しできます。

いくつかのコメントが述べたように、2つのランダム変数間の統計的独立性は、「1つの変数を観察することで別の変数について与える情報の量」として大まかに解釈できます。

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

構築されたジョイント分布から2つの独立した信号を生成し、非独立なジョイント分布から2つの信号を生成し、ジョイントの相互情報を計算する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ありがとう、私はそれをもう少し深く調べる必要があります。
スペイシー

まず、長い回答に感謝します。非常に有益でした。質問がいくつかあります。カイ2乗検定の使用について言及しました。私はそれを調べて本当に面白そうに見えますが、信号でどのように使用できますか?カテゴリデータにのみ適用することはできませんか?
レイチェル

また、Pj1 = P1 '* P2を使用して結合分布を計算していますか?しかし、技術的には、これはできないと考えています。たぶん、元の信号が独立していると仮定しているので、あなたはそれをやっているのでしょうか?しかし、どうすれば相互情報を計算できますか-結果は共同分布に依存するためです。何か誤解しているかもしれませんが、説明をお願いします。
レイチェル

私は喜んで-時間を得る前に少しなりますが:)。
はい

@sydeulissieありがとうございます。共同配布の知識があることを前提としない回答をお願いします。
レイチェル

3

前述のように、信号3と5は非常に相関があり、同様の周期を持っているようです。

ソースの1つを左または右にシフトし、他のソースの上に収まるように振幅を増減できる場合、2つの信号が相関していると考えることができます。ソースの周波数を変更するのではなく、位相と振幅のシフトを実行するだけです。

上記の場合、ソース3をシフトして、そのピークがソース5と一致するようにすることができます。これは、独立性の仮定のためにICAを使用する場合、ソース抽出を台無しにします。

:上記の概念の良い例は、2つの正弦波を考えることです。これらは両方とも完全に決定的です。それらが両方とも同じ周波数を持っている場合(異なる位相であっても)、それらは完全に相関しており、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

レイチェル、

私の研究から、これまで「独立ためカイ二乗検定」と呼ばれるものを見つけることができましたが、現時点ではどのように機能するのかわかりませんが、一見の価値があります。


:私は、カイ二乗検定を実行する方法を説明するこれらの2つのチュートリアル見つけたling.upenn.edu/~clight/chisquared.htmmath.hws.edu/javamath/ryan/ChiSquare.htmlを。ただし、テストはカテゴリデータでのみ実行できます。これが信号の観測に適用できるかどうかはわかりません
レイチェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.