testica.m
来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 268 行
M
268 行
% testica() - Test the runica() function's ability to separate synthetic sources. % Use the input variables to estimate the (best) decomposition accuracy% for a given data set size.% Usage:% >> testica(channels,frames); % No return variable -> plot results% >> [testresult] = testica(channels,frames,sources,exppow,shape);% % Return variable -> return results with no plots% Inputs:% channels = number of simulated data channels {no default}% frames = number of simulated time points {no default}% sources = number of simulated quasi-independent sources {default: =channels}% exppow = exponential power for scaling size of the sources (0->all equal)% {default: -0.05 -> Ex: 14 sources scaled between 1.0 and 0.24}% shape = varies monotonically with kurtosis of the simulated sources % {default: 1.2 -> source kurtosis near 1 (super-Gaussian>0)}%% Authors: Scott Makeig & Te-Won Lee, SCCN/INC/UCSD, La Jolla, 2-27-1997 %% See also: runica()% Copyright (C) 2-27-97 Scott Makeig & Te-Won Lee, SCCN/INC/UCSD, scott@sccn.ucsd.edu%% This program is free software; you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation; either version 2 of the License, or% (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA% $Log: testica.m,v $% Revision 1.4 2004/04/28 06:15:07 scott% ok%% Revision 1.3 2003/09/18 23:44:18 arno% debug runica%% Revision 1.2 2003/09/17 02:11:55 arno% nothing%% Revision 1.1 2002/04/05 17:36:45 jorn% Initial revision%% 2-28-97 added source, shape and exppow parameters, kurtosis -sm% 4-03-97 shortened name to testica() -sm% 4-14-97 changed call to runica() to use new variable order -sm% 4-16-97 prints max and min abs corr -sm% 7-10-97 changed to newrunica(), added surf() plot -sm% 7-30-97 altered runica() call to fit version 3.0 -sm% 3-02-00 replaced idit() call with call to Benjamin Blankertz' eyeLike() -sm% 3-08-00 added kurt and exppow plots, changed defaults, added plot labels -sm% 01-25-02 reformated help & license, added links -ad function [testresult] = testica(channels,frames,sources,exppow,shape)icadefs; % read BACKCOLOR% Default runica() parameter values:block = 0; % default block size lrate = 0; % default starting lrate adeg = 0; % default annealing threshold maxsteps = 0; % default sphereflag = 'on'; % default yes, perform spheringstop = 0.000001; % default stopping wchange% Defaults:default_chans = 31;default_frames = 10000;% default sources = channelsdefault_exppow = -0.05;default_shape = 1.2;if nargin<2 help testica returnendif nargin<5 shape = default_shape;endif nargin<4 exppow = default_exppow;endif nargin<3, sources = 0;endif nargin<2 frames = 0;endif nargin < 1 channels = 0;endif frames == 0, frames = default_frames;endif channels == 0, channels = default_chans;endif sources == 0, sources = channels;endif sources < channels, fprintf('testica() - sources must be >= channels.\n'); exit 1end% Generate artificial super-Gaussian sources:fprintf('\n Testing runica() using %d simulated sources.\n\n',sources);fprintf('Computing %d simulated source activations of length %d ...\n', ... sources,frames);fprintf('Simulated source strengths: %4.3f to %4.3f.\n', ... 1.0, exp(exppow*(channels-1)));exppowers = zeros(1,channels);exppowers(1) = 1.0;for s=1:sources exppowers(s) = exp(exppow*(s-1));end% Synthesize random source activationssuper=randn(sources,frames).*(exppowers'*ones(1,frames)); super=sign(super).*abs(super.^shape); % make super-Gaussian if shape > 1% fprintf('Size of super = %d,%d\n',size(super,1),size(super,2));if frames > 40 figure pos = get(gcf,'position'); off = [40 -40 0 0]; % succeeding figure screen position offsets hist(super(1,:),round(frames/20)); tt=title('Amplitude distribution of source 1'); set(tt,'fontsize',14); xlm=get(gca,'xlim'); ylm=get(gca,'ylim'); kurttext = ['Kurtosis = ' num2str(kurt(super(1,:)),3)]; tp=[xlm;ylm]*[0.25;0.75]; kt=text(tp(1),tp(2),kurttext); set(kt,'fontsize',13); set(kt,'horizontalalignment','center');else fprintf('Not plotting source amplitude histogram: data length too small.\n')end if nargout == 0 input('Hit enter to view source strengths: '); fprintf('\n') if frames <= 40 figure pos = get(gcf,'position'); else figure('position',pos+off); end plot(1:sources,exppowers); hold on;plot(1:sources,exppowers,'r^'); set(gca,'xlim',[0 sources+1]); set(gca,'ylim',[0 1]); xt=title(['Relative source amplitudes (exppow = ' num2str(exppow,3) ')']); set(xt,'fontsize',14); axl=xlabel('Source Number'); ayl=ylabel('Relative Amplitude'); set(axl,'fontsize',14); set(ayl,'fontsize',14);endk = kurt(super'); % find kurtosis of rows of supermaxkurt = max(k); minkurt=min(k);fprintf('Simulated source kurtosis: %4.3f to %4.3f.\n',minkurt,maxkurt);tmp = corrcoef(super');i = find(tmp<1);minoff = min(abs(tmp(i)));maxoff = max(abs(tmp(i)));fprintf('Absolute correlations between sources range from %5.4f to %5.4f\n', ... minoff,maxoff);fprintf('Mixing the simulated sources into %d channels ...\n',channels);forward = randn(channels,sources); % random forward mixing matrixdata = forward*super; % these are the simulated observed dataif nargout == 0 input('Hit enter to start ICA decomposition: ') fprintf('\n')endfprintf('Decomposing the resulting simulated data using runica() ...\n'); [weights,sphere,compvars,bias,signs,lrates,activations] = runica(data, ... 'block',block, ... 'lrate',lrate, ... 'nochange',stop, ... 'annealdeg',adeg, ... 'maxsteps',maxsteps, ... 'sphering',sphereflag, 'weights',eye(channels)); fprintf('ICA decomposition complete.\n');% Alternatively, activations = icaact(data,weights,sphere,datamean);fprintf('\nScaling and row-permuting the resulting performance matrix ...\n')testid = weights*sphere*forward(:,1:channels); % if separation were complete, this % would be a scaled and row-permuted % identity matrixtestresult = eyelike(testid); % permute output matrix rows to rememble eye() % using Benjamin Blankertz eyeLike() - 3/2/00% testresult = idit(testid); % permute output matrix rows to rememble eye() % scale to make max column elements all = 1tmp = corrcoef(activations');i = find(tmp<1);maxoff = max(abs(tmp(i)));minoff = min(abs(tmp(i)));fprintf('Absolute activation correlations between %5.4f and %5.4f\n',minoff,maxoff);i = find(testresult<1); % find maximum abs off-diagonal valuemaxoff = max(abs(testresult(i)));meanoff = mean(abs(testresult(i)));if sources > channels, fprintf('The returned matrix measures the separation'); fprintf('of the largest %d simulated sources,\n',channels);endfprintf('Perfect separation would return an identity matrix.\n');fprintf('Max absolute off-diagonal value in the returned matrix: %f\n',maxoff);fprintf('Mean absolute off-diagonal value in the returned matrix: %f\n',meanoff); [corr,indx,indy,corrs] = matcorr(activations,super);fprintf('Absolute corrs between best-matching source and activation\n');fprintf(' component pairs range from %5.4f to %5.4f\n', ... abs(corr(1)),abs(corr(length(corr))));if nargout == 0 fprintf('\nView the results:\n'); fprintf('Use mouse to rotate the image.\n');endfigure('Position',pos+2*off);set(gcf,'Color',BACKCOLOR);surf(testresult); % plot the resulting ~identity matrixst=title('Results: Test of ICA Separation');set(st,'fontsize',14)sxl=xlabel('Source Out');set(sxl,'fontsize',14);syl=ylabel('Source In');set(syl,'fontsize',14);szl=zlabel('Relative Recovery');set(szl,'fontsize',14);view(-52,50);axis('auto');if max(max(abs(testresult)))>1 fprintf('NOTE: Some sources not recovered well.\n'); fprintf('Restricting plot z-limits to: [-1,1]\n'); set(gca,'zlim',[-1 1]);endrotate3dif nargout == 0 testresult = [];end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?