在MATLAB中使用FastICA算法时,如何指定非线性参数?

时间:2017-12-08 17:51:09

标签: matlab parameters

我已下载并成功安装了MATLAB FastICA package

主要算法在fastica.m

中实现

作者慷慨地提供了我能够成功运行的示例演示代码,如下所示:

N=500; %data size

v=[0:N-1];

sig(1,:)=sin(v/2); %sinusoid
sig(2,:)=((rem(v,23)-11)/9).^5; %funny curve
sig(3,:)=((rem(v,27)-13)/9); %saw-tooth
sig(4,:)=((rand(1,N)<.5)*2-1).*log(rand(1,N)); %impulsive noise

%create mixtures

Aorig=rand(size(sig,1));
mixedsig=(Aorig*sig);

%preform ica to unmix signal
ica = fastica(mixedsig);

subplot(2,4,1); plot(sig(1,:));
title('1')
subplot(2,4,2); plot(sig(2,:));
title('2')
subplot(2,4,3); plot(sig(3,:));
title('3')
subplot(2,4,4); plot(sig(4,:));
title('4')
subplot(2,4,5); plot(ica(3,:));
title('5')
subplot(2,4,6); plot(ica(1,:));
title('6')
subplot(2,4,7); plot(ica(2,:));
title('7')
subplot(2,4,8); plot(ica(4,:));
title('8')

我得到的输出图是:

enter image description here

第一行图是原始信号。第二行是与随机矩阵A混合后的恢复信号

我的问题是:如何修改上面的代码以指定不同的非线性设置?

如果您查看fastica.m中的第51行,则有4种不同的选项:

'pow3' (default)   g(u)=u^3
'tanh'             g(u)=tanh(a1*u)
'gauss             g(u)=u*exp(-a2*u^2/2)
'skew'             g(u)=u^2

我试着这样做:

g='tanh'

然后我重新运行上面的代码,但它看起来没有任何改变(得到相同的图)。

然后我试着这样做:

g='gauss'

再次,相同的情节。

非常感谢MATLAB社区的任何帮助/反馈。

1 个答案:

答案 0 :(得分:1)

我认为如果你重叠两个结果会更好,我无法在没有抓住其中一个结果的情况下区分这两个结果,

检查以下'pow3'和'gauss',

enter image description here

enter image description here

enter image description here

enter image description here

修改

使用的代码,

% change g in fastica (line 247) g='pow3'
N=500; %data size
v=[0:N-1];
sig(1,:)=sin(v/2); %sinusoid
sig(2,:)=((rem(v,23)-11)/9).^5; %funny curve
sig(3,:)=((rem(v,27)-13)/9); %saw-tooth
sig(4,:)=((rand(1,N)<.5)*2-1).*log(rand(1,N)); %impulsive noise
%create mixtures
Aorig=rand(size(sig,1));
mixedsig=(Aorig*sig);
%preform ica to unmix signal
ica = fastica(mixedsig);
figure(1)
plot(ica(3,:));
title('5')
figure(2)
plot(ica(1,:));
title('6')
figure(3)
plot(ica(2,:));
title('7')
figure(4)
plot(ica(4,:));
title('8')




% Change g in fastica (line 247),  g= 'gauss';

ica = fastica(mixedsig);

figure(1)
hold on
plot(ica(3,:),'r:');
figure(2)
hold on
plot(ica(1,:),'r:');
figure(3)
hold on
plot(ica(2,:),'r:');
figure(4)
hold on
plot(ica(4,:),'r:');