begin SOM implementation
Christoph Budziszewski

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