4 %uupdate the follosing path to match your local ones
5 addpath(
'machine_learning_codes/');
6 load(
'DEAP/physio_data/deap_features.mat')
10 %if the feedback record is empty the trial was missing so skip it
11 if isempty(features(part,trial).feedback)
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;
22 % self rported arousal and valence which was not used in any of the
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);
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
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,:));
44 parameters.verbose = false;
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;
57 idx = part_vect ==subject;
59 fprintf('Classifying samples from subject %d\n',subject);
61 fprintf('EEG signals\n');
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);
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);
77 fprintf(
'Peripheral signals signals\n');
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);
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);
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;
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);
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;
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));
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));
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));
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));
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));
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));
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));
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));
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
155 parameters.normalize = 3;
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';
165 if parameters.verbose
166 fprintf(
'Regression for samples from subject %d\n',subject);
168 fprintf(
'EEG signals\n');
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);
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);
185 if parameters.verbose
186 fprintf(
'Peripheral signals\n');
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);
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;
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;
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;
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;
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));
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));
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));
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));
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));
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));
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));
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));
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