This repository has been archived by the owner on Feb 2, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
extract_pca_train.m
60 lines (51 loc) · 1.88 KB
/
extract_pca_train.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
function [trn, val, tst, pp] = extract_pca_train(trn, val, tst, par)
%function [trn, val, tst, pp] = extract_pca_train(trn, val, tst, par)
%Extrai as PCAS da maneira correta p/ serem usadas no desenvolvimento de um
%classificador. par deve ser uma estrutura contendo os seguintes campos:
% - norm : ponteiro p/ a funcao usada p/ normalizar (event, esf, etc)
% - ringsDist : vetor com a distribuicao dos aneis.
% - isSegmented : se true, fara a extracao segmentada.
% - nComp : um valor (caso nao-segmentado), ou um vetor, especificando o
% numero de PCs p/ serem retidas do evento ou de cada segmento.
% Se este campo for [], TODAS as PCs serao utilizadas.
%
disp('Preparando os Conjuntos para Treino Com PCA');
%Usando a normalizacao solicitada.
[trn, val, tst, pp{1}] = par.norm(trn, val, tst, par);
%Para o resto do codigo, fica mais facil testar se ringDist = [] p/
%extracao nao segmentada.
if ~par.isSegmented,
par.ringsDist = [];
end
%Removendo a media.
[trn, val, tst, pp{2}] = remove_mean(trn, val, tst);
%Extraindo as PCAs
pp{3} = extract_pca(trn, par.ringsDist);
pp{3}.nComp = par.nComp;
if isempty(par.ringsDist),
pp{3}.name = 'PCA';
else
pp{3}.name = 'PCA-Seg';
pp{3}.ringsDist = par.ringsDist;
end
%Fazendo a compactacao do sinal, se solicitado.
W = do_reduction(pp{3}.W, par.ringsDist, par.nComp);
%Fazendo a projecao nas PCAs
[trn, val, tst] = do_projection(trn, val, tst, W, par.ringsDist);
function W = do_reduction(pca, ringsDist, nComp)
%So faco alguma coisa se nComp nao for vazio. Do contrario, nao mexo em nada
if isempty(nComp),
disp('Nao farei nenhuma reducao via PCA');
W = pca;
else
disp('Reduzindo a dimensao do evento via PCA');
if isempty(ringsDist), %Nao segmentado
W = pca(1:nComp,:);
else %Segmentado
N = length(pca);
W = cell(1,N);
for i=1:N,
W{i} = pca{i}(1:nComp(i),:);
end
end
end