-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAWP.m
65 lines (51 loc) · 1.23 KB
/
AWP.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
function [Y, p, obj] = AWP(Fs, opts)
% solve:
% min_{R_i, Y} \sum_i || Y - F_i R_i ||_F
% s.t. R_i^T R_i = I, Y \in Ind
%
% paras:
% Fs 1xv cell, contain nxk spectral embedding (F_i)
% opts options for debug and parameter setting
% Y nx1 indicator vector
% p vx1 vector
%
% Ref: Multiview Clustering via Adaptively Weighted Procrustes
% Written by: Lai Tian, tianlai.cs@gmail.com
% 2018-01-20
if (~exist('opts', 'var'))
opts = [];
end
NITER = 20;
if (isfield(opts, 'NITER'))
NITER = opts.NITER;
end
v = length(Fs);
[n, k] = size(Fs{1});
% == initialization ==
%Y = sparse(1:n, randi(k, n, 1), ones(n, 1), n, k);
Y = zeros(n, k);
Rs = cell(v, 1);
for idx = 1:v; Rs{idx} = eye(k); end
p = ones(v, 1);
for iter = 1:NITER
% == update Y ==
sum_pFR = zeros(size(Y));
for idx = 1:v
sum_pFR = sum_pFR + Fs{idx}*Rs{idx}/p(idx);
end
[~, y_idx] = max(sum_pFR, [], 2);
Y = full(sparse(1:n, y_idx, ones(n, 1), n, k));
% == update R_i ==
for idx = 1:v
[tmp_u, ~, tmp_v] = svd(Y'*Fs{idx}); %tmp_u different iter=3
Rs{idx} = tmp_v * tmp_u';
end
% == update p_i ==
for idx = 1:v
p(idx) = norm(Y - Fs{idx}*Rs{idx}, 'fro');
end
obj(iter) = norm(p); %norm(p,2)
end
% == from indicator mat to vec ==
[~, Y] = max(Y, [], 2);
end