-
Notifications
You must be signed in to change notification settings - Fork 10
/
demo_PCA_and_completion.m
61 lines (46 loc) · 1.56 KB
/
demo_PCA_and_completion.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
path(path,'./Subroutines');
path(path,'./Functions');
%
fprintf(1,'Let us first try a regular PCA factorization \n');
m=5000;n=5000;%size of the vector U and V
Delta=1e-4;%Variance of the gaussian noise
RANK=3;%rank
fprintf(1,'Creating a %dx%d signal of rank %d ...\n',m,n,RANK);
U = randn(m,RANK);
V = randn(n,RANK);
fprintf(1,'... and adding a Gaussian noise with sigma %f \n',sqrt(Delta));
%Adding noise!
Y=U*V'/sqrt(n)+sqrt(Delta)*randn(m,n);
%Computing the score and the inverse Fischer information
S=Y/Delta;Iinv=Delta;
%Calling the code
fprintf(1,'Running LowRAMP \n');
opt=LowRAMP_UV_Opt;
opt.nb_iter=20;
opt.damping=-1;%adaptive damping
opt.prior_u='Gauss'; opt.signal_u=U;
opt.prior_v='Gauss'; opt.signal_v=V;
opt.verbose_n=1;
tic
[ u_ample,v_ample ] = LowRAMP_UV(S,Iinv,RANK,opt) ;
toc;
fprintf(1,'Done! The Squared Reconstruction error on the matrix reads %e \n',mean2((u_ample*v_ample'/sqrt(n)-Y).^2));
subplot(1,3,1)
imshow(10*abs(Y))
title('The original matrix')
subplot(1,3,2)
imshow(10*abs((u_ample*v_ample'/sqrt(n))))
title('Recovered after factorization')
pause
fprintf(1,'Let us now hide 90 percent of all entries \n');
fraction=0.1;
Support=rand(size(Y))<fraction;
%Calling the code
fprintf(1,'Running LowRAMP \n');
tic
[ u_ample,v_ample ] = LowRAMP_UV(S.*Support,Iinv/fraction,RANK,opt) ;
toc;
fprintf(1,'Done! The Squared Reconstruction error on the matrix reads %e \n',mean2((u_ample*v_ample'/sqrt(n)-Y).^2));
subplot(1,3,3)
imshow(10*abs((u_ample*v_ample'/sqrt(n))))
title('Recovered after completion from 10% of the entries')