Home > . > runCV.m

runCV

PURPOSE ^

%% This documentation needs to be updated.

SYNOPSIS ^

function CV = runCV(trials,classes,parameterSets,validateFraction,validateReps,featurizeF,classifyF,selectInOneTrialF)

DESCRIPTION ^

%%   This documentation needs to be updated.
%%
%% results = general(trials,classes,parameterSets,validateFraction,validateReps,...
%%    makeFeaturizeF,featurizeF,makeClassifierF,classifyF)
%%  trials: ntasks x ntrials cell array of EEG data matrices, each nchannels x nsamples
%%  classes: ntasks x ntrials matrix of class labels
%%  parameterSets: nParameterSets vector of structs containing named ...
%%    parameters, like  parameterSets(1).nlags
%%  validateFraction: fraction of training data samples to randomly hold ...
%%    out for validation samples
%%  validateReps: repeat partition of training data into tuning and ...
%%    validating subsets this many times and average the results
%%
%%  featurizeF: function to create parameters for making features and for
%%              transforming samples into features
%%
%%     To make feature parameters, must have form like
%%        CV = featurizeF(trials,CV,'make')
%%     where
%%          trials: ntasks x ntrials cell array of data
%%          CV.parms contains named fields like CV.parms.nlags
%%     returns
%%          CV: with fields to be used by next call to featurizeF
%%
%%     To transform samples to features, must have form like
%%        features = featurizeF(trials,CV)
%%     where
%%          trials: ntasks x ntrials cell array of data
%%          CV.parms contains named fields like CV.parms.nlags
%%          CV... other fields made by featurizeF(..,..,'make')
%%     returns
%%          features: cell array of features
%%
%%  classifyF: function to classify features
%%     Must have form like
%%          [fractionCorrect,classifier] = classifyF(traindata,CV,selectInOneTrialF,'make')
%%     where
%%          traindata: ntasks x ntrials cell array of featurized data
%%          CV contains fields for parameters like CV.parms.firstMode
%%          selectInOneTrialF: See below
%%     returns
%%          fractionCorrect: fraction validate samples correctly classified
%%          classifier: classifier parameters
%%
%%     Must have form like
%%          [fractionCorrect,classes] = classifyF(testdata,CV,selectInOneTrialF)
%%     where
%%          testdata: ntasks x ntrials cell array of featurized data
%%          CV contains fields for parameters like CV.parms.firstMode
%%             and CV.classifier
%%          selectInOneTrialF: See below.
%%     returns
%%          fractionCorrect: fraction validate samples correctly classified
%%          classes: classes for test data
%%
%%     selectInOneTrialF: Must have form like
%%         [X,Y] = oneTrialF(oneTrial,indices,oneTrialClass,CV);
%%         where oneTrial: is matrix of one trial of featurized data.
%%               indices: is vector of sample (column) indices
%%               oneTrialClass: is class for this trial
%%               CV.parms:  fields for use here, such as firstMode, nModes
%%         returns X: nSamples x nFeatures of samples
%%                 Y: nSamples x 1 class 
%%
%%   Returns 
%%     results.

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function CV = runCV(trials,classes,parameterSets,validateFraction,validateReps,...
0002     featurizeF,classifyF,selectInOneTrialF)
0003 %%%   This documentation needs to be updated.
0004 %%%
0005 %%% results = general(trials,classes,parameterSets,validateFraction,validateReps,...
0006 %%%    makeFeaturizeF,featurizeF,makeClassifierF,classifyF)
0007 %%%  trials: ntasks x ntrials cell array of EEG data matrices, each nchannels x nsamples
0008 %%%  classes: ntasks x ntrials matrix of class labels
0009 %%%  parameterSets: nParameterSets vector of structs containing named ...
0010 %%%    parameters, like  parameterSets(1).nlags
0011 %%%  validateFraction: fraction of training data samples to randomly hold ...
0012 %%%    out for validation samples
0013 %%%  validateReps: repeat partition of training data into tuning and ...
0014 %%%    validating subsets this many times and average the results
0015 %%%
0016 %%%  featurizeF: function to create parameters for making features and for
0017 %%%              transforming samples into features
0018 %%%
0019 %%%     To make feature parameters, must have form like
0020 %%%        CV = featurizeF(trials,CV,'make')
0021 %%%     where
0022 %%%          trials: ntasks x ntrials cell array of data
0023 %%%          CV.parms contains named fields like CV.parms.nlags
0024 %%%     returns
0025 %%%          CV: with fields to be used by next call to featurizeF
0026 %%%
0027 %%%     To transform samples to features, must have form like
0028 %%%        features = featurizeF(trials,CV)
0029 %%%     where
0030 %%%          trials: ntasks x ntrials cell array of data
0031 %%%          CV.parms contains named fields like CV.parms.nlags
0032 %%%          CV... other fields made by featurizeF(..,..,'make')
0033 %%%     returns
0034 %%%          features: cell array of features
0035 %%%
0036 %%%  classifyF: function to classify features
0037 %%%     Must have form like
0038 %%%          [fractionCorrect,classifier] = classifyF(traindata,CV,selectInOneTrialF,'make')
0039 %%%     where
0040 %%%          traindata: ntasks x ntrials cell array of featurized data
0041 %%%          CV contains fields for parameters like CV.parms.firstMode
0042 %%%          selectInOneTrialF: See below
0043 %%%     returns
0044 %%%          fractionCorrect: fraction validate samples correctly classified
0045 %%%          classifier: classifier parameters
0046 %%%
0047 %%%     Must have form like
0048 %%%          [fractionCorrect,classes] = classifyF(testdata,CV,selectInOneTrialF)
0049 %%%     where
0050 %%%          testdata: ntasks x ntrials cell array of featurized data
0051 %%%          CV contains fields for parameters like CV.parms.firstMode
0052 %%%             and CV.classifier
0053 %%%          selectInOneTrialF: See below.
0054 %%%     returns
0055 %%%          fractionCorrect: fraction validate samples correctly classified
0056 %%%          classes: classes for test data
0057 %%%
0058 %%%     selectInOneTrialF: Must have form like
0059 %%%         [X,Y] = oneTrialF(oneTrial,indices,oneTrialClass,CV);
0060 %%%         where oneTrial: is matrix of one trial of featurized data.
0061 %%%               indices: is vector of sample (column) indices
0062 %%%               oneTrialClass: is class for this trial
0063 %%%               CV.parms:  fields for use here, such as firstMode, nModes
0064 %%%         returns X: nSamples x nFeatures of samples
0065 %%%                 Y: nSamples x 1 class
0066 %%%
0067 %%%   Returns
0068 %%%     results.
0069 
0070 fprintf(1,'Given data from %d classes, each with %d trials.\n',...
0071     size(trials,1),size(trials,2));
0072 fprintf(1,' Using %s to define and create features\n',...
0073     char(featurizeF));
0074 fprintf(1,' and %s to make and use classifier.\n',...
0075     char(classifyF));
0076 fprintf(1,' and %s to collect train, validate, test data in classifier.\n',...
0077     char(selectInOneTrialF));
0078 fprintf(1,' Finding best of %d parameter sets using %.2f fraction\n',...
0079     length(parameterSets),validateFraction);
0080 fprintf(1,' of samples from each trial as validation set by averaging over\n');
0081 fprintf(1,' %d random partitionings.\n',validateReps);
0082 
0083 CV.trials = trials;
0084 CV.classes = classes;
0085 CV.validate.fraction = validateFraction;
0086 CV.validate.repetitions = validateReps;
0087 
0088 CV.cvresults = [];
0089 [v,names] = getfields(parameterSets(1));
0090 CV.cvresultsNames = {'TestTrial' names{:}};
0091 
0092 CV.testResults = {};
0093 
0094 %%% testi is test trial index
0095 ntrials = size(CV.trials,2);
0096 possibleTestTrials = 1:ntrials;
0097 
0098 %% testTrials set globally to control which trials to use as test
0099 %% added for running Jose Millan's data from competition 2005
0100 global testTrials
0101 
0102 if ~isempty(testTrials)
0103   possibleTestTrials = testTrials(:)
0104 end
0105 testTrials
0106 possibleTestTrials
0107 for testi = possibleTestTrials
0108 
0109   testi = testi'
0110   
0111   resultsOneTestTrial = [];
0112 
0113   fprintf(1,'Test trial %d\n',testi);
0114   
0115   %% Partition trials in cell array into train and test structures.
0116 
0117   train.trials = CV.trials(:,setdiff(1:ntrials,testi));
0118   train.classes = CV.classes(:,setdiff(1:ntrials,testi));
0119   test.trials = CV.trials(:,testi);
0120   test.classes = CV.classes(:,testi);
0121 size(test.trials)
0122 
0123   %% Find best values for feature and classifier parameters.
0124   %% Here we loop over possible values of nlags and mode. For each
0125   %% set of values, average validation classification results over
0126   %% validateReps random partitions of train data into train and
0127   %% validate sets.
0128   
0129   bestValCorrect = 0;
0130   
0131   for parmsi = 1:length(parameterSets)
0132     CV.parms = parameterSets(parmsi);
0133 
0134     % Print out parameter values
0135     [values,names] = getfields(CV.parms);
0136     for i = 1:length(names)
0137       if ~(isnan(values(i)) || prod(size(values(i))) > 1)
0138     fprintf(1,'%s= %g ',names{i},values(i));
0139       end
0140     end    
0141 
0142     resultsOneParmSet = [testi values];
0143     
0144     CV = featurizeF(train.trials,CV,'make'); 
0145     train.features = featurizeF(train.trials,CV); 
0146     
0147     for valReps = 1:CV.validate.repetitions
0148       CV.validateIndices = partition(train.features,CV.validate.fraction);
0149       [validateCorrect] = classifyF(train,CV,selectInOneTrialF,'make');
0150       fprintf(1,' %.2f',validateCorrect);
0151       resultsOneParmSet = [resultsOneParmSet validateCorrect];
0152     end
0153       avgcorr = mean(resultsOneParmSet(end-valReps+1:end));
0154     fprintf(1,' av %.2f\n',avgcorr);
0155     if avgcorr > bestValCorrect
0156       bestparms = CV.parms;
0157       bestValCorrect = avgcorr;
0158     end
0159     resultsOneTestTrial = [resultsOneTestTrial; resultsOneParmSet];
0160   end
0161 
0162   %% Set best  parameters for validation sets.
0163   
0164   CV.parms = bestparms;
0165 
0166   %% Use these best parameters to build classifer and apply to the
0167   %% test trial.
0168   
0169   CV = featurizeF(train.trials,CV,'make'); 
0170   train.features = featurizeF(train.trials,CV); 
0171   test.features = featurizeF(test.trials,CV);
0172 
0173   CV.validateIndices = [];
0174   [vc,classifier] = classifyF(train,CV,selectInOneTrialF,'make');
0175   %imagesc(X);drawnow;
0176   CV.classifier = classifier;
0177   [testerr,classes] = classifyF(test,CV,selectInOneTrialF);
0178   CV.testResults = {CV.testResults{:}, {CV.parms CV.classifier ...
0179       train.features test.features classes testerr}};
0180 
0181   CV.cvresults = [CV.cvresults; resultsOneTestTrial];
0182 
0183 end
0184 
0185 
0186 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0187 function validateIndices = partition(trials,validateFraction)
0188 
0189 [r,c] = size(trials);
0190 validateIndices = cell(r,c);
0191 for ri = 1:r
0192   for ci = 1:c
0193     num = size(trials{ri,ci},2);
0194     randorder = randperm(num);
0195     nv = round(num * validateFraction);
0196     validateIndices{ri,ci} = randorder(1:nv);
0197   end
0198 end
0199 
0200 
0201

Generated on Tue 07-Feb-2006 12:02:57 by m2html © 2003