La entrada a linkage()
es una matriz n x m, que representa n puntos en el espacio m-dimensional , o una matriz unidimensional que contiene el condensed distance matrix. En su ejemplo, mat
es 3 x 3, por lo que está agrupando tres puntos tridimensionales. La agrupación se basa en la distancia entre estos puntos.
¿Por qué mat y 1-mat dan agrupamientos idénticos aquí?
Las matrices mat
y 1-mat
producen la misma agrupación debido a que la agrupación se basa en las distancias entre los puntos, y ni una reflexión (-mat
) ni una traducción (mat + offset
) de los datos de todo el conjunto de cambiar las relativas distancias entre los puntos.
¿Cómo puedo anotar la distancia a lo largo de cada rama del árbol usando dendrograma para poder comparar las distancias entre pares de nodos?
En el siguiente código, I mostrar cómo se puede utilizar los datos devueltos por dendrograma para etiquetar los horizontales segmentos del diagrama con la distancia correspondiente.Los valores asociados con las claves icoord
y dcoord
dan las coordenadas xey de cada U invertida de tres segmentos de la figura. En augmented_dendrogram
, este dato se usa para agregar una etiqueta de la distancia (es decir, el valor y) de cada segmento de línea horizontal en dendrograma.
from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt
def augmented_dendrogram(*args, **kwargs):
ddata = dendrogram(*args, **kwargs)
if not kwargs.get('no_plot', False):
for i, d in zip(ddata['icoord'], ddata['dcoord']):
x = 0.5 * sum(i[1:3])
y = d[1]
plt.plot(x, y, 'ro')
plt.annotate("%.3g" % y, (x, y), xytext=(0, -8),
textcoords='offset points',
va='top', ha='center')
return ddata
para la matriz de mat
, el dendrograma aumentada es
Así punto 'a' y 'c' son 1.01 unidades de distancia, y el punto 'b' es de 1.57 unidades de la cluster ['a', 'c'].
Parece que show_leaf_counts
bandera se ignora, es que hay una manera de encenderlo manera que se muestra el número de objetos de cada clase?
La bandera show_leaf_counts
solo se aplica cuando no todos los datos originales puntos se muestran como hojas. Por ejemplo, cuando trunc_mode = "lastp"
, solo se muestran los últimos nodos p
.
Aquí hay un ejemplo con 100 puntos:
import numpy as np
from scipy.cluster.hierarchy import linkage
import matplotlib.pyplot as plt
from augmented_dendrogram import augmented_dendrogram
# Generate a random sample of `n` points in 2-d.
np.random.seed(12312)
n = 100
x = np.random.multivariate_normal([0, 0], np.array([[4.0, 2.5], [2.5, 1.4]]),
size=(n,))
plt.figure(1, figsize=(6, 5))
plt.clf()
plt.scatter(x[:, 0], x[:, 1])
plt.axis('equal')
plt.grid(True)
linkage_matrix = linkage(x, "single")
plt.figure(2, figsize=(10, 4))
plt.clf()
plt.subplot(1, 2, 1)
show_leaf_counts = False
ddata = augmented_dendrogram(linkage_matrix,
color_threshold=1,
p=6,
truncate_mode='lastp',
show_leaf_counts=show_leaf_counts,
)
plt.title("show_leaf_counts = %s" % show_leaf_counts)
plt.subplot(1, 2, 2)
show_leaf_counts = True
ddata = augmented_dendrogram(linkage_matrix,
color_threshold=1,
p=6,
truncate_mode='lastp',
show_leaf_counts=show_leaf_counts,
)
plt.title("show_leaf_counts = %s" % show_leaf_counts)
plt.show()
Estos son los puntos en el conjunto de datos:
Con p=6
y trunc_mode="lastp"
, dendrogram
sólo muestra la "parte superior" de el dendrograma. A continuación, se muestra el efecto de show_leaf_counts
.
La primera parte de su respuesta es correcta, pero incompleta. La entrada al enlace también puede ser "Una matriz de distancia condensada o redundante. Una matriz de distancia condensada es una matriz plana que contiene el triangular superior de la matriz de distancia. Esta es la forma en que pdist devuelve" De: https: //docs.scipy. org/doc/scipy-0.18.0/reference/generated/scipy.cluster.hierarchy.linkage.html – Featherlegs
@Featherlegs Gracias por señalarlo. En realidad, el docstring para el enlace fue corregido recientemente para reflejar la realidad del código. El docstring corregido aún no está en una versión. 'linkage' acepta una matriz de 1 d que contiene la matriz de distancia condensada o una matriz de puntos de 2 d. No acepta una matriz de distancia densa. Actualizaré mi respuesta para reflejar esto. –
Aquí está la versión de desarrollo de la documentación 'linkage': http://scipy.github.io/devdocs/generated/scipy.cluster.hierarchy.linkage.html –