-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAPG.m
100 lines (95 loc) · 2.41 KB
/
APG.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
function [Xin, precision, recal] = APG(W, p)
lambda = 0.0001;
len = size(W, 1);
Xin = cell(1, len);
delta = 10^-5;
precision = 0;
recal = 0;
iter = 10000;
for k = 1:len
tmpWi = W(k, :, :);
Nc = size(W, 3);
fenjie = Nc * p;
Wi = zeros(8, Nc);
Wi(:,:) = tmpWi(1, :, :);
Akp1 = zeros(8, Nc); Ak = zeros(8, Nc); Apre = zeros(8, Nc);
Ekp1 = zeros(8, Nc); Ek = zeros(8, Nc); Epre = zeros(8, Nc);
tkp1 = 1; tk = 1; tpre = 1;
%[tx, ty] = eig(Wi);
%[tu, ts, tv] = svds(Wi, 1);
%eigenvalue=ts(1, 1) * ts(1, 1);
miuk = 0.9 * norm(Wi, 2);
miukp1 = 0;
miubar = 10^-5 * miuk;
tmpXin = [];
%%
while(true)
%for i = 1:200
%disp(Ak);
%disp(Ek);
YA = Ak + ((tpre - 1) / tk) .* (Ak - Apre);
YE = Ek + ((tpre - 1) / tk) .* (Ek - Epre);
GA = YA - (YA + YE - Wi) ./ 2;
%disp(GA);
[U, S, V] = svd(GA);
%disp(S);
%disp(Sh(S, miuk / 2));
%disp(miuk / 2);
Akp1 = U * Sh(S, miuk / 2) * V';
%disp(Ak);
GE = YE - (YA + YE - Wi) ./ 2;
Ekp1 = Sh(GE, lambda * miuk / 2);
tkp1 = (1 + sqrt(4 * tk * tk + 1)) / 2;
miukp1 = max(0.9 * miuk, miubar);
Apre = Ak; Ak = Akp1;
Epre = Ek; Ek = Ekp1;
tpre = tk; tk = tkp1;
miuk = miukp1;
SA = 2 * (YA - Ak) + (Ak + Ek - YA - YE);
SE = 2 * (YE - Ek) + (Ak + Ek - YA - YE);
%disp(norm(SA, 'fro'));
if sqrt(norm(SA, 'fro') ^ 2 + norm(SE, 'fro')^2) < 0.001
break;
end
end
%%
A = Ak;
E = Ek;
%disp(A);
%disp(Wi);
%disp(E);
%disp(Wi);
TP = 0;
for i = 1:Nc
if norm(Wi(:,i), 1) <= min(0.5, norm(E(:, i), 1) * 1.1)
if j < fenjie
TP = TP + 1;
end
tmpXin = [tmpXin, Wi(:, i)];
end
end
precision = precision + (TP) / size(tmpXin, 2);
recal = recal + (TP) / (fenjie - 1);
%display(size(tmpXin));
Xin{i} = tmpXin;
end
precision = precision / len;
recal = recal / len;
%display(Xin);
end
function [r] = Sh(S, uk)
len1 = size(S, 1);
len2 = size(S, 2);
r = zeros(size(S));
for i = 1:len1
for j = 1:len2
if S(i, j) > uk
r(i, j) = S(i, j) - uk;
elseif S(i, j) < -uk
r(i, j) = S(i, j) + uk;
else
r(i, j) = 0;
end
end
end
end