Skip to content

Commit 3e6d1af

Browse files
committedNov 15, 2021
optimize cluster
1 parent 0af7608 commit 3e6d1af

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed
 

‎cluster.py

+22-20
Original file line numberDiff line numberDiff line change
@@ -188,48 +188,50 @@ def cluster(self, distances, max_dis, min_dis, max_id, density_threshold, distan
188188
assert not (dc is not None and auto_select_dc)
189189
rho, dc = self.local_density(distances, max_dis, min_dis, max_id, dc=dc, auto_select_dc=auto_select_dc)
190190
delta, nneigh = min_distance(max_id, max_dis, distances, rho)
191+
nneigh = nneigh.astype(int) # nneigh will be used as indexing so it should be int
191192
logger.info("PROGRESS: start cluster")
192-
cluster, ccenter = {}, {} # cl/icl in cluster_dp.m
193193

194-
for idx, (ldensity, mdistance, nneigh_item) in enumerate(zip(rho, delta, nneigh)):
195-
if idx == 0:
196-
continue
197-
if ldensity >= density_threshold and mdistance >= distance_threshold:
198-
ccenter[idx] = idx
199-
cluster[idx] = idx
200-
else:
201-
cluster[idx] = -1
194+
# cl/icl in cluster_dp.m
195+
cluster = np.zeros(max_id + 1, int)
196+
ccenter = np.zeros(max_id + 1, int)
197+
198+
index = np.logical_and(rho >= density_threshold, delta >= distance_threshold)
199+
index_val = np.where(index)[0]
200+
ccenter[index] = index_val
201+
cluster[index] = index_val
202+
cluster[np.invert(index)] = -1
202203

203204
# assignation
204205
ordrho = np.argsort(-rho)
205206
for i in range(ordrho.shape[0] - 1):
206-
if ordrho[i] == 0: continue
207+
if ordrho[i] == 0:
208+
continue
207209
if cluster[ordrho[i]] == -1:
208210
cluster[ordrho[i]] = cluster[nneigh[ordrho[i]]]
209211
if i % (max_id / 10) == 0:
210-
logger.info("PROGRESS: at index #%i" % (i))
212+
logger.info("PROGRESS: assignation at #%i" % i)
211213

212214
# halo
213-
halo, bord_rho = {}, {}
214-
for i in range(1, ordrho.shape[0]):
215-
halo[i] = cluster[i]
215+
halo = np.zeros(max_id + 1)
216+
bord_rho = np.zeros(max_id + 1)
217+
halo[1:] = cluster[1:]
218+
216219
if len(ccenter) > 0:
217-
for idx in ccenter.keys():
218-
bord_rho[idx] = 0.0
219220
for i in range(1, rho.shape[0] - 1):
220221
for j in range(i + 1, rho.shape[0]):
221-
if cluster[i] != cluster[j] and distances[i-1, j-1] <= dc:
222+
if cluster[i] != cluster[j] and distances[i - 1, j - 1] <= dc:
222223
rho_aver = (rho[i] + rho[j]) / 2.0
223224
if rho_aver > bord_rho[cluster[i]]:
224225
bord_rho[cluster[i]] = rho_aver
225226
if rho_aver > bord_rho[cluster[j]]:
226227
bord_rho[cluster[j]] = rho_aver
228+
if i % (max_id / 10) == 0:
229+
logger.info("PROGRESS: halo at #%i" % i)
227230
for i in range(1, rho.shape[0]):
228231
if rho[i] < bord_rho[cluster[i]]:
229232
halo[i] = 0
230-
for i in range(1, rho.shape[0]):
231-
if halo[i] == 0:
232-
cluster[i] = - 1
233+
234+
cluster[halo == 0] = -1
233235

234236
self.cluster, self.ccenter = cluster, ccenter
235237
self.distances = distances

‎step2_cluster.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ def plot(data, density_threshold, distance_threshold, auto_select_dc = False):
1616
dpcluster = DensityPeakCluster()
1717
rho, delta, nneigh = dpcluster.cluster(distances_matrix, max_dis, min_dis, max_id, density_threshold, distance_threshold, auto_select_dc = auto_select_dc)
1818
logger.info(str(len(dpcluster.ccenter)) + ' center as below')
19-
for idx, center in dpcluster.ccenter.items():
20-
logger.info('%d %f %f' %(idx, rho[center], delta[center]))
19+
unique_centers = np.unique(dpcluster.ccenter)
20+
for idx, center in np.ndenumerate(unique_centers):
21+
logger.info('%d %d %f %f' % (idx[0], center, rho[center+1], delta[center+1]))
2122
plot_rho_delta(rho, delta) #plot to choose the threthold
2223
plot_rhodelta_rho(rho,delta)
2324
plot_cluster(dpcluster)

0 commit comments

Comments
 (0)