diff --git a/balanceClasses.m b/balanceClasses.m index 8ec0c8c..54e7ba0 100644 --- a/balanceClasses.m +++ b/balanceClasses.m @@ -1,8 +1,8 @@ function [trainClasses,trainData]=balanceClasses(trainClasses,trainData,maxPerClass,noClasses) - if maxPerClass > min(histcounts(trainClasses,noClasses)) - maxPerClass=min(histcounts(trainClasses)); - warning('not enough Data per Class; set maxPerClass to %i', maxPerClass); - end +% if maxPerClass > min(histcounts(trainClasses,noClasses)) +% maxPerClass=min(histcounts(trainClasses)); +% warning('not enough Data per Class; set maxPerClass to %i', maxPerClass); +% end i=1; delPerClass=histcounts(trainClasses,noClasses)-maxPerClass; delIndex=zeros(sum(delPerClass),1); diff --git a/bashscripts/runOnEciton.bash b/bashscripts/runOnEciton.bash new file mode 100755 index 0000000..f6303de --- /dev/null +++ b/bashscripts/runOnEciton.bash @@ -0,0 +1,8 @@ +#!/bin/bash + +#cd /nfs/wsi/ti/messor/hohlochj/origData + +find -mindepth 2 -maxdepth 2 -type d > dirs.txt + +sed 's,\./,,g' -i dirs.txt +sed '/^[[:blank:]]*$/d' -i dirs.txt diff --git a/callAll.m b/callAll.m new file mode 100644 index 0000000..70ef2b4 --- /dev/null +++ b/callAll.m @@ -0,0 +1,21 @@ + +pathToFile='/nfs/wsi/ti/messor/hohlochj/origData/dirs.txt'; +pathToFile='/home/jph/Uni/masterarbeit/Block1_ReachingMovements/dirs.txt'; + +windowEMG=0.2; +windowEEG=1; +shift=0.2; +pburgOrder=50; +minEEGFreq=0; +maxEEGFreq=200; +%parpool(32); + +[subjects,numbers]=structForAllDays(pathToFile); +for i=1:size(subjects,2) + subject=subjects{i}; + for number=numbers(i,:) + %fprintf('%s%i\n',subject,number); + readEEG(subject,number,windowEMG,windowEEG,shift,5,7500,pburgOrder,minEEGFreq,maxEEGFreq); + svmEciton(subject,number,EEG,k,maxExpC,maxPerClass); + end +end \ No newline at end of file diff --git a/generateTrainingData.m b/generateTrainingData.m index cccd658..6cc8601 100644 --- a/generateTrainingData.m +++ b/generateTrainingData.m @@ -11,7 +11,7 @@ [E,F]= butter(2,[148 152]/(frequency/2),'stop'); parfor i=1:32 %filter single channel, w/o HEOG, Synchro and 0s - tempEEG(i,:,:)=shiftingPburg(filtfilt(E,F,filtfilt(C,D,filtfilt(A,B,signal(:,i)))),frequency,windowEEG,shift,pburgOrder,minEEGFreq,maxEEGFreq); + tempEEG(i,:,:)=shiftingPburg(filtfilt(double(E),double(F),filtfilt(double(C),double(D),filtfilt(double(A),double(B),double(signal(:,i))))),frequency,windowEEG,shift,pburgOrder,minEEGFreq,maxEEGFreq); %filtfilt stat filter end % TODO: 8-30Hz, pburg bei kurzen Fenstern (Ordnung: Je nach SamplingRate, bei 2500: 32-50, Alpha, Beta peaks sollten sichtbar sein) trainingDataEEG=permute(tempEEG,[2 1 3]); diff --git a/read.m b/read.m index 4aa1791..f7d1925 100644 --- a/read.m +++ b/read.m @@ -1,55 +1,42 @@ -close all -clear variables -%params -disp('start') -disp(datestr(datetime('now'))) -windowEMG=0.2; -windowEEG=1; -shift=0.2; -k=10; -maxExpC=5; -maxFile=5; -threshold=7500; -pburgOrder=32; -minEEGFreq=0; %Hz -maxEEGFreq=200; %Hz +function readEEG(subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq) + fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); -trainingDataEEGcell=cell(maxFile,1); -trainingDataEMGcell=cell(maxFile,1); -classesCell=cell(maxFile,1); + trainingDataEEGcell=cell(maxFile,1); + trainingDataEMGcell=cell(maxFile,1); + classesCell=cell(maxFile,1); -for i=1:maxFile - [sig, stat, params] = load_bcidat(sprintf('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/AO/AO_B1001/AO_B1S001R0%i.dat',i)); - [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq); - classesCell{i}=stat.StimulusCode; - fprintf('%ith file processed\n',i) -end + for i=1:maxFile + [sig, stat, params] = load_bcidat(sprintf('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/%s/%s_B100%i/AO_B1S001R0%i.dat',subject,subject,number,i)); + [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq); + classesCell{i}=stat.StimulusCode; + fprintf('%ith file processed\n',i) + end -clear sig + clear sig -trainingDataEEG=cell2mat(trainingDataEEGcell); -trainingDataEMG=cell2mat(trainingDataEMGcell); -classesMat=cell2mat(classesCell); -clear trainingDataEEGcell trainingDataEMGcell classesCell + trainingDataEEG=cell2mat(trainingDataEEGcell); + trainingDataEMG=cell2mat(trainingDataEMGcell); + classesMat=cell2mat(classesCell); + clear trainingDataEEGcell trainingDataEMGcell classesCell -classificationWithPause=classifyAccordingToEMG(trainingDataEEG, trainingDataEMG,classesMat,shift,params.SamplingRate.NumericValue,threshold); -clear classesMat + classificationWithPause=classifyAccordingToEMG(trainingDataEEG, trainingDataEMG,classesMat,shift,params.SamplingRate.NumericValue,threshold); + clear classesMat -smoothClassification=zeros(size(classificationWithPause)); -for i=1:size(classificationWithPause,1) - smoothClassification(i)=round(mode(classificationWithPause(max(i-2,1):min(i+2,end)))); -end + smoothClassification=zeros(size(classificationWithPause)); + for i=1:size(classificationWithPause,1) + smoothClassification(i)=round(mode(classificationWithPause(max(i-2,1):min(i+2,end)))); + end -clear classificationWithPause + clear classificationWithPause -trainingDataEEG=trainingDataEEG(smoothClassification~=-1,:,:); -trainingDataEMG=trainingDataEMG(smoothClassification~=-1,:); -classification=smoothClassification(smoothClassification~=-1); + trainingDataEEG=trainingDataEEG(smoothClassification~=-1,:,:); + trainingDataEMG=trainingDataEMG(smoothClassification~=-1,:); + classification=smoothClassification(smoothClassification~=-1); -clear smoothClassification i -save /home/Uni/masterarbeit/data/AO1200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat + clear smoothClassification i + save(sprintf('/nfs/wsi/ti/messor/hohlochj/matlabData/%s%i200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat',subject,number),trainingDataEEG,trainingDataEMG,classification); + - -disp('end') -disp(datestr(datetime('now'))) + fprintf('end read %s%i %s\n',subject,number,datestr(datetime('now'))); +end \ No newline at end of file diff --git a/readEEG.m b/readEEG.m new file mode 100644 index 0000000..ad4d469 --- /dev/null +++ b/readEEG.m @@ -0,0 +1,42 @@ +function readEEG(subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq) + + fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); + + trainingDataEEGcell=cell(maxFile,1); + trainingDataEMGcell=cell(maxFile,1); + classesCell=cell(maxFile,1); + + for i=1:maxFile + [sig, stat, params] = load_bcidat(sprintf('/home/jph/Uni/masterarbeit/Block1_ReachingMovements/%s/%s_B100%i/%s_B1S00%iR0%i.dat',subject,subject,number,subject,number,i)); + [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq); + classesCell{i}=stat.StimulusCode; + fprintf('%ith file processed\n',i) + end + + clear sig + + trainingDataEEG=cell2mat(trainingDataEEGcell); + trainingDataEMG=cell2mat(trainingDataEMGcell); + classesMat=cell2mat(classesCell); + clear trainingDataEEGcell trainingDataEMGcell classesCell + + classificationWithPause=classifyAccordingToEMG(trainingDataEEG, trainingDataEMG,classesMat,shift,params.SamplingRate.NumericValue,threshold); + clear classesMat + + smoothClassification=zeros(size(classificationWithPause)); + for i=1:size(classificationWithPause,1) + smoothClassification(i)=round(mode(classificationWithPause(max(i-2,1):min(i+2,end)))); + end + + clear classificationWithPause + + trainingDataEEG=trainingDataEEG(smoothClassification~=-1,:,:); + trainingDataEMG=trainingDataEMG(smoothClassification~=-1,:); + classification=smoothClassification(smoothClassification~=-1); + + clear smoothClassification i + save(sprintf('/nfs/wsi/ti/messor/hohlochj/matlabData/%s%i200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat',subject,number),[trainingDataEEG,trainingDataEMG,classification]); + + + fprintf('end read %s%i %s\n',subject,number,datestr(datetime('now'))); +end \ No newline at end of file diff --git a/readEEGEciton.m b/readEEGEciton.m new file mode 100644 index 0000000..beeac35 --- /dev/null +++ b/readEEGEciton.m @@ -0,0 +1,42 @@ +function readEEGEciton(subject,number,windowEMG,windowEEG,shift,maxFile,threshold,pburgOrder,minEEGFreq,maxEEGFreq) + + fprintf('start read %s%i %s\n',subject,number,datestr(datetime('now'))); + + trainingDataEEGcell=cell(maxFile,1); + trainingDataEMGcell=cell(maxFile,1); + classesCell=cell(maxFile,1); + + for i=1:maxFile + [sig, stat, params] = load_bcidat(sprintf('/nfs/wsi/ti/messor/hohlochj/origData/%s/%s_B100%i/AO_B1S001R0%i.dat',subject,subject,number,i)); + [trainingDataEEGcell{i},trainingDataEMGcell{i}]=generateTrainingData(sig,windowEMG,windowEEG,shift,params,pburgOrder,minEEGFreq,maxEEGFreq); + classesCell{i}=stat.StimulusCode; + fprintf('%ith file processed\n',i) + end + + clear sig + + trainingDataEEG=cell2mat(trainingDataEEGcell); + trainingDataEMG=cell2mat(trainingDataEMGcell); + classesMat=cell2mat(classesCell); + clear trainingDataEEGcell trainingDataEMGcell classesCell + + classificationWithPause=classifyAccordingToEMG(trainingDataEEG, trainingDataEMG,classesMat,shift,params.SamplingRate.NumericValue,threshold); + clear classesMat + + smoothClassification=zeros(size(classificationWithPause)); + for i=1:size(classificationWithPause,1) + smoothClassification(i)=round(mode(classificationWithPause(max(i-2,1):min(i+2,end)))); + end + + clear classificationWithPause + + trainingDataEEG=trainingDataEEG(smoothClassification~=-1,:,:); + trainingDataEMG=trainingDataEMG(smoothClassification~=-1,:); + classification=smoothClassification(smoothClassification~=-1); + + clear smoothClassification i + save(sprintf('/nfs/wsi/ti/messor/hohlochj/matlabData/%s%i200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat',subject,number),trainingDataEEG,trainingDataEMG,classification); + + + fprintf('end read %s%i %s\n',subject,number,datestr(datetime('now'))); +end \ No newline at end of file diff --git a/structForAllDays.m b/structForAllDays.m new file mode 100644 index 0000000..4b5d82f --- /dev/null +++ b/structForAllDays.m @@ -0,0 +1,21 @@ +function [names,numbers]=structForAllDays(dirs) + fileID=fopen(dirs); + text=textscan(fileID,'%s','Delimiter','\n'); + text=text{1}; + j=0; + k=0; + names=cell(1); + for i=1:size(text) + tmp=char(text(i)); + name=strcat(tmp(1:2)); + if (j~=0 && all(squeeze(names{j}==name))) + k=k+1; + numbers(j,k)=str2num(tmp(end)); + else + j=j+1; + names{j}=name; + k=1; + numbers(j,k)=str2num(tmp(end)); + end + end +end \ No newline at end of file diff --git a/svmEciton.m b/svmEciton.m index 40ee0ca..3413caf 100644 --- a/svmEciton.m +++ b/svmEciton.m @@ -1,44 +1,47 @@ -close all -clear variables -clc +function svmEciton(subject,number,EEG,k,maxExpC,maxPerClass) + %load(sprintf('/nfs/wsi/ti/messor/hohlochj/matlabData/%s%i200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat',subject,number)); + addpath('/nfs/wsi/ti/messor/hohlochj/libsvm/matlab'); + %k=2; + %maxExpC=0; % c\in {2^i|i=-maxExpC:1:maxExpC} -load('/nfs/wsi/ti/messor/hohlochj/matlabData/AO1200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat'); -addpath('/nfs/wsi/ti/messor/hohlochj/libsvm/matlab'); -%k=2; -%maxExpC=0; % c\in {2^i|i=-maxExpC:1:maxExpC} + %choose to estimate based on EEG or EMG + if EEG + trainingData=trainingDataEEG; + else + trainingData=trainingDataEMG; + end + clear trainingDataEEG; + clear trainingDataEMG; -%choose to estimate based on EEG or EMG -trainingData=trainingDataEMG; -clear trainingDataEEG; -clear trainingDataEMG; + accurancy=zeros(k,3); + maxC=zeros(k,1); + noClasses=size(unique(classification),1); + cm=zeros(noClasses); + randMap=randperm(size(trainingData,1)); + disp('startCV') + parfor i=1:k + leaveOut=trainingData(mod(randMap,k)==i-1,:,:); + leaveClasses=classification(mod(randMap,k)==i-1); + remaining=trainingData(mod(randMap,k)~=i-1,:,:); + remainingClasses=classification(mod(randMap,k)~=i-1); + disp(datestr(datetime('now'))) + fprintf('create %ith model\n',i) + [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,maxPerClass); + disp(datestr(datetime('now'))) -accurancy=zeros(k,3); -maxC=zeros(k,1); -noClasses=size(unique(classification),1); -cm=zeros(noClasses); -randMap=randperm(size(trainingData,1)); -disp('startCV') -parfor i=1:k - leaveOut=trainingData(mod(randMap,k)==i-1,:,:); - leaveClasses=classification(mod(randMap,k)==i-1); - remaining=trainingData(mod(randMap,k)~=i-1,:,:); - remainingClasses=classification(mod(randMap,k)~=i-1); - disp(datestr(datetime('now'))) - fprintf('create %ith model\n',i) - [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,1000); - disp(datestr(datetime('now'))) - - [predictions,accurancy(i,:),pvalues]=svmpredict(leaveClasses,leaveOut(:,:),model); - cm=cm+confusionmat(leaveClasses,predictions); %confusion matrix - %cf: for each cue what was the prediction (maybe colourCoded) + [predictions,accurancy(i,:),~]=svmpredict(leaveClasses,leaveOut(:,:),model); + cm=cm+confusionmat(leaveClasses,predictions); %confusion matrix + %cf: for each cue what was the prediction (maybe colourCoded) + end + meanAccurancy=mean(accurancy(:,1)) + + fig=figure; + cmScaled=zeros(size(cm)); + for i=1:size(cm,1) + cmScaled(i,:)=cm(i,:)/sum(cm(i,:)); + end + imagesc(cmScaled) + colorbar(); + saveas(fig,sprintf('/nfs/wsi/ti/messor/hohlochj/plots/%s%i%icm200ms1sPause.fig',subject,number,EEG),'fig'); + save(sprintf('/nfs/wsi/ti/messor/hohlochj/plots/%s%i%i200ms1sPause.fig',subject,number,EEG),[meanAccurancy,maxC,cmScaled]); end -meanAccurancy=mean(accurancy(:,1)) - -fig=figure; -cmScaled=zeros(size(cm)); -for i=1:size(cm,1) - cmScaled(i,:)=cm(i,:)/sum(cm(i,:)); -end -imagesc(cmScaled) -colorbar(); -saveas(fig,'/nfs/wsi/ti/messor/hohlochj/plots/cmEMG200ms1sPause.fig','fig'); diff --git a/svmEcitonEEG.m b/svmEcitonEEG.m deleted file mode 100644 index 5752e56..0000000 --- a/svmEcitonEEG.m +++ /dev/null @@ -1,44 +0,0 @@ -close all -clear variables -clc - -load('/nfs/wsi/ti/messor/hohlochj/matlabData/AO1200msWindowEMG1sWindowEEG200msShift1sPauseFreq0to200.mat'); -addpath('/nfs/wsi/ti/messor/hohlochj/libsvm/matlab'); -%k=2; -%maxExpC=0; % c\in {2^i|i=-maxExpC:1:maxExpC} - -%choose to estimate based on EEG or EMG -trainingData=trainingDataEEG; -clear trainingDataEEG; -clear trainingDataEMG; - -accurancy=zeros(k,3); -maxC=zeros(k,1); -noClasses=size(unique(classification),1); -cm=zeros(noClasses); -randMap=randperm(size(trainingData,1)); -disp('startCV') -parfor i=1:k - leaveOut=trainingData(mod(randMap,k)==i-1,:,:); - leaveClasses=classification(mod(randMap,k)==i-1); - remaining=trainingData(mod(randMap,k)~=i-1,:,:); - remainingClasses=classification(mod(randMap,k)~=i-1); - disp(datestr(datetime('now'))) - fprintf('create %ith model\n',i) - [model,maxC(i)]=kfoldCV(remainingClasses,remaining,k,maxExpC,1000); - disp(datestr(datetime('now'))) - - [predictions,accurancy(i,:),pvalues]=svmpredict(leaveClasses,leaveOut(:,:),model); - cm=cm+confusionmat(leaveClasses,predictions); %confusion matrix - %cf: for each cue what was the prediction (maybe colourCoded) -end -meanAccurancy=mean(accurancy(:,1)) - -fig=figure; -cmScaled=zeros(size(cm)); -for i=1:size(cm,1) - cmScaled(i,:)=cm(i,:)/sum(cm(i,:)); -end -imagesc(cmScaled) -colorbar(); -saveas(fig,'/nfs/wsi/ti/messor/hohlochj/plots/cmEMG200ms1sPause.fig','fig');