-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathSMSC.m
58 lines (49 loc) · 1019 Bytes
/
SMSC.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
function [y_idx, Tobj] = SMSC(Ss,Fs,opts)
k = opts.k; % clusters
v = length(Ss);
[n, ~] = size(Ss{1});
for idx = 1:v
Rs{idx} = Fs{idx};
p(idx) = 1;
end
max_iter = 60;
for iter = 1:max_iter
% Update Y
T = zeros(n,k);
for idx = 1:v
Rt = Rs{idx};
St = Ss{idx};
temp = St*Rt;
pt = p(idx)/sum(p);
T = T + pt*temp;
end
Y = max(T/v,0);
% Update R
for idx = 1:v
St = Ss{idx};
temp = St'*Y;
[Ur, ~, Vr] = svds(temp,k);
Rs{idx} = Ur*Vr';
end
% objective function
obj = 0;
for idx = 1:v
Rt = Rs{idx};
St = Ss{idx};
temp = St - Y*Rt';
p(idx) = 1/norm(temp,'fro');
obj = obj + norm(temp,'fro')^2;
end
Tobj(iter) = obj;
% convergence checking
if iter>1
temp_obj = Tobj(iter -1);
else
temp_obj = 0;
end
if abs(obj - temp_obj)/temp_obj <1e-8
break;
end
end
[non ,y_idx] = max(Y,[],2);
plot(Tobj)