TEAP (Toolbox for Emotion Analysis using Physiological Signals) doc
train_and_test_deap.m
Go to the documentation of this file.
1 clear
2 clc
3 close all
4 %uupdate the follosing path to match your local ones
5 addpath('machine_learning_codes/');
6 load('DEAP/physio_data/deap_features.mat')
7 ctr = 0;
8 for part = 1:32
9  for trial = 1:40
10  %if the feedback record is empty the trial was missing so skip it
11  if isempty(features(part,trial).feedback)
12  continue
13  end
14  ctr = ctr+1;
15  EEG_feats(ctr,:) = features(part,trial).EEG_feats(:)';
16  periph_feats(ctr,:) = [features(part,trial).EMG_feats(:)' ...
17  features(part,trial).GSR_feats features(part,trial).RES_feats ...
18  features(part,trial).BVP_feats];
19  part_vect(ctr) = part;
20  trial_vect(ctr) = trial;
21 
22  % self rported arousal and valence which was not used in any of the
23  % original articles
24  %Soleymani, Mohammad, et al. "Continuous emotion detection in response to music videos." Automatic Face & Gesture Recognition and Workshops (FG 2011), 2011 IEEE International Conference on. IEEE, 2011.
25  %centered for regression
26  arousal_reported(ctr) = (features(part,trial).feedback.felt_arousal-5);
27  valence_reported(ctr) = (features(part,trial).feedback.felt_valence-5);
28  dominance_reported(ctr) = (features(part,trial).feedback.felt_dominance-5);
29  liking_reported(ctr) = (features(part,trial).feedback.felt_liking-5);
30 
31  %translation of reported keywords to two levels of arousal and
32  %valence and likability
33  %Koelstra, Sander, et al. "Deap: A database for emotion analysis; using physiological signals." Affective Computing, IEEE Transactions on 3.1 (2012): 18-31.
34  arousal_feltclass(ctr) = (features(part,trial).feedback.felt_arousal>5)+1; % 1 for low and 2 for high
35  valence_feltclass(ctr) = (features(part,trial).feedback.felt_valence>5)+1; % 1 for low and 2 for high
36  dominance_feltclass(ctr) = (features(part,trial).feedback.felt_dominance>5)+1; % 1 for low and 2 for high
37  liking_feltclass(ctr) = (features(part,trial).feedback.felt_liking>5)+1; % 1 for low and 2 for high
38  end
39  %normalize per participant
40  EEG_feats(part_vect==part,:) = zscore(EEG_feats(part_vect==part,:));
41  periph_feats(part_vect==part,:) = zscore(periph_feats(part_vect==part,:));
42 
43 end
44 parameters.verbose = false;
45 
46 parameters.normalize = 3;
47 parameters.nbClasses = 2;
48 parameters.lower_limit = -0.5;
49 parameters.upper_limit = 0.5;
50 parameters.grid_search = true;
51 parameters.featSelection = 'Fisher';
52 parameters.classifier = 'diaglinear';
53 parameters.cross_validation = 'leave-one-out';
54 %ignore the nan peripheral features
55 periph_feats(isnan(periph_feats))=0;
56 for subject = 1:32
57  idx = part_vect ==subject;
58  if parameters.verbose
59  fprintf('Classifying samples from subject %d\n',subject);
60 
61  fprintf('EEG signals\n');
62  end
63  %EEG cross validation arousal reported binary class
64  [estimated_self_arousal_EEG{subject}, scores_self_arousal_EEG{subject}, evals_self_arousal_EEG{subject}] = ...
65  cross_validation_module(EEG_feats(idx,:), arousal_feltclass(idx), [], parameters);
66 
67  %EEG cross validation valence reported binary class
68  [estimated_self_valence_EEG{subject}, scores_self_valence_EEG{subject}, evals_self_valence_EEG{subject}] = ...
69  cross_validation_module(EEG_feats(idx,:), valence_feltclass(idx), [], parameters);
70  %EEG cross validation dominance reported binary class
71  [estimated_self_dominance_EEG{subject}, scores_self_dominance_EEG{subject}, evals_self_dominance_EEG{subject}] = ...
72  cross_validation_module(EEG_feats(idx,:), dominance_feltclass(idx), [], parameters);
73  %EEG cross validation liking reported binary class
74  [estimated_self_liking_EEG{subject}, scores_self_liking_EEG{subject}, evals_self_liking_EEG{subject}] = ...
75  cross_validation_module(EEG_feats(idx,:), liking_feltclass(idx), [], parameters);
76  if parameters.verbose
77  fprintf('Peripheral signals signals\n');
78  end
79  %Peripheral cross validation arousal reported binary class
80  [estimated_self_arousal_periph{subject}, scores_self_arousal_periph{subject}, evals_self_arousal_periph{subject}] = ...
81  cross_validation_module(periph_feats(idx,:), arousal_feltclass(idx), [], parameters);
82 
83  %Peripheral cross validation valence reported binary class
84  [estimated_self_valence_periph{subject}, scores_self_valence_periph{subject}, evals_self_valence_periph{subject}] = ...
85  cross_validation_module(periph_feats(idx,:), valence_feltclass(idx), [], parameters);
86  %Peripheral cross validation dominance reported binary class
87  [estimated_self_dominance_periph{subject}, scores_self_dominance_periph{subject}, evals_self_dominance_periph{subject}] = ...
88  cross_validation_module(periph_feats(idx,:), dominance_feltclass(idx), [], parameters);
89  %Peripheral cross validation liking reported binary class
90  [estimated_self_liking_periph{subject}, scores_self_liking_periph{subject}, evals_self_liking_periph{subject}] = ...
91  cross_validation_module(periph_feats(idx,:), liking_feltclass(idx), [], parameters);
92  f1s_self_arousal_EEG(subject) = mean(evals_self_arousal_EEG{subject}.f1s);
93  f1s_self_valence_EEG(subject) = mean(evals_self_valence_EEG{subject}.f1s);
94  f1s_self_dominance_EEG(subject) = mean(evals_self_dominance_EEG{subject}.f1s);
95  f1s_self_liking_EEG(subject) = mean(evals_self_liking_EEG{subject}.f1s);
96 
97  cr_self_arousal_EEG(subject) = evals_self_arousal_EEG{subject}.classification_rate;
98  cr_self_valence_EEG(subject) = evals_self_valence_EEG{subject}.classification_rate;
99  cr_self_dominance_EEG(subject) = evals_self_dominance_EEG{subject}.classification_rate;
100  cr_self_liking_EEG(subject) = evals_self_liking_EEG{subject}.classification_rate;
101 
102  f1s_self_arousal_periph(subject) = mean(evals_self_arousal_periph{subject}.f1s);
103  f1s_self_valence_periph(subject) = mean(evals_self_valence_periph{subject}.f1s);
104  f1s_self_dominance_periph(subject) = mean(evals_self_dominance_periph{subject}.f1s);
105  f1s_self_liking_periph(subject) = mean(evals_self_liking_periph{subject}.f1s);
106 
107  cr_self_arousal_periph(subject) = evals_self_arousal_periph{subject}.classification_rate;
108  cr_self_valence_periph(subject) = evals_self_valence_periph{subject}.classification_rate;
109  cr_self_dominance_periph(subject) = evals_self_dominance_periph{subject}.classification_rate;
110  cr_self_liking_periph(subject) = evals_self_liking_periph{subject}.classification_rate;
111 
112 
113 end
114 
115 
116 
117 
118 fprintf('EEG deap paper eq. arousal results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
119  mean(cr_self_arousal_EEG), std(cr_self_arousal_EEG), mean(f1s_self_arousal_EEG), std(f1s_self_arousal_EEG));
120 
121 fprintf('EEG deap paper eq. valence results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
122  mean(cr_self_valence_EEG), std(cr_self_valence_EEG), mean(f1s_self_valence_EEG), std(f1s_self_valence_EEG));
123 
124 fprintf('EEG deap paper eq. dominance results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
125  mean(cr_self_dominance_EEG), std(cr_self_dominance_EEG), mean(f1s_self_dominance_EEG), std(f1s_self_dominance_EEG));
126 
127 fprintf('EEG deap paper eq. liking results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
128  mean(cr_self_liking_EEG), std(cr_self_liking_EEG), mean(f1s_self_liking_EEG), std(f1s_self_liking_EEG));
129 
130 
131 
132 fprintf('periph deap paper eq. arousal results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
133  mean(cr_self_arousal_periph), std(cr_self_arousal_periph), mean(f1s_self_arousal_periph), std(f1s_self_arousal_periph));
134 
135 fprintf('periph deap paper eq. valence results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
136  mean(cr_self_valence_periph), std(cr_self_valence_periph), mean(f1s_self_valence_periph), std(f1s_self_valence_periph));
137 
138 fprintf('periph deap paper eq. dominance results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
139  mean(cr_self_dominance_periph), std(cr_self_dominance_periph), mean(f1s_self_dominance_periph), std(f1s_self_dominance_periph));
140 
141 fprintf('periph deap paper eq. liking results recognition rate = %1.2f(%1.2f) averaged F1 = %1.2f(%1.2f)\n', ...
142  mean(cr_self_liking_periph), std(cr_self_liking_periph), mean(f1s_self_liking_periph), std(f1s_self_liking_periph));
143 
144 
145 
146 
147 
148 save results_DEAP evals_self_arousal_EEG evals_self_valence_EEG ...
149  evals_self_dominance_EEG evals_self_liking_EEG evals_self_arousal_periph ...
150  evals_self_valence_periph evals_self_dominance_periph evals_self_liking_periph
151 
152 
153 
154 
155 parameters.normalize = 3;
156 %regression
157 parameters.nbClasses = -1;
158 parameters.lower_limit = -0.5;
159 parameters.upper_limit = 0.5;
160 parameters.grid_search = true;
161 parameters.featSelection = 'none';
162 parameters.classifier = 'ridge_reg';
163 parameters.cross_validation = 'leave-one-out';
164 for subject = 1:32
165  if parameters.verbose
166  fprintf('Regression for samples from subject %d\n',subject);
167 
168  fprintf('EEG signals\n');
169  end
170  idx = part_vect ==subject;
171  %EEG cross validation arousal reported binary class
172  [estimated_self_arousal_EEG{subject}, scores_self_arousal_EEG{subject}, evals_self_arousal_EEG{subject}] = ...
173  cross_validation_module(EEG_feats(idx,:), arousal_reported(idx), [], parameters);
174 
175  %EEG cross validation valence reported binary class
176  [estimated_self_valence_EEG{subject}, scores_self_valence_EEG{subject}, evals_self_valence_EEG{subject}] = ...
177  cross_validation_module(EEG_feats(idx,:), valence_reported(idx), [], parameters);
178  %EEG cross validation dominance reported binary class
179  [estimated_self_dominance_EEG{subject}, scores_self_dominance_EEG{subject}, evals_self_dominance_EEG{subject}] = ...
180  cross_validation_module(EEG_feats(idx,:), dominance_reported(idx), [], parameters);
181  %EEG cross validation liking reported binary class
182  [estimated_self_liking_EEG{subject}, scores_self_liking_EEG{subject}, evals_self_liking_EEG{subject}] = ...
183  cross_validation_module(EEG_feats(idx,:), liking_reported(idx), [], parameters);
184 
185  if parameters.verbose
186  fprintf('Peripheral signals\n');
187  end
188  %Peripheral cross validation arousal reported binary class
189  [estimated_self_arousal_periph{subject}, scores_self_arousal_periph{subject}, evals_self_arousal_periph{subject}] = ...
190  cross_validation_module(periph_feats(idx,:), arousal_reported(idx), [], parameters);
191 
192  %Peripheral cross validation valence reported binary class
193  [estimated_self_valence_periph{subject}, scores_self_valence_periph{subject}, evals_self_valence_periph{subject}] = ...
194  cross_validation_module(periph_feats(idx,:), valence_reported(idx), [], parameters);
195  %Peripheral cross validation dominance reported binary class
196  [estimated_self_dominance_periph{subject}, scores_self_dominance_periph{subject}, evals_self_dominance_periph{subject}] = ...
197  cross_validation_module(periph_feats(idx,:), dominance_reported(idx), [], parameters);
198  %Peripheral cross validation liking reported binary class
199  [estimated_self_liking_periph{subject}, scores_self_liking_periph{subject}, evals_self_liking_periph{subject}] = ...
200  cross_validation_module(periph_feats(idx,:), liking_reported(idx), [], parameters);
201  RMSE_self_arousal_EEG(subject) = evals_self_arousal_EEG{subject}.RMSE;
202  RMSE_self_valence_EEG(subject) = evals_self_valence_EEG{subject}.RMSE;
203  RMSE_self_dominance_EEG(subject) = evals_self_dominance_EEG{subject}.RMSE;
204  RMSE_self_liking_EEG(subject) = evals_self_liking_EEG{subject}.RMSE;
205 
206  MAE_self_arousal_EEG(subject) = evals_self_arousal_EEG{subject}.MAE;
207  MAE_self_valence_EEG(subject) = evals_self_valence_EEG{subject}.MAE;
208  MAE_self_dominance_EEG(subject) = evals_self_dominance_EEG{subject}.MAE;
209  MAE_self_liking_EEG(subject) = evals_self_liking_EEG{subject}.MAE;
210 
211  RMSE_self_arousal_periph(subject) = evals_self_arousal_periph{subject}.RMSE;
212  RMSE_self_valence_periph(subject) = evals_self_valence_periph{subject}.RMSE;
213  RMSE_self_dominance_periph(subject) = evals_self_dominance_periph{subject}.RMSE;
214  RMSE_self_liking_periph(subject) = evals_self_liking_periph{subject}.RMSE;
215 
216  MAE_self_arousal_periph(subject) = evals_self_arousal_periph{subject}.MAE;
217  MAE_self_valence_periph(subject) = evals_self_valence_periph{subject}.MAE;
218  MAE_self_dominance_periph(subject) = evals_self_dominance_periph{subject}.MAE;
219  MAE_self_liking_periph(subject) = evals_self_liking_periph{subject}.MAE;
220 
221 
222 end
223 
224 
225 
226 
227 fprintf('EEG FG paper eq. arousal results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
228  mean(MAE_self_arousal_EEG), std(MAE_self_arousal_EEG), mean(RMSE_self_arousal_EEG), std(RMSE_self_arousal_EEG));
229 
230 fprintf('EEG FG paper eq. valence results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
231  mean(MAE_self_valence_EEG), std(MAE_self_valence_EEG), mean(RMSE_self_valence_EEG), std(RMSE_self_valence_EEG));
232 
233 fprintf('EEG FG paper eq. dominance results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
234  mean(MAE_self_dominance_EEG), std(MAE_self_dominance_EEG), mean(RMSE_self_dominance_EEG), std(RMSE_self_dominance_EEG));
235 
236 fprintf('EEG FG paper eq. liking results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
237  mean(MAE_self_liking_EEG), std(MAE_self_liking_EEG), mean(RMSE_self_liking_EEG), std(RMSE_self_liking_EEG));
238 
239 
240 
241 fprintf('periph FG paper eq. arousal results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
242  mean(MAE_self_arousal_periph), std(MAE_self_arousal_periph), mean(RMSE_self_arousal_periph), std(RMSE_self_arousal_periph));
243 
244 fprintf('periph FG paper eq. valence results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
245  mean(MAE_self_valence_periph), std(MAE_self_valence_periph), mean(RMSE_self_valence_periph), std(RMSE_self_valence_periph));
246 
247 fprintf('periph FG paper eq. dominance results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
248  mean(MAE_self_dominance_periph), std(MAE_self_dominance_periph), mean(RMSE_self_dominance_periph), std(RMSE_self_dominance_periph));
249 
250 fprintf('periph FG paper eq. liking results MAE = %1.2f(%1.2f) RMSE = %1.2f(%1.2f)\n', ...
251  mean(MAE_self_liking_periph), std(MAE_self_liking_periph), mean(RMSE_self_liking_periph), std(RMSE_self_liking_periph));
252 
253 
254 
255 
256 
257 save results_FG evals_self_arousal_EEG evals_self_valence_EEG ...
258  evals_self_dominance_EEG evals_self_liking_EEG evals_self_arousal_periph ...
259  evals_self_valence_periph evals_self_dominance_periph evals_self_liking_periph