def reorderClusters(B, X, GDM, returnOrderIndices = False):
Bloc = np.array(B)
Xloc = ds.listofarrays2arrayofarrays(X)
Bloc = Bloc[:, np.any(Bloc, axis=0)] # Only keep non-empty clusters
B_ordered = np.zeros(Bloc.shape, dtype=bool)
K = Bloc.shape[1] # Number of clusters
L = Xloc.shape[0] # Number of datasets
if K == 0:
return Bloc
# Find Cmeans and distances between clusters
Cmeans = np.array([None] * L, dtype=object)
D = np.zeros([K, K, L]) # KxKxL
for l in range(L):
Cmeans[l] = np.zeros([K, Xloc[l].shape[1]], dtype=float) # (K) x (X[l] samples)
for k in range(K):
Cmeans[l][k] = np.mean(Xloc[l][Bloc[GDM[:, l], k], :], axis=0)
D[:, :, l] = skdists.euclidean_distances(Cmeans[l]) # KxK
D = np.median(D, axis=2) # KxK
# Set first cluster as first, then find closest by closest
B_ordered[:, 0] = Bloc[:, 0]
I = np.zeros(K, dtype=int)
I[0] = 0
clustersDone = np.zeros(K, dtype=bool)
clustersDone[0] = True
for k in range(1,K):
relevantD = D[I[k-1], ~clustersDone]
clustersLeft = np.nonzero(~clustersDone)[0]
nextCluster = np.argmin(relevantD)
nextCluster = clustersLeft[nextCluster]
B_ordered[:, k] = Bloc[:, nextCluster]
I[k] = nextCluster
clustersDone[nextCluster] = True
if returnOrderIndices:
return (B_ordered, I)
else:
return B_ordered
评论列表
文章目录