www.pudn.com > MutualInformationICA.zip > ICAtests.m


function ICAtests(x,emb_dim,emb_tau,kneig,algo,kmax)

% Reliability test for any ICA output (linear transformation version!)
% Output: Dependency Matrix, Variability Matrix, and MI vs rotation angle
% plot (to check if the components are indeed the most independent one)

% x....input data mxn   m...channelnummer  n...sampling points  m<1 (default is 1)

%default-values
if ~exist('emb_dim'), emb_dim=1; end
if ~exist('emb_tau'), emb_tau=1; end
if ~exist('kneig'), kneig=5; end
if ~exist('algo'), algo=2; end
if ~exist('kmax'), kmax=15; end


[Nd,N]=size(x);
if Nd>N
    x=x';
    [Nd,N]=size(x);
end

% save data for external Programm
zwsp=x';
save zwsptests.txt zwsp -ASCII

% execute C Programm
[a b]=unix(['ICAtests zwsptests.txt ',num2str(Nd),' ',num2str(N),' ',num2str(kneig),' ',num2str(emb_tau),' ',num2str(emb_dim),' ',num2str(algo-1),' ',num2str(kmax)]);

%format output
[mivsangle,count,errmsg,nextindex] = sscanf(b,'%f',[kmax,Nd*(Nd-1)/2]);
varmimat=str2num(b(nextindex:end));
mimat=varmimat(1:Nd,:);
varmimat=varmimat(Nd+1:2*Nd,:);

  
%plot output
count=1;
mivsangle=mivsangle';

if Nd==2   
    fprintf('MI value: %f \n',mimat(1,2));
    fprintf('Variability of the MI under rotation: %f',varmimat(1,2));
    figure;
    plot(mivsangle);
    set(gca,'xlim',[1 kmax],'xtick',round(linspace(1,kmax,4)),'xticklabel',(round(linspace(1,kmax,4))-1)/(kmax)*90);
    xlabel('roation angle');
    ylabel('mutual information');
else
    figure;
    subplot(1,2,1)
    maxMI=max(max(mimat));
    if maxMI<0.3, maxMI=0.3; end  
    imagesc(mimat,[0,maxMI]);
    title('Dependency Matrix');
    h=flipud(colormap(gray));
    colormap(h);
    colorbar;
    subplot(1,2,2);
    minVar=min(min(varmimat));
    if minVar<-0.015, fprintf('Input seems to be not the most independent representation under linear transformation !!!!!!!!!!!'); end
    imagesc(varmimat);
    title('Variability Matrix');
    colormap(h);
    colorbar;
    
    figure;
    
    ymin=min(min(mivsangle));
    ymax=max(max(mivsangle));
    for i=1:Nd
        for j=1:Nd
            if i