forked from khne/JointEmbedding
-
Notifications
You must be signed in to change notification settings - Fork 1
/
doDiffusionMap.m
48 lines (32 loc) · 1.27 KB
/
doDiffusionMap.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
function embed = doDiffusionMap(W,n_template,n_components)
fprintf('- diffusion map embedding\n')
alpha = 0.5;
diffusion_time = 1;
n = size(W,1);
fprintf('- normalize\n')
d_alpha = spdiags(sum(W,2).^-alpha, 0, speye(n));
L_alpha = d_alpha * W * d_alpha;
fprintf('- laplacian\n')
d_alpha = spdiags(sum(L_alpha,2).^-1, 0, speye(n));
M = d_alpha * L_alpha;
fprintf('- eigendecomposition\n')
[V,E] = eigs(M, n_components + 1);
[lambdas, sorted_indices] = sort(diag(E),'descend');
vectors = V(:, sorted_indices);
fprintf('- diffusion map\n')
psi = vectors./repmat(vectors(:,1),1,size(vectors,2));
lambdas(2:end) = lambdas(2:end).^diffusion_time;
embedding = psi(:, 2:(n_components + 1)) * spdiags(lambdas(2:n_components+1), 0, n_components, n_components);
lambdas = lambdas(2:end);
embedding = embedding;
%% ========================================================================
fprintf('- results\n')
embed = [];
embed.lambdas = lambdas;
if n_template == 0
embed.individual = embedding;
else
embed.template = embedding(1:n_template,:);
embed.individual = embedding(n_template+1:end,:);
end
%% ========================================================================