Christoph Budziszewski commited on 2009-03-16 21:53:24
Zeige 3 geänderte Dateien mit 101 Einfügungen und 19 Löschungen.
git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@159 83ab2cfd-5345-466c-8aeb-2b2739fb922d
| ... | ... |
@@ -83,6 +83,11 @@ end |
| 83 | 83 |
function decode(model,task) |
| 84 | 84 |
preprocessedData = evalin('base','preprocessedData');
|
| 85 | 85 |
|
| 86 |
+if(~(isa(preprocessedData,'struct'))) |
|
| 87 |
+ display('you need to preprocess some data before this step');
|
|
| 88 |
+ return |
|
| 89 |
+end |
|
| 90 |
+ |
|
| 86 | 91 |
header = preprocessedData.header; |
| 87 | 92 |
header.frameShift = getFrameShiftParams(model); |
| 88 | 93 |
data = preprocessedData.subjectdata; |
| ... | ... |
@@ -102,8 +107,11 @@ switch task |
| 102 | 107 |
decode.header = header; |
| 103 | 108 |
assignin('base','decode',decode);
|
| 104 | 109 |
case 'SOM' |
| 105 |
- disp('not implemented')
|
|
| 106 |
- |
|
| 110 |
+ display('SOM');
|
|
| 111 |
+ somopts = ''; |
|
| 112 |
+ decode = som_combined_subject_batch(header,data,somopts); |
|
| 113 |
+ decode.header = header; |
|
| 114 |
+ assignin('base','decode',decode);
|
|
| 107 | 115 |
case 'X-SOM' |
| 108 | 116 |
disp('not implemented')
|
| 109 | 117 |
|
| ... | ... |
@@ -0,0 +1,74 @@ |
| 1 |
+%% subject loop |
|
| 2 |
+function decode = som_combined_subject_batch(header,subjectdata,somOpts) |
|
| 3 |
+ |
|
| 4 |
+addpath 'somtoolbox2'; |
|
| 5 |
+ |
|
| 6 |
+nSubjects = numel(subjectdata); |
|
| 7 |
+if(nSubjects < 2) |
|
| 8 |
+ error('SVMCrossVal:xsvmSubjectLoop:tooFewSubjects','You need at least 2 Subjects in this Across-Subject analysis!');
|
|
| 9 |
+end |
|
| 10 |
+ |
|
| 11 |
+RANDOMIZE_DATAPOINTS = 1; |
|
| 12 |
+ |
|
| 13 |
+decode = struct; |
|
| 14 |
+decode.decodePerformance = []; |
|
| 15 |
+decode.rawTimeCourse = []; |
|
| 16 |
+ |
|
| 17 |
+disp(sprintf('computinig additional datastructs for %u subjects',nSubjects));
|
|
| 18 |
+ |
|
| 19 |
+timeline = header.timeline; |
|
| 20 |
+timeline.frameShiftStart = header.frameShift.frameShiftStart; |
|
| 21 |
+timeline.frameShiftEnd = header.frameShift.frameShiftEnd; |
|
| 22 |
+timeline.decodeDuration = header.frameShift.decodeDuration; |
|
| 23 |
+ |
|
| 24 |
+% TimePointMatrix |
|
| 25 |
+for subjectDataID = 1:nSubjects |
|
| 26 |
+ currentSubject = subjectdata{subjectDataID};
|
|
| 27 |
+ timePointArgs.pst = currentSubject.pst; |
|
| 28 |
+ timePointArgs.labelMap = LabelMap(header.classDef.labelCells,header.classDef.conditionCells); |
|
| 29 |
+ timePointArgs.eventList = header.classDef.eventMatrix; |
|
| 30 |
+ |
|
| 31 |
+ timePointMatrix{subjectDataID} = buildTimePointMatrix(timeline,timePointArgs);
|
|
| 32 |
+ |
|
| 33 |
+ decode.rawTimeCourse = [decode.rawTimeCourse currentSubject.pst]; |
|
| 34 |
+end |
|
| 35 |
+ |
|
| 36 |
+% timeframe x-subject validation |
|
| 37 |
+timeLineStart = timeline.frameShiftStart; |
|
| 38 |
+timeLineEnd = timeline.frameShiftEnd; |
|
| 39 |
+ |
|
| 40 |
+display(sprintf('%u -fold cross validation for %u timeslices.\n',nSubjects,size(1:timeLineEnd-timeLineStart+1,2)));
|
|
| 41 |
+% disp(sprintf('Press ANY-Key to continue.\n Use Retrun if your Keyboard lacks the ANY-Key.'));
|
|
| 42 |
+% pause |
|
| 43 |
+ |
|
| 44 |
+for timeIndex = 1:timeLineEnd-timeLineStart+1 |
|
| 45 |
+ svm_train_label = []; |
|
| 46 |
+ svm_train_data = []; |
|
| 47 |
+ svm_validation_label = []; |
|
| 48 |
+ svm_validation_data = []; |
|
| 49 |
+ for subjectDataID = 1:nSubjects |
|
| 50 |
+ svmstruct = calculateSVMTables(timePointMatrix{subjectDataID},timeIndex);
|
|
| 51 |
+ svm_validation_label = svmstruct.svmlabel; |
|
| 52 |
+ svm_validation_data = svmstruct.svmdata; |
|
| 53 |
+ svm_train_label = [svm_train_label; svmstruct.svmlabel]; |
|
| 54 |
+ svm_train_data = [svm_train_data; svmstruct.svmdata]; |
|
| 55 |
+ end |
|
| 56 |
+ |
|
| 57 |
+ if RANDOMIZE_DATAPOINTS |
|
| 58 |
+ rndindex = randperm(length(svm_train_label)); |
|
| 59 |
+ svm_train_data = svm_train_data(rndindex,:); |
|
| 60 |
+ svm_train_label = svm_train_label(rndindex); |
|
| 61 |
+ end |
|
| 62 |
+ |
|
| 63 |
+ [sD sM] = train_som(svmlabel, svmdata, somOpts) |
|
| 64 |
+ |
|
| 65 |
+% [plabel accuracy dvalue] = svmpredict(svm_validation_label,svm_validation_data,svmmodel,''); |
|
| 66 |
+ cross_value = [cross_value accuracy(1)]; |
|
| 67 |
+ |
|
| 68 |
+ end |
|
| 69 |
+ decode.decodePerformance = [decode.decodePerformance; cross_value]; |
|
| 70 |
+ |
|
| 71 |
+end |
|
| 72 |
+ |
|
| 73 |
+disp('decode done');
|
|
| 74 |
+end |
| ... | ... |
@@ -319,11 +319,20 @@ pSVM = uipanel(parent,'Units','normalized','Position',[0 0.4 0.5 0.4]); |
| 319 | 319 |
model.txtSVMnfold = createTextField(pSVM,[0.0 0.66 0.5 0.16],DEFAULT.svmnfold); |
| 320 | 320 |
createLabel(pSVM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
| 321 | 321 |
|
| 322 |
- model.chkSVMrnd = uicontrol(pSVM,'Style','checkbox','Units','normalized','Position',[0.1 0.50 1 0.16]); |
|
| 322 |
+ model.chkSVMrnd = uicontrol(pSVM,'Style','checkbox','Units','normalized','Position',[0.1 0.50 0.9 0.16]); |
|
| 323 | 323 |
set(model.chkSVMrnd,'String','Randomize Datapoints'); |
| 324 | 324 |
set(model.chkSVMrnd,'BackgroundColor','w'); |
| 325 | 325 |
set(model.chkSVMrnd,'Value',DEFAULT.svmrnd); |
| 326 | 326 |
|
| 327 |
+ btnRunSVM = uicontrol(pSVM,'String','run batchmode SVM Crossvalidation',... |
|
| 328 |
+ 'Units','normalized',... |
|
| 329 |
+ 'Position',[0 0.25 1 0.25]); |
|
| 330 |
+ set(btnRunSVM,'Enable','on'); |
|
| 331 |
+ |
|
| 332 |
+ btnRunXSVM = uicontrol(pSVM,'String','run SVM X-Subject validation',... |
|
| 333 |
+ 'Units','normalized',... |
|
| 334 |
+ 'Position',[0 0.0 1 0.25]); |
|
| 335 |
+ set(btnRunXSVM,'Enable','on'); |
|
| 327 | 336 |
|
| 328 | 337 |
pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.4 0.5 0.4]); |
| 329 | 338 |
set(pSOM,'Title','SOM Classification'); |
| ... | ... |
@@ -337,30 +346,21 @@ pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.4 0.5 0.4]); |
| 337 | 346 |
set(model.txtSOMnfold,'Enable','off'); |
| 338 | 347 |
createLabel(pSOM,[0.5 0.50 0.5 0.25 ],'-Fold CrossVal'); |
| 339 | 348 |
|
| 340 |
-% buttons |
|
| 341 |
- btnRunSVM = uicontrol(pSVM,'String','run SVM Crossvalidation',... |
|
| 342 |
- 'Units','normalized',... |
|
| 343 |
- 'Position',[0 0.25 1 0.25]); |
|
| 344 |
- set(btnRunSVM,'Callback',{@cbRunDecode,model,'SVM'}); % set here, because of model.
|
|
| 345 |
- set(btnRunSVM,'Enable','on'); |
|
| 346 |
- |
|
| 347 |
- btnRunXSVM = uicontrol(pSVM,'String','run SVM X-Subject validation',... |
|
| 348 |
- 'Units','normalized',... |
|
| 349 |
- 'Position',[0 0.0 1 0.25]); |
|
| 350 |
- set(btnRunXSVM,'Callback',{@cbRunDecode,model,'XSVM'}); % set here, because of model.
|
|
| 351 |
- set(btnRunXSVM,'Enable','on'); |
|
| 352 |
- |
|
| 353 | 349 |
btnRunSOM = uicontrol(pSOM,'String','run SOM Crossvalidation',... |
| 354 | 350 |
'Units','normalized',... |
| 355 | 351 |
'Position',[0.0 0.25 1 0.25]); |
| 356 |
- set(btnRunSOM,'Callback',{@cbRunDecode,model,'SOM'}); % set here, because of model.
|
|
| 357 |
- set(btnRunSOM,'Enable','off'); |
|
| 352 |
+ set(btnRunSOM,'Enable','on'); |
|
| 358 | 353 |
|
| 359 | 354 |
btnRunXSOM = uicontrol(pSOM,'String','run SOM X-Subject validation',... |
| 360 | 355 |
'Units','normalized',... |
| 361 | 356 |
'Position',[0.0 0.0 1 0.25]); |
| 362 |
- set(btnRunXSOM,'Callback',{@cbRunDecode,model,'XSOM'}); % set here, because of model.
|
|
| 363 | 357 |
set(btnRunXSOM,'Enable','off'); |
| 358 |
+ |
|
| 359 |
+% button callbacks set here, because of model. |
|
| 360 |
+ set(btnRunSVM, 'Callback',{@cbRunDecode,model,'SVM'});
|
|
| 361 |
+ set(btnRunXSVM,'Callback',{@cbRunDecode,model,'XSVM'});
|
|
| 362 |
+ set(btnRunSOM, 'Callback',{@cbRunDecode,model,'SOM'});
|
|
| 363 |
+ set(btnRunXSOM,'Callback',{@cbRunDecode,model,'XSOM'});
|
|
| 364 | 364 |
end |
| 365 | 365 |
|
| 366 | 366 |
function model = createVisualStepPanel(model,parent,DEFAULT) |
| 367 | 367 |