-
Notifications
You must be signed in to change notification settings - Fork 0
/
DoubleCrossValA1Param.m
147 lines (115 loc) · 4.93 KB
/
DoubleCrossValA1Param.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
function [AccTest] = DoubleCrossValA1Param(A,y_cs,AValider,method,...
nFoldToForget,OUTERkeys,INNERkeys,n)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FUNCTION
% [AccTest] = DoubleCrossValA1Param(A,y_cs,AValider,method,...
% nFoldToForget,OUTERkeys,INNERkeys,n)
% Performs a nested cross-validation for graph-base semi-supervised
% classification
%
% INPUT ARGUMENTS:
% A: nxn matrix, weighted undirected graph G containing n
% nodes. represented by its symmetric adjacency matrix A.
% y_cs: nxm matrix, m binary indicator vectors y_c containing
% as entries 1 for nodes belonging to the class whose
% label index is c, and 0 otherwise.
% AValider: indicates all the value of the parameter to try for the
% inner cross-validation.
% method: indicates which method will be used for the
% classification
% nFoldToForget: indicates the labelling rate (the labelled nodes
% represents (10-nFoldToForget)*10% of the data) and must
% be an integer between 1 and 9 (included).
% OUTERkeys: controls which node is affected to which fold for the
% outer cross-validation. is generate by the function
% "GenerateKeys".
% INNERkeys: controls which node is affected to which fold for the
% inner cross-validation. is generate by the function
% "GenerateKeys".
% n: indicates which key must be used from the two previous
% input arguments. useful if the classifiaction task is
% repeted more than one times (and is just 1 otherwise)
%
% OUTPUT ARGUMENTS:
% AccTest: contains the f Accuracies where f is the number of
% folds.
%
% (c) 2011-2012 B. Lebichot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[nData,nClass] = size(y_cs);
V = length(AValider);
nFold1 = 10;
if nData < nFold1
display('error')
end
% keeping a copy of y_cs and A
A_full = A;
y_cs_full = y_cs;
% to store the results
AccVal = nan(nFold1,nFold1,V);
AccMean = nan(nFold1,V);
AccTest = nan(1,nFold1);
for f1 = 1:nFold1
Fs = [1:10 1:10];
f1s = Fs(f1:f1+nFoldToForget-1);
LabelToForgetOUTER = false(1,nData);
for i = f1s
LabelToForgetOUTER(OUTERkeys{i}) = true;
end
for v = 1:V
Param = AValider(v);
for f2 = 1:nFold1
% re-initialisation of y_cs_full
y_cs = y_cs_full;
% forget which labels ?
f2s = Fs(f2:f2+nFoldToForget-1);
% LabelToForget = false(1,nData);
LabelToForgetOUT = false(1,nData);
LabelToForgetIN = false(1,nData);
% the labels forgotten because of OUTER cross-val
for i = f1s
for j = 1:nFold1
LabelToForgetOUT(INNERkeys{n,i,j}) = true;
end
end
% the labels forgotten because of INNER cross-val
for j = 1:nFold1
if sum(j ~= f1s)==numel(f1s)
LabelToForgetIN(INNERkeys{n,j,f2s(1)}) = true;
end
end
LabelToForget = or(LabelToForgetOUT,LabelToForgetIN);
% forget some labels
y_cs(LabelToForget,:) = 0;
% call of the method
[y_cs_new,SoS] = method(A,y_cs,Param);
% keep only the to-estimate labels and prediction
y_cs_new = y_cs_new(LabelToForgetIN,:);
y_cs_real = y_cs_full(LabelToForgetIN,:);
% test
MatVerif = sum(y_cs_new == y_cs_real,2);
nCorrect = sum(MatVerif == nClass);
AccVal(f1,f2,v) = 100*nCorrect/sum(LabelToForgetIN);
end
AccMean(f1,v) = AccVal(f1,:,v)*ones(nFold1,1)/nFold1;
end
% maximize mean accuracy
[AccMax,BestOne] = max(AccMean(f1,:));
display(['gagnant de la validation : ' num2str(AValider(BestOne))])
Winner = AValider(BestOne);
% re-initialisation of y_cs_full
y_cs = y_cs_full;
% forget some labels
y_cs(LabelToForgetOUTER,:) = 0;
% call of the method
[y_cs_new,SoS] = method(A,y_cs,Winner);
% keep only the to-estimate labels and prediction
y_cs_new = y_cs_new(LabelToForgetOUTER,:);
y_cs_real = y_cs_full(LabelToForgetOUTER,:);
% test
MatVerif = sum(y_cs_new == y_cs_real,2);
nCorrect = sum(MatVerif == nClass);
AccTest(f1) = 100*nCorrect/sum(LabelToForgetOUTER);
end
% AccTot = mean(AccTest);
end