Christoph Budziszewski commited on 2009-04-07 15:07:27
Zeige 8 geänderte Dateien mit 137 Einfügungen und 20 Löschungen.
git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@172 83ab2cfd-5345-466c-8aeb-2b2739fb922d
| ... | ... |
@@ -133,14 +133,17 @@ switch task |
| 133 | 133 |
assignin('base','decode',decode);
|
| 134 | 134 |
case 'SOM' |
| 135 | 135 |
display('SOM');
|
| 136 |
- somopts = ''; |
|
| 137 |
- decode = som_combined_subject_batch(header,data,somopts); |
|
| 136 |
+ disp('not implemented')
|
|
| 137 |
+ |
|
| 138 |
+ case 'X-SOM' |
|
| 139 |
+ display('X-SOM');
|
|
| 140 |
+ somopts.size = [3 3]; |
|
| 141 |
+ somopts.lattice = 'rect'; |
|
| 142 |
+ decode = som_xsubject_performance(header,data,somopts); |
|
| 138 | 143 |
decode.header = header; |
| 139 | 144 |
assignin('base','decode',decode);
|
| 140 |
- case 'X-SOM' |
|
| 141 |
- disp('not implemented')
|
|
| 142 | 145 |
case 'FBS' |
| 143 |
- disp('this method is under high development.')
|
|
| 146 |
+ display('FBS');
|
|
| 144 | 147 |
fbsargs.svmopts = getSvmArgs(model,1); |
| 145 | 148 |
header.svmrnd = getSvmRnd(model); |
| 146 | 149 |
fbsargs.radius = getSearchlightRadius(model); |
| ... | ... |
@@ -1,7 +1,7 @@ |
| 1 | 1 |
function output = runFBSImageMaskMode(header,subjectdata,fbsargs) |
| 2 | 2 |
addpath('NIFTI_20090325');
|
| 3 | 3 |
|
| 4 |
-savePath = fullfile('output',sprintf('%s',date))
|
|
| 4 |
+savePath = fullfile('output',datestr(now,30));
|
|
| 5 | 5 |
mkdir(savePath); |
| 6 | 6 |
|
| 7 | 7 |
args = header.args; |
| ... | ... |
@@ -172,6 +172,7 @@ for s = 1:nSubjects |
| 172 | 172 |
|
| 173 | 173 |
end %for each timeslice |
| 174 | 174 |
display('rastering done');
|
| 175 |
+ display(sprintf('result images saved to %s',savePath));
|
|
| 175 | 176 |
|
| 176 | 177 |
elapsed{s}.decode = toc;
|
| 177 | 178 |
assignin('base','timing',elapsed);
|
| ... | ... |
@@ -1,12 +1,15 @@ |
| 1 | 1 |
%% subject loop |
| 2 | 2 |
function decode = som_combined_subject_batch(header,subjectdata,somOpts) |
| 3 | 3 |
|
| 4 |
+somOpts.size = [3 3]; |
|
| 5 |
+somOpts.lattice = 'rect'; |
|
| 6 |
+ |
|
| 4 | 7 |
addpath 'somtoolbox2'; |
| 5 | 8 |
|
| 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 |
|
| 9 |
+% nSubjects = numel(subjectdata); |
|
| 10 |
+% if(nSubjects < 2) |
|
| 11 |
+% error('SVMCrossVal:xsvmSubjectLoop:tooFewSubjects','You need at least 2 Subjects in this Across-Subject analysis!');
|
|
| 12 |
+% end |
|
| 10 | 13 |
|
| 11 | 14 |
RANDOMIZE_DATAPOINTS = 1; |
| 12 | 15 |
|
| ... | ... |
@@ -42,17 +45,22 @@ display(sprintf('%u -fold cross validation for %u timeslices.\n',nSubjects,size(
|
| 42 | 45 |
% pause |
| 43 | 46 |
|
| 44 | 47 |
for timeIndex = 1:timeLineEnd-timeLineStart+1 |
| 48 |
+ cross_value = []; |
|
| 49 |
+ for validationSubjectID = 1:nSubjects |
|
| 45 | 50 |
svm_train_label = []; |
| 46 | 51 |
svm_train_data = []; |
| 47 | 52 |
svm_validation_label = []; |
| 48 | 53 |
svm_validation_data = []; |
| 49 | 54 |
for subjectDataID = 1:nSubjects |
| 50 | 55 |
svmstruct = calculateSVMTables(timePointMatrix{subjectDataID},timeIndex);
|
| 56 |
+ if subjectDataID == validationSubjectID |
|
| 51 | 57 |
svm_validation_label = svmstruct.svmlabel; |
| 52 | 58 |
svm_validation_data = svmstruct.svmdata; |
| 59 |
+ else |
|
| 53 | 60 |
svm_train_label = [svm_train_label; svmstruct.svmlabel]; |
| 54 | 61 |
svm_train_data = [svm_train_data; svmstruct.svmdata]; |
| 55 | 62 |
end |
| 63 |
+ end |
|
| 56 | 64 |
|
| 57 | 65 |
if RANDOMIZE_DATAPOINTS |
| 58 | 66 |
rndindex = randperm(length(svm_train_label)); |
| ... | ... |
@@ -60,15 +68,13 @@ for timeIndex = 1:timeLineEnd-timeLineStart+1 |
| 60 | 68 |
svm_train_label = svm_train_label(rndindex); |
| 61 | 69 |
end |
| 62 | 70 |
|
| 63 |
- [sD sM] = train_som(svmlabel, svmdata, somOpts) |
|
| 71 |
+ [sD sM] = train_som(svm_train_label, svm_train_data, somOpts); |
|
| 64 | 72 |
|
| 65 |
-% [plabel accuracy dvalue] = svmpredict(svm_validation_label,svm_validation_data,svmmodel,''); |
|
| 66 |
- cross_value = [cross_value accuracy(1)]; |
|
| 73 |
+ performance = som_decode(sD, sM, svm_validation_data,svm_validation_label); |
|
| 67 | 74 |
|
| 68 |
- end |
|
| 75 |
+ cross_value = [cross_value performance]; |
|
| 69 | 76 |
decode.decodePerformance = [decode.decodePerformance; cross_value]; |
| 70 |
- |
|
| 71 | 77 |
end |
| 72 |
- |
|
| 73 |
-disp('decode done');
|
|
| 78 |
+ display('decode done');
|
|
| 74 | 79 |
end |
| 80 |
+ |
| ... | ... |
@@ -0,0 +1,6 @@ |
| 1 |
+function decode = som_decode(sD, sM, svm_validation_data,svm_validation_label) |
|
| 2 |
+% the number of hits in each map-unit. |
|
| 3 |
+ |
|
| 4 |
+sValD = som_data_struct(svm_validation_data,'label',num2str(svm_validation_label)); |
|
| 5 |
+h = som_hits(sM,sValD); |
|
| 6 |
+bmu = som_bmus(sM, sValD, 'best'); |
|
| 0 | 7 |
\ No newline at end of file |
| ... | ... |
@@ -0,0 +1,17 @@ |
| 1 |
+function [sD sM] = som_train(svmlabel, svmdata, somOptions) |
|
| 2 |
+ |
|
| 3 |
+som_size = somOptions.size; |
|
| 4 |
+som_lattice = somOptions.lattice; |
|
| 5 |
+ |
|
| 6 |
+display('SOM TRAINING');
|
|
| 7 |
+addpath 'somtoolbox2'; |
|
| 8 |
+sD = som_data_struct(svmdata,'label',num2str(svmlabel)); |
|
| 9 |
+assignin('base','sD',sD);
|
|
| 10 |
+sM = som_make(sD,'msize', som_size,'lattice', som_lattice); |
|
| 11 |
+ |
|
| 12 |
+sM = som_autolabel(sM,sD,'vote'); |
|
| 13 |
+ |
|
| 14 |
+assignin('base','sD',sD);
|
|
| 15 |
+assignin('base','sM',sM);
|
|
| 16 |
+display('type ''figure'' before visualisation');
|
|
| 17 |
+end |
|
| 0 | 18 |
\ No newline at end of file |
| ... | ... |
@@ -0,0 +1,79 @@ |
| 1 |
+%% subject loop |
|
| 2 |
+function decode = som_xsubject_performance(header,subjectdata,somOpts) |
|
| 3 |
+ |
|
| 4 |
+addpath 'somtoolbox2'; |
|
| 5 |
+ |
|
| 6 |
+nSubjects = numel(subjectdata); |
|
| 7 |
+if(nSubjects < 2) |
|
| 8 |
+ error('SVMCrossVal:somXSubjectPerformance: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 |
+ cross_value = []; |
|
| 46 |
+ for validationSubjectID = 1:nSubjects |
|
| 47 |
+ svm_train_label = []; |
|
| 48 |
+ svm_train_data = []; |
|
| 49 |
+ svm_validation_label = []; |
|
| 50 |
+ svm_validation_data = []; |
|
| 51 |
+ for subjectDataID = 1:nSubjects |
|
| 52 |
+ svmstruct = calculateSVMTables(timePointMatrix{subjectDataID},timeIndex);
|
|
| 53 |
+ if subjectDataID == validationSubjectID |
|
| 54 |
+ svm_validation_label = svmstruct.svmlabel; |
|
| 55 |
+ svm_validation_data = svmstruct.svmdata; |
|
| 56 |
+ else |
|
| 57 |
+ svm_train_label = [svm_train_label; svmstruct.svmlabel]; |
|
| 58 |
+ svm_train_data = [svm_train_data; svmstruct.svmdata]; |
|
| 59 |
+ end |
|
| 60 |
+ end |
|
| 61 |
+ |
|
| 62 |
+ if RANDOMIZE_DATAPOINTS |
|
| 63 |
+ rndindex = randperm(length(svm_train_label)); |
|
| 64 |
+ svm_train_data = svm_train_data(rndindex,:); |
|
| 65 |
+ svm_train_label = svm_train_label(rndindex); |
|
| 66 |
+ end |
|
| 67 |
+ |
|
| 68 |
+ [sD sM] = som_train(svm_train_label, svm_train_data, somOpts); |
|
| 69 |
+ |
|
| 70 |
+ performance = som_decode(sD, sM, svm_validation_data,svm_validation_label); |
|
| 71 |
+ |
|
| 72 |
+ cross_value = [cross_value performance]; |
|
| 73 |
+ end |
|
| 74 |
+ |
|
| 75 |
+ decode.decodePerformance = [decode.decodePerformance; cross_value]; |
|
| 76 |
+end |
|
| 77 |
+ display('decode done');
|
|
| 78 |
+end |
|
| 79 |
+ |
| ... | ... |
@@ -1,10 +1,15 @@ |
| 1 | 1 |
function [sD sM] = train_som(svmlabel, svmdata, somOptions) |
| 2 | 2 |
|
| 3 |
+som_size = somOptions.size; |
|
| 4 |
+som_lattice = somOptions.lattice; |
|
| 5 |
+ |
|
| 3 | 6 |
display('SOM TRAINING');
|
| 4 | 7 |
addpath 'somtoolbox2'; |
| 5 | 8 |
sD = som_data_struct(svmdata,'label',num2str(svmlabel)); |
| 6 | 9 |
assignin('base','sD',sD);
|
| 7 |
-sM = som_make(sD,'msize', [3 3],'lattice', 'hexa'); |
|
| 10 |
+sM = som_make(sD,'msize', som_size,'lattice', som_lattice); |
|
| 11 |
+ |
|
| 12 |
+sM = som_autolabel(sM,sD,'vote'); |
|
| 8 | 13 |
|
| 9 | 14 |
assignin('base','sD',sD);
|
| 10 | 15 |
assignin('base','sM',sM);
|
| ... | ... |
@@ -335,7 +335,7 @@ pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.4 0.5 0.4]); |
| 335 | 335 |
set(pSOM,'Title','SOM Classification'); |
| 336 | 336 |
set(pSOM,'BackgroundColor',basecolor); |
| 337 | 337 |
|
| 338 |
- model.txtSOMopts = createTextField(pSOM,[0 0.75 1 0.25],'4x3 rect'); |
|
| 338 |
+ model.txtSOMopts = createTextField(pSOM,[0 0.75 1 0.25],'3x3 rect'); |
|
| 339 | 339 |
set(model.txtSOMopts,'HorizontalAlignment','left'); |
| 340 | 340 |
set(model.txtSOMopts,'Enable','off'); |
| 341 | 341 |
|
| ... | ... |
@@ -351,7 +351,7 @@ pSOM = uipanel(parent,'Units','normalized','Position',[0.5 0.4 0.5 0.4]); |
| 351 | 351 |
btnRunXSOM = uicontrol(pSOM,'String','run SOM X-Subject validation',... |
| 352 | 352 |
'Units','normalized',... |
| 353 | 353 |
'Position',[0.0 0.0 1 0.25]); |
| 354 |
- set(btnRunXSOM,'Enable','off'); |
|
| 354 |
+ set(btnRunXSOM,'Enable','on'); |
|
| 355 | 355 |
|
| 356 | 356 |
pSearchlight = uipanel(parent,'Units','normalized','Position',[0.0 0.1 1 0.3]); |
| 357 | 357 |
set(pSearchlight,'Title','Spatiotemporal FB classification'); |
| 358 | 358 |