-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrpca_fro.m
72 lines (45 loc) · 1.13 KB
/
rpca_fro.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
function [ A ] = rpca_fro( X, lambda )
%% Solves the following
%
% min || A ||_* + lambda/2 * || N ||_F^2
% s.t. X = A + N
%
% Stephen Tierney
%
max_iterations = 100;
func_vals = zeros(max_iterations, 1);
A = zeros(size(X));
N = zeros(size(X));
Y = zeros(size(X));
mu = 0.5;
mu_max = 100;
gamma_0 = 1.1;
normfX = norm(X,'fro');
tol_1 = 1*10^-2;
tol_2 = 1*10^-4;
for k = 1 : max_iterations
A_prev = A;
N_prev = N;
% Solve for A
V = X - N + 1/mu * Y;
[A, s] = solve_nn(V, 1/mu);
% Solve for N
V = X - A + 1/mu * Y;
N = solve_l2(V, lambda/mu);
% Update Y
Y = Y + mu*(X - A - N);
if (mu * max(norm(A - A_prev,'fro'), norm(N - N_prev))/norm(X,'fro') < 1*10^-3)
gamma = gamma_0;
else
gamma = 1;
end
mu = min(mu_max, gamma * mu);
% Check convergence
func_vals(k) = sum(s) + lambda*0.5*norm(N, 'fro')^2;
if ( norm(X - A - N, 'fro') < tol_1 ...
&& (mu * max([ norm(A - A_prev,'fro'), norm(N - N_prev, 'fro')]) / normfX < tol_2))
break;
end
end
end