-
Notifications
You must be signed in to change notification settings - Fork 0
/
cnssl.m
58 lines (53 loc) · 1.93 KB
/
cnssl.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
% Complex Networks Semi-Supervised Learning
% Usage: [owner, pot] = cnsslis5(img, imgslab, fw, k, disttype, valpha, maxiter)
function [owner, pot] = cnssl(X, slabel, k, disttype, valpha, nclass, maxiter)
if (nargin < 7) || isempty(maxiter)
maxiter = 500000; % número de iterações
end
if (nargin < 6) || isempty(nclass)
nclass = max(slabel); % quantidade de classes
end
if (nargin < 5) || isempty(valpha)
valpha = 20;
end
if (nargin < 4) || isempty(disttype)
disttype = 'euclidean'; % distância euclidiana não normalizada
end
qtnode = size(X,1); % quantidade de nós
if (nargin < 3) || isempty(k)
k = round(qtnode*0.05); % quantidade de vizinhos mais próximos
end
% tratamento da entrada
k = uint16(k);
slabel = uint16(slabel);
k = uint16(k);
% constantes
npart = sum(slabel~=0); % quantidade de partículas
stopmax = round((qtnode/npart)*round(valpha*0.1)); % qtde de iterações para verificar convergência
% normalizar atributos se necessário
if strcmp(disttype,'seuclidean')==1
X = zscore(X);
disttype='euclidean';
end
nnonlabeled = sum(slabel==0); % quantidade de nós não rotulados
% lista de nós não rotulados
indnonlabeled = uint32(find(slabel==0));
% lista de nós rotulados
labelednodes = uint32(find(slabel>0));
% encontrando k-vizinhos mais próximos
[KNN,KNND] = knnsearch(X,X(indnonlabeled,:),'K',k+1,'NSMethod','kdtree','Distance',disttype);
KNN = uint32(KNN);
clear X;
KNN = KNN(:,2:end); % eliminando o elemento como vizinho de si mesmo
KNND = KNND(:,2:end);
KNND = 1./(1+KNND);
% ajustando todas as distâncias na máxima possível
pot = repmat(1/nclass,qtnode,nclass);
% zerando potenciais dos nós rotulados
pot(labelednodes,:) = 0;
% ajustando potencial da classe respectiva do nó rotulado para máximo
pot(sub2ind(size(pot),labelednodes,slabel(labelednodes))) = 1;
% variável para guardar máximo potencial mais alto médio
pot = cnsslis5loop(maxiter,nnonlabeled,indnonlabeled,stopmax,pot,k,KNN,KNND);
[~,owner] = max(pot,[],2);
end