Christoph Budziszewski commited on 2009-03-16 14:41:06
Zeige 13 geänderte Dateien mit 113 Einfügungen und 119 Löschungen.
git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@151 83ab2cfd-5345-466c-8aeb-2b2739fb922d
| ... | ... |
@@ -21,8 +21,7 @@ timeline = header.timeline; |
| 21 | 21 |
|
| 22 | 22 |
PLOT_METHOD = SVMCROSSVAL_CROSSVAL_METHOD_DEF.svmcrossval; |
| 23 | 23 |
PLOT_METHOD = SVMCROSSVAL_CROSSVAL_METHOD_DEF.classPerformance; |
| 24 |
-% CROSSVAL_METHOD_DEF = inputStruct.CROSSVAL_METHOD_DEF; |
|
| 25 |
- |
|
| 24 |
+PLOT_METHOD = 'x-subject-val'; |
|
| 26 | 25 |
|
| 27 | 26 |
f = figure; |
| 28 | 27 |
subplot(2,1,1); |
| ... | ... |
@@ -71,6 +70,17 @@ timeline = header.timeline; |
| 71 | 70 |
|
| 72 | 71 |
plot(frameStart:frameEnd, mean(decodePerformance,2) ,'b','LineWidth',2); |
| 73 | 72 |
|
| 73 |
+ case 'x-subject-val' |
|
| 74 |
+ nSubjects = size(decodePerformance,2); |
|
| 75 |
+ for c = 1:nSubjects |
|
| 76 |
+ plot(frameStart:frameEnd, decodePerformance(:,c) ,[colorChooser(mod(c,nSubjects)+3) '-']); |
|
| 77 |
+ end |
|
| 78 |
+ |
|
| 79 |
+ plot(frameStart:frameEnd, mean(decodePerformance,2) ,'b','LineWidth',2); |
|
| 80 |
+ se = myStdErr(decodePerformance,2); |
|
| 81 |
+ plot(frameStart:frameEnd, mean(decodePerformance,2)+se ,'b:'); |
|
| 82 |
+ plot(frameStart:frameEnd, mean(decodePerformance,2)-se ,'b:'); |
|
| 83 |
+ |
|
| 74 | 84 |
end |
| 75 | 85 |
|
| 76 | 86 |
|
| ... | ... |
@@ -66,87 +66,6 @@ DEFAULT.wd = fullfile('d:','Analyze','Choice','24pilot');
|
| 66 | 66 |
assignin('base','model',model);
|
| 67 | 67 |
end |
| 68 | 68 |
|
| 69 |
-function model = mcb_cd(src,evnt,model) |
|
| 70 |
-disp('CD');
|
|
| 71 |
-directory_name = uigetdir(model.baseDir,'Select Study Base Directory ...'); |
|
| 72 |
-model.baseDir = directory_name; |
|
| 73 |
-model = scanDirs(model); |
|
| 74 |
-end |
|
| 75 |
- |
|
| 76 |
-function mcb_save(src,evnt,model) |
|
| 77 |
-disp('SAVE');
|
|
| 78 |
-baseDir = model.baseDir; |
|
| 79 |
-timeLine = getTimeLineParams(model); |
|
| 80 |
-classDefString = getClassDefString(model); |
|
| 81 |
-coordDefString = getCoordDefString(model); |
|
| 82 |
- |
|
| 83 |
-[file path] = uiputfile('*.mat','Save current Params ...',model.baseDir);
|
|
| 84 |
-save( fullfile(path,file),'baseDir','timeLine','classDefString','coordDefString') ; |
|
| 85 |
-end |
|
| 86 |
- |
|
| 87 |
-function model = mcb_load(src,evnt,model) |
|
| 88 |
-disp('LOAD');
|
|
| 89 |
-[file path] = uigetfile('*.mat','Load Params ...',model.baseDir);
|
|
| 90 |
-l = load(fullfile(path,file)); |
|
| 91 |
-% assignin('base','l',l);
|
|
| 92 |
-model = setTimeLineParams(model,l.timeLine); |
|
| 93 |
-model = setClassDefString(model,l.classDefString); |
|
| 94 |
-model = setCoordDefString(model,l.coordDefString); |
|
| 95 |
-model.baseDir = l.baseDir; |
|
| 96 |
-model = scanDirs(model); |
|
| 97 |
- |
|
| 98 |
-end |
|
| 99 |
- |
|
| 100 |
-function model = createSecondStepPanel(model,parent,DEFAULT,basecolor) |
|
| 101 |
- |
|
| 102 |
-pSVM = uipanel(parent,'Units','normalized','Position',[0 0.0 0.5 1]); |
|
| 103 |
- set(pSVM,'Title','SVM Classification'); |
|
| 104 |
- set(pSVM,'BackgroundColor',basecolor); |
|
| 105 |
- |
|
| 106 |
- model.txtSVMopts = createTextField(pSVM,[0 0.75 1 0.25],DEFAULT.svmoptstring); |
|
| 107 |
- set(model.txtSVMopts,'HorizontalAlignment','left'); |
|
| 108 |
- |
|
| 109 |
- model.txtSVMnfold = createTextField(pSVM,[0.0 0.50 0.5 0.25],DEFAULT.svmnfold); |
|
| 110 |
- createLabel(pSVM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
|
| 111 |
- |
|
| 112 |
-pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.0 0.5 1]); |
|
| 113 |
- set(pSOM,'Title','SOM Classification'); |
|
| 114 |
- set(pSOM,'BackgroundColor',basecolor); |
|
| 115 |
- |
|
| 116 |
- model.txtSOMopts = createTextField(pSOM,[0 0.75 1 0.25],'4x3 rect'); |
|
| 117 |
- set(model.txtSOMopts,'HorizontalAlignment','left'); |
|
| 118 |
- set(model.txtSOMopts,'Enable','off'); |
|
| 119 |
- |
|
| 120 |
- model.txtSOMnfold = createTextField(pSOM,[0.0 0.50 0.5 0.25],DEFAULT.svmnfold); |
|
| 121 |
- set(model.txtSOMnfold,'Enable','off'); |
|
| 122 |
- createLabel(pSOM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
|
| 123 |
- |
|
| 124 |
-% buttons |
|
| 125 |
- btnRunSVM = uicontrol(pSVM,'String','run SVM Crossvalidation',... |
|
| 126 |
- 'Units','normalized',... |
|
| 127 |
- 'Position',[0 0.25 1 0.25]); |
|
| 128 |
- set(btnRunSVM,'Callback',{@cbRunDecode,model,'SVM'}); % set here, because of model.
|
|
| 129 |
- set(btnRunSVM,'Enable','on'); |
|
| 130 |
- |
|
| 131 |
- btnRunXSVM = uicontrol(pSVM,'String','run SVM X-Subject validation',... |
|
| 132 |
- 'Units','normalized',... |
|
| 133 |
- 'Position',[0 0.0 1 0.25]); |
|
| 134 |
- set(btnRunXSVM,'Callback',{@cbRunDecode,model,'XSVM'}); % set here, because of model.
|
|
| 135 |
- set(btnRunXSVM,'Enable','on'); |
|
| 136 |
- |
|
| 137 |
- btnRunSOM = uicontrol(pSOM,'String','run SOM Crossvalidation',... |
|
| 138 |
- 'Units','normalized',... |
|
| 139 |
- 'Position',[0.0 0.25 1 0.25]); |
|
| 140 |
- set(btnRunSOM,'Callback',{@cbRunDecode,model,'SOM'}); % set here, because of model.
|
|
| 141 |
- set(btnRunSOM,'Enable','off'); |
|
| 142 |
- |
|
| 143 |
- btnRunXSOM = uicontrol(pSOM,'String','run SOM X-Subject validation',... |
|
| 144 |
- 'Units','normalized',... |
|
| 145 |
- 'Position',[0.0 0.0 1 0.25]); |
|
| 146 |
- set(btnRunXSOM,'Callback',{@cbRunDecode,model,'XSOM'}); % set here, because of model.
|
|
| 147 |
- set(btnRunXSOM,'Enable','off'); |
|
| 148 |
-end |
|
| 149 |
- |
|
| 150 | 69 |
function model = createFirstStepPanel(model,parent,DEFAULT) |
| 151 | 70 |
|
| 152 | 71 |
main_grid = cell(2,4); |
| ... | ... |
@@ -317,6 +236,58 @@ function model = createFirstStepPanel(model,parent,DEFAULT) |
| 317 | 236 |
set(btnRunButton3,'Enable','on'); |
| 318 | 237 |
end |
| 319 | 238 |
|
| 239 |
+function model = createSecondStepPanel(model,parent,DEFAULT,basecolor) |
|
| 240 |
+ |
|
| 241 |
+pSVM = uipanel(parent,'Units','normalized','Position',[0 0.0 0.5 1]); |
|
| 242 |
+ set(pSVM,'Title','SVM Classification'); |
|
| 243 |
+ set(pSVM,'BackgroundColor',basecolor); |
|
| 244 |
+ |
|
| 245 |
+ model.txtSVMopts = createTextField(pSVM,[0 0.75 1 0.25],DEFAULT.svmoptstring); |
|
| 246 |
+ set(model.txtSVMopts,'HorizontalAlignment','left'); |
|
| 247 |
+ |
|
| 248 |
+ model.txtSVMnfold = createTextField(pSVM,[0.0 0.50 0.5 0.25],DEFAULT.svmnfold); |
|
| 249 |
+ createLabel(pSVM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
|
| 250 |
+ |
|
| 251 |
+pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.0 0.5 1]); |
|
| 252 |
+ set(pSOM,'Title','SOM Classification'); |
|
| 253 |
+ set(pSOM,'BackgroundColor',basecolor); |
|
| 254 |
+ |
|
| 255 |
+ model.txtSOMopts = createTextField(pSOM,[0 0.75 1 0.25],'4x3 rect'); |
|
| 256 |
+ set(model.txtSOMopts,'HorizontalAlignment','left'); |
|
| 257 |
+ set(model.txtSOMopts,'Enable','off'); |
|
| 258 |
+ |
|
| 259 |
+ model.txtSOMnfold = createTextField(pSOM,[0.0 0.50 0.5 0.25],DEFAULT.svmnfold); |
|
| 260 |
+ set(model.txtSOMnfold,'Enable','off'); |
|
| 261 |
+ createLabel(pSOM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
|
| 262 |
+ |
|
| 263 |
+% buttons |
|
| 264 |
+ btnRunSVM = uicontrol(pSVM,'String','run SVM Crossvalidation',... |
|
| 265 |
+ 'Units','normalized',... |
|
| 266 |
+ 'Position',[0 0.25 1 0.25]); |
|
| 267 |
+ set(btnRunSVM,'Callback',{@cbRunDecode,model,'SVM'}); % set here, because of model.
|
|
| 268 |
+ set(btnRunSVM,'Enable','on'); |
|
| 269 |
+ |
|
| 270 |
+ btnRunXSVM = uicontrol(pSVM,'String','run SVM X-Subject validation',... |
|
| 271 |
+ 'Units','normalized',... |
|
| 272 |
+ 'Position',[0 0.0 1 0.25]); |
|
| 273 |
+ set(btnRunXSVM,'Callback',{@cbRunDecode,model,'XSVM'}); % set here, because of model.
|
|
| 274 |
+ set(btnRunXSVM,'Enable','on'); |
|
| 275 |
+ |
|
| 276 |
+ btnRunSOM = uicontrol(pSOM,'String','run SOM Crossvalidation',... |
|
| 277 |
+ 'Units','normalized',... |
|
| 278 |
+ 'Position',[0.0 0.25 1 0.25]); |
|
| 279 |
+ set(btnRunSOM,'Callback',{@cbRunDecode,model,'SOM'}); % set here, because of model.
|
|
| 280 |
+ set(btnRunSOM,'Enable','off'); |
|
| 281 |
+ |
|
| 282 |
+ btnRunXSOM = uicontrol(pSOM,'String','run SOM X-Subject validation',... |
|
| 283 |
+ 'Units','normalized',... |
|
| 284 |
+ 'Position',[0.0 0.0 1 0.25]); |
|
| 285 |
+ set(btnRunXSOM,'Callback',{@cbRunDecode,model,'XSOM'}); % set here, because of model.
|
|
| 286 |
+ set(btnRunXSOM,'Enable','off'); |
|
| 287 |
+end |
|
| 288 |
+ |
|
| 289 |
+ |
|
| 290 |
+ |
|
| 320 | 291 |
function cbRunPreprocessing(src,evnt,model,task) |
| 321 | 292 |
main(model,'pre',task); |
| 322 | 293 |
end |
| ... | ... |
@@ -325,6 +296,37 @@ function cbRunDecode(src,evnt,model,task) |
| 325 | 296 |
main(model,'decode',task); |
| 326 | 297 |
end |
| 327 | 298 |
|
| 299 |
+function model = mcb_cd(src,evnt,model) |
|
| 300 |
+disp('CD');
|
|
| 301 |
+directory_name = uigetdir(model.baseDir,'Select Study Base Directory ...'); |
|
| 302 |
+model.baseDir = directory_name; |
|
| 303 |
+model = scanDirs(model); |
|
| 304 |
+end |
|
| 305 |
+ |
|
| 306 |
+function mcb_save(src,evnt,model) |
|
| 307 |
+disp('SAVE');
|
|
| 308 |
+baseDir = model.baseDir; |
|
| 309 |
+timeLine = getTimeLineParams(model); |
|
| 310 |
+classDefString = getClassDefString(model); |
|
| 311 |
+coordDefString = getCoordDefString(model); |
|
| 312 |
+ |
|
| 313 |
+[file path] = uiputfile('*.mat','Save current Params ...',model.baseDir);
|
|
| 314 |
+save( fullfile(path,file),'baseDir','timeLine','classDefString','coordDefString') ; |
|
| 315 |
+end |
|
| 316 |
+ |
|
| 317 |
+function model = mcb_load(src,evnt,model) |
|
| 318 |
+disp('LOAD');
|
|
| 319 |
+[file path] = uigetfile('*.mat','Load Params ...',model.baseDir);
|
|
| 320 |
+l = load(fullfile(path,file)); |
|
| 321 |
+% assignin('base','l',l);
|
|
| 322 |
+model = setTimeLineParams(model,l.timeLine); |
|
| 323 |
+model = setClassDefString(model,l.classDefString); |
|
| 324 |
+model = setCoordDefString(model,l.coordDefString); |
|
| 325 |
+model.baseDir = l.baseDir; |
|
| 326 |
+model = scanDirs(model); |
|
| 327 |
+ |
|
| 328 |
+end |
|
| 329 |
+ |
|
| 328 | 330 |
function label = createLabel(parent, pos, labelText) |
| 329 | 331 |
label = uicontrol(parent,'Style','text','Units','normalized','String',labelText,'Position',pos); |
| 330 | 332 |
set(label,'HorizontalAlignment','left'); |
| ... | ... |
@@ -1,8 +1,12 @@ |
| 1 | 1 |
%% subject loop |
| 2 | 2 |
function decode = xsvm_subject_loop(header,subjectdata,svmopts) |
| 3 | 3 |
|
| 4 |
+addpath 'libsvm-mat-2.88-1'; |
|
| 5 |
+ |
|
| 4 | 6 |
nSubjects = numel(subjectdata); |
| 5 | 7 |
|
| 8 |
+RANDOMIZE_DATAPOINTS = 0; |
|
| 9 |
+ |
|
| 6 | 10 |
decode = struct; |
| 7 | 11 |
decode.decodePerformance = []; |
| 8 | 12 |
decode.rawTimeCourse = []; |
| ... | ... |
@@ -11,6 +15,7 @@ disp(sprintf('computinig additional datastructs for %u subjects',nSubjects));
|
| 11 | 15 |
|
| 12 | 16 |
timeline = header.timeline; |
| 13 | 17 |
|
| 18 |
+% TimePointMatrix |
|
| 14 | 19 |
for subjectDataID = 1:nSubjects |
| 15 | 20 |
currentSubject = subjectdata{subjectDataID};
|
| 16 | 21 |
timePointArgs.pst = currentSubject.pst; |
| ... | ... |
@@ -18,16 +23,18 @@ for subjectDataID = 1:nSubjects |
| 18 | 23 |
timePointArgs.eventList = header.classDef.eventMatrix; |
| 19 | 24 |
|
| 20 | 25 |
timePointMatrix{subjectDataID} = buildTimePointMatrix(timeline,timePointArgs);
|
| 26 |
+ |
|
| 27 |
+ decode.rawTimeCourse = [decode.rawTimeCourse currentSubject.pst]; |
|
| 21 | 28 |
end |
| 22 | 29 |
|
| 30 |
+% timeframe x-subject validation |
|
| 23 | 31 |
timeLineStart = timeline.frameShiftStart; |
| 24 | 32 |
timeLineEnd = timeline.frameShiftEnd; |
| 25 | 33 |
|
| 26 |
-addpath 'libsvm-mat-2.88-1'; |
|
| 27 |
- |
|
| 28 | 34 |
display(sprintf('%u -fold cross validation for %u timeslices.\n',nSubjects,size(1:timeLineEnd-timeLineStart+1,2)));
|
| 29 |
-disp(sprintf('Press ANY-Key to continue.\n Use Retrun if your Keyboard lacks the ANY-Key.'));
|
|
| 30 |
-pause |
|
| 35 |
+% disp(sprintf('Press ANY-Key to continue.\n Use Retrun if your Keyboard lacks the ANY-Key.'));
|
|
| 36 |
+% pause |
|
| 37 |
+ |
|
| 31 | 38 |
for timeIndex = 1:timeLineEnd-timeLineStart+1 |
| 32 | 39 |
cross_value = []; |
| 33 | 40 |
for validationSubjectID = 1:nSubjects |
| ... | ... |
@@ -46,8 +53,11 @@ for timeIndex = 1:timeLineEnd-timeLineStart+1 |
| 46 | 53 |
end |
| 47 | 54 |
end |
| 48 | 55 |
|
| 49 |
-% display(sprintf('Time %u: validation subject: %u, validation set size %g, training set size %g with %u subjects',...
|
|
| 50 |
-% timeIndex, validationSubjectID, numel(svm_validation_label), numel(svm_train_label),nSubjects-1)); |
|
| 56 |
+ if RANDOMIZE_DATAPOINTS |
|
| 57 |
+ rndindex = randperm(length(svm_train_label)); |
|
| 58 |
+ svm_train_data = svm_train_data(rndindex,:); |
|
| 59 |
+ svm_train_label = svm_train_label(rndindex); |
|
| 60 |
+ end |
|
| 51 | 61 |
|
| 52 | 62 |
svmmodel = svmtrain(svm_train_label,svm_train_data,svmopts); |
| 53 | 63 |
|
| ... | ... |
@@ -55,26 +65,7 @@ for timeIndex = 1:timeLineEnd-timeLineStart+1 |
| 55 | 65 |
cross_value = [cross_value accuracy(1)]; |
| 56 | 66 |
|
| 57 | 67 |
end |
| 58 |
- decode.decodePerformance = [decode.decodePerformance mean(cross_value)]; |
|
| 59 |
-% decode.rawTimeCourse = [decode.rawTimeCourse cross_value]; |
|
| 60 |
- |
|
| 61 |
-% decode.(namehelper) = calculateDecodePerformance(header,currentSubject,svmopts); |
|
| 62 |
-% |
|
| 63 |
-% display('... done');
|
|
| 64 |
-% display('restoring warnings');
|
|
| 65 |
-% warning(warning_state); |
|
| 66 |
-% |
|
| 67 |
-% decode.decodePerformance = [decode.decodePerformance decode.(namehelper).decodePerformance]; |
|
| 68 |
-% decode.rawTimeCourse = [decode.rawTimeCourse decode.(namehelper).rawTimeCourse]; |
|
| 69 |
- |
|
| 70 |
-% assignin('base','decode',decode);
|
|
| 71 |
- |
|
| 72 |
- % if RANDOMIZE_DATAPOINTS |
|
| 73 |
- % rndindex = randperm(length(svmlabel)); |
|
| 74 |
- % svmdata = svmdata(rndindex,:); |
|
| 75 |
- % svmlabel = svmlabel(rndindex); |
|
| 76 |
- % end |
|
| 77 |
- |
|
| 68 |
+ decode.decodePerformance = [decode.decodePerformance; cross_value]; |
|
| 78 | 69 |
|
| 79 | 70 |
end |
| 80 | 71 |
end |
| 81 | 72 |