-
Notifications
You must be signed in to change notification settings - Fork 2
/
face.m
104 lines (82 loc) · 2.71 KB
/
face.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
%This code implements face clustering experiment in CIKM 2015
%paper 'Robust subspace clustering via tighter rank approximation'
% zhao kang, 08/2015, zhao.kang@siu.edu
clear all
close all
load YaleBCrop025.mat;
iter=150;
rho=1e-5 ;% two tuning parameters
betazero=1.7;
alpha=2 ;% W construct
type=1;% different modeling of E
rate=1.03;
nSet = [2 3 5 8 10];
for i = 1 : length(nSet)
n = nSet(i);
idx = Ind{n};
for j = 1 : size(idx,1)
X = [];
for p = 1 : n
X = [X Y(:,:,idx(j,p))];
end
X = mat2gray(X);
[m,nn]=size(X);
W=eye(nn);
sig=ones(nn,1);
Y1=zeros(m,nn);
Y2=zeros(nn);
E=zeros(m,nn);
beta=betazero;
J=W;
tic;
for ii=1:iter
if ii>=2
Zold=Z;
end
W=inv(eye(size(J))+X'*X)*(X'*(X-E)+J+(X'*Y1+Y2)/beta);
gamma=W-Y2/beta;
[ J,nw] = DC(gamma,beta/2,sig);
sig=nw;
[E]=errormin(Y1,X,W,rho,beta,type);
Y1=Y1+beta*(X-X*W-E);
Y2=Y2+beta*(J-W);
beta=beta*rate;
Z=W;
if type==1
enorm=sum(sum(abs(X-X*Z)));
elseif type==2
enorm=sum(sum((X-X*Z).^2));
else
enorm=sum(sqrt(sum((X-X*Z).^2,1)));
end
if ii>3 && norm(Z-Zold,'fro')/norm(Zold,'fro')<1e-5
break
end
func(ii)=sum(atan(nw))+rho*enorm;
end
time_cost = toc;
[U ss V] = svd(Z);
ss = diag(ss);
r = sum(ss>1e-6);
U = U(:, 1 : r);
ss = diag(ss(1 : r));
V = V(:, 1 : r);
M = U * ss.^(1/2);
mm = normr(M);
rs = mm * mm';
L = abs(rs).^(2 * alpha);
actual_ids = spectral_clustering(L, n);
[err]=1-AccMeasure(s{n}, actual_ids);
disp(err);
missrateTot{n}(j) = err;
timeTot{n}(j) = time_cost;
iters{n}(j) = ii;
dlmwrite('face_detail.txt', [n rho beta alpha err time_cost ] , '-append', 'delimiter', '\t', 'newline', 'pc');
end
avgmissrate(n) = mean(missrateTot{n});
medmissrate(n) = median(missrateTot{n});
meancost(n) = mean(timeTot{n});
avgiter(n) = mean(iters{n});
dlmwrite('face.txt', [n rho betazero alpha avgmissrate(n) medmissrate(n) meancost(n) avgiter(n) rate] , '-append', 'delimiter', '\t', 'newline', 'pc');
disp([n rho betazero alpha avgmissrate(n) medmissrate(n) meancost(n) avgiter(n)]);
end