Как соотнести мои исходные данные с кластерными данными
У меня матрица расстояний представляет матрицу расстояний для попарных элементов, таких как
A B C D .....
A n1 n2 n3
B n1
C n2 n4
D n3 n5 .......
E.........
я ввел массив, как для кластеризации
arry= [ 0 n1, n2, n3..
n1.......
n2 n4
n3 n5 ]
Y=sch.linkage(arry,'single')
cutoff=1e-6
T=sch.fcluster(Y, cutoff,'distance')
print T
Z=sch.dendrogram(Y, color_threshold=cutoff)
мой вывод fcluster похож на [ 4 10 12 1 5 13 2 11 1 7 8 3 14 6 10 16 9 15 1 7] из предыдущего постера других. Кластеризация с помощью scipy - кластеров с помощью матрицы расстояний, как вернуть исходные объекты
Я понимаю, что выходные данные T[i] представляют только количество элементов в кластере. Как связать исходные элементы A, B,C,D,E..... с результатом кластера и дендрограммой? и пометить их правильно в мои фигуры.
1 ответ
"Я понимаю, что вывод T[i] представляет только количество элементов в кластере..."
T[j]
является "номером кластера" j-й точки данных. То есть, fcluster
обеспечивает назначения точек данных для кластеров. Так, например, если есть пять точек данных, и fcluster
помещает первое, второе и последнее в кластер 1, а остальные в кластер 2, возвращаемое значение fcluster
будет array([1, 1, 2, 2, 1])
,
Вот демонстрация, которая показывает, как вы можете разделить эти данные. Для удобства я использовал fclusterdata
вместо комбинации linkage
а также fcluster
, fclusterdata
возвращает то же самое, что и fcluster
,
import numpy as np
def cluster_indices(cluster_assignments):
n = cluster_assignments.max()
indices = []
for cluster_number in range(1, n + 1):
indices.append(np.where(cluster_assignments == cluster_number)[0])
return indices
if __name__ == "__main__":
from scipy.cluster.hierarchy import fclusterdata
# Make some test data.
data = np.random.rand(15,2)
# Compute the clusters.
cutoff = 1.0
cluster_assignments = fclusterdata(data, cutoff)
# Print the indices of the data points in each cluster.
num_clusters = cluster_assignments.max()
print "%d clusters" % num_clusters
indices = cluster_indices(cluster_assignments)
for k, ind in enumerate(indices):
print "cluster", k + 1, "is", ind
Типичный вывод:
4 clusters
cluster 1 is [ 0 1 6 8 10 13 14]
cluster 2 is [ 3 4 5 7 11 12]
cluster 3 is [9]
cluster 4 is [2]