我已下载并成功安装了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')
我得到的输出图是:
第一行图是原始信号。第二行是与随机矩阵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社区的任何帮助/反馈。
答案 0 :(得分:1)
我认为如果你重叠两个结果会更好,我无法在没有抓住其中一个结果的情况下区分这两个结果,
检查以下'pow3'和'gauss',
修改强>
使用的代码,
% 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:');