-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgetDistM.m
55 lines (47 loc) · 1.15 KB
/
getDistM.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
function [distM,distK,noise]=getDistM(data,K)
% M(k-NN)G-DPC: density peaks clustering based on improved mutual
% K-nearest-neighbor graph
tree=createns(data);
ND=size(data,1);
distM=1./zeros(ND);
noise=zeros(ND,1);
distK=zeros(ND,2*K);
[item,dist]=knnsearch(tree,data(:,:),'K',2*K+1);
for i=1:ND
distK(i,:)=item(i,2:2*K+1);
distM(i,distK(i,:))=dist(i,2:2*K+1);
distM(distK(i,:),i)=dist(i,2:2*K+1);
end
DS_knn=zeros(ND);
DS_knn_num=zeros(ND,1);
dislevel=zeros(ND,1);
for i=1:ND
for j=1:2*K
xj=distK(i,j);
DS_knn_num(xj)=DS_knn_num(xj)+1;
DS_knn(xj,DS_knn_num(xj))=i;
end
end
for i=1:ND
if DS_knn_num(i)==0
noise(i)=1;
elseif DS_knn_num(i)<K
idx=DS_knn(i,1:DS_knn_num(i));
dislevel(i)=max(distM(i,idx));
else
idx=DS_knn(i,1:DS_knn_num(i));
dist=sort(distM(i,idx));
dislevel(i)=dist(K);
end
end
for i=1:ND
for j=1:2*K
xj=distK(i,j);
if distM(i,xj)<dislevel(i) && distM(i,xj)<dislevel(xj)
continue;
end
distM(i,xj)=inf;
distM(xj,i)=inf;
end
end
end