-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathM2E.m
58 lines (57 loc) · 1.57 KB
/
M2E.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 [ H, F, centroidF, log, ac,F1_value,Precision,Recall,indic,nmi_value,stop ] = M2E(X, K, label, options,Iter,seed )
viewNum = length(X);
H_ = [];
F_ = [];
H = cell(1, viewNum);
F = cell(1, viewNum);
log = 0;
ac = 0;
R=options.rank;
%% initialize basis and coefficient matrices
for i = 1:viewNum
size_vec=[size(X{i}),R];
[H{i}, F{i}] = M2E_initial(size_vec,H_, F_,seed);
I=size_vec(1);
U{i}=zeros(I,R);
P{i}=H{i};
end
centroidF=randn(size(F{1},1),R);
optionsForPerViewNMF=options;
oldL=1e100;
%% star interation
j = 0;
stop=0;
while j <Iter
j = j + 1;
for i = 1:viewNum
size_vec = [size(X{i}),R];
optionsForPerViewNMF.alpha = options.alpha(i);
[H{i}, P{i}, F{i}, U{i}] = M2E_ADMM(X{i}, H{i}, P{i}, F{i}, U{i}, size_vec, optionsForPerViewNMF, centroidF);
end
%% update the F*
centroidF = options.alpha(1) * F{1};
for i = 2:viewNum
centroidF = centroidF + options.alpha(i) * F{i};
end
centroidF = centroidF / sum(options.alpha);
%% calculate the objective function
logL = 0;
for i = 1:viewNum
tmp1 = X{i} - tensor_create(H{i},H{i},F{i});
tmp2 = F{i} - centroidF;
logL = logL + norm_fro(tmp1)^2 + options.alpha(i) * norm(tmp2,'fro')^2;
% fprintf('first %d\n', norm_fro(tmp1)^2);
% fprintf('second %d \n', norm(tmp2,'fro')^2);
end
log(end+1) = logL;
if (oldL<logL)
break;
end
oldL=logL;
logL;
end
if j<Iter
stop=1;
end
[ac,F1_value,Precision,Recall,indic,nmi_value] = printResult(centroidF, label, K, options.kmeans);
end