-
Notifications
You must be signed in to change notification settings - Fork 0
/
components_minSV.m
130 lines (103 loc) · 3.4 KB
/
components_minSV.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
function [res]=components_minSV(stack_all,tr_labels,hsize,jump,comp_siz,stack_allcompl)
Tama=size(stack_all);
if nargin>6, tama2=size(stack_allcompl); P=Tama(1)+tama2(1); else P=Tama(1); end
labels=(tr_labels>0);
lista=listar(stack_all,jump,comp_siz);
numOfcomp=size(lista,2);fprintf .
if hsize==0;
indices=(1:P)';
nfolds=P;
else
indices = crossvalind('Kfold',P,hsize);
nfolds=hsize; fprintf .
end
fprintf('Empezando con el grupo ')
for p=1:nfolds
test = (indices == p); train = ~test;
for i=1:numOfcomp
fprintf([ 'Calculando la precision de la componente ' num2str(i) '/' num2str(numOfcomp) ]);
try
if nargin>6
component_part1=stack_all(:,lista{i});
component_part2=stack_allcompl(:,lista{i});
component=[component_part1;component_part2];
stack_train=component(train,:);
else
stack_train=stack_all(train,lista{i});
end
train_values(p,i)=component_minSVs(stack_train,labels(train));
catch
continue
end
fprintf('completado! \n')
end
end
[res]=minSV_aggregation(train_values,labels,indices,lista,stack_all);
end
function [lista]=listar(stack_all,jump,comp_size)
[~,masky]=mascara(stack_all);
Tama=size(stack_all);fprintf .
Z=Tama(2);Y=Tama(3);X=Tama(4);
grid= zeros(Z,Y,X);
for xx=1:jump:X
for yy=1:jump:Y
for zz=1:jump:Z
grid(zz,yy,xx)= 1;
end
end
end
lista_ind=find(grid);
ccomp=intersect(lista_ind,find(~masky));
lista=cell(1);
for r=1:numel(ccomp)
[z y x]=ind2sub([Z Y X],ccomp(r));
listap=[];
for m=1:comp_size
for n=1:comp_size
listap=[listap z+(y-2+n)*Z+(x-2+m)*Z*Y:z+(y-2+n)*Z+(x-2+m)*Z*Y+comp_size-1]; % min(,Z*Y*X)];
end
end
lista{r}=listap;
end
end
function [values]=component_minSVs(tr_data,tr_labels)
kernels= { 'linear' }; %'rbf' 'polynomial' 'quadratic' };
P=size(tr_data,1);
NK=numel(kernels);
values=struct('nSv',cell(1,NK),'trad',cell(1,NK));
for kernel= 1:NK
%
options=optimset('MaxIter',1000);
svmStruct = svmtrain(double(tr_data), tr_labels,'Kernel_Function',char(kernels(kernel)),'method','QP','options',options);
numofSV=numel(svmStruct.SupportVectorIndices);
values(kernel).trad=svmStruct; fprintf .
values(kernel).nSv=numofSV;
fprintf('completado! \n')
end
end
function [cp]=minSV_aggregation(train_values,labels,indices,lista,stack_all)
s=struct2cell(train_values);
sval=squeeze(cell2mat(s(1,:,:)));
%max_nsv=max(sval);
max_nsv=floor(mean(sval));
minnSv=min(max_nsv);
numSv=(sum(indices~=1)-minnSv);
xval=size(sval,1);
for k=1:numSv+1
cp(k)=classperf(labels);
lista2=find(max_nsv<=(minnSv+k-1));
for p=1:xval
test = (indices == p); train = ~test;
for j=1:numel(lista2)
nd(:,j)=eval_svmStruct(train_values(p,lista2(j)).trad,stack_all(train,lista{lista2(j) }));
end
svmStruct2 = svmtrain(double(nd),labels(train),'Kernel_Function','linear','method','QP');
for j=1:numel(lista2)
ndt(:,j)=eval_svmStruct(train_values(p,lista2(j)).trad,stack_all(test,lista{lista2(j) }));
end
classes=svmclassify(svmStruct2,double(ndt));
classperf(cp(k), classes,test);fprintf .
clear nd*
end
end
end