python - pdist - scipy cluster hierarchy linkage
Tutorial para scipy.cluster.hierarchy (1)
Hay tres pasos en el agrupamiento aglomerativo jerárquico (HAC):
- Cuantificar datos (argumento
metric
) - Datos del cluster (argumento del
method
) - Elija la cantidad de clusters
Obra
z = linkage(a)
Cumplirá los dos primeros pasos. Como no ha especificado ningún parámetro, utiliza los valores estándar.
-
metric = ''euclidean''
-
method = ''single''
Entonces, z = linkage(a)
le dará un agrupamiento aglomerativo jerárquico único de a
. Este agrupamiento es una especie de jerarquía de soluciones. De esta jerarquía obtiene información sobre la estructura de sus datos. Lo que podrías hacer ahora es:
- Compruebe qué
metric
es adecuada, por ejemplo,cityblock
ochebychev
cuantificarán sus datos de manera diferente (cityblock
,euclidean
ychebychev
corresponden aL1
,L2
yL_inf
) - Verifique las diferentes propiedades / comportamientos de los
methdos
(p. Ej.,single
,complete
yaverage
) - Compruebe cómo determinar el número de clústeres, por ejemplo, leyendo el wiki al respecto
- Calcule los índices de las soluciones encontradas (agrupamientos) como el coeficiente de silueta (con este coeficiente obtiene un feedback sobre la calidad de la calidad de un punto / observación que se ajusta al clúster al que está asignado el clúster). Los diferentes índices utilizan diferentes criterios para calificar un agrupamiento.
Aquí hay algo para comenzar
import numpy as np
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt
a = np.array([[0.1, 2.5],
[1.5, .4 ],
[0.3, 1 ],
[1 , .8 ],
[0.5, 0 ],
[0 , 0.5],
[0.5, 0.5],
[2.7, 2 ],
[2.2, 3.1],
[3 , 2 ],
[3.2, 1.3]])
fig, axes23 = plt.subplots(2, 3)
for method, axes in zip([''single'', ''complete''], axes23):
z = hac.linkage(a, method=method)
# Plotting
axes[0].plot(range(1, len(z)+1), z[::-1, 2])
knee = np.diff(z[::-1, 2], 2)
axes[0].plot(range(2, len(z)), knee)
num_clust1 = knee.argmax() + 2
knee[knee.argmax()] = 0
num_clust2 = knee.argmax() + 2
axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], ''possible/n<- knee point'')
part1 = hac.fcluster(z, num_clust1, ''maxclust'')
part2 = hac.fcluster(z, num_clust2, ''maxclust'')
clr = [''#2200CC'' ,''#D9007E'' ,''#FF6600'' ,''#FFCC00'' ,''#ACE600'' ,''#0099CC'' ,
''#8900CC'' ,''#FF0000'' ,''#FF9900'' ,''#FFFF00'' ,''#00CC01'' ,''#0055CC'']
for part, ax in zip([part1, part2], axes[1:]):
for cluster in set(part):
ax.scatter(a[part == cluster, 0], a[part == cluster, 1],
color=clr[cluster])
m = ''/n(method: {})''.format(method)
plt.setp(axes[0], title=''Screeplot{}''.format(m), xlabel=''partition'',
ylabel=''{}/ncluster distance''.format(m))
plt.setp(axes[1], title=''{} Clusters''.format(num_clust1))
plt.setp(axes[2], title=''{} Clusters''.format(num_clust2))
plt.tight_layout()
plt.show()
Da
Estoy tratando de entender cómo manipular un clúster de jerarquía, pero la documentación es demasiado ... técnica? ... y no puedo entender cómo funciona.
¿Hay algún tutorial que pueda ayudarme a comenzar, explicando paso a paso algunas tareas simples?
Digamos que tengo el siguiente conjunto de datos:
a = np.array([[0, 0 ],
[1, 0 ],
[0, 1 ],
[1, 1 ],
[0.5, 0 ],
[0, 0.5],
[0.5, 0.5],
[2, 2 ],
[2, 3 ],
[3, 2 ],
[3, 3 ]])
Puedo hacer fácilmente el clúster de jerarquía y trazar el dendrograma:
z = linkage(a)
d = dendrogram(z)
- Ahora, ¿cómo puedo recuperar un cluster específico? Digamos que uno con elementos
[0,1,2,4,5,6]
en el dendrograma? - ¿Cómo puedo recuperar los valores de esos elementos?