Ответ 1
Вход в linkage()
представляет собой либо массив n x m, представляющий n точек в
m-мерное пространство или одномерный массив, содержащий уплотненную матрицу расстояний. В вашем примере mat
- 3 x 3, поэтому вы кластеризуете
три 3-х точки. Кластеризация основана на расстоянии между этими точками.
Почему mat и 1-mat дают одинаковые кластеры здесь?
Массивы mat
и 1-mat
производят одну и ту же кластеризацию, поскольку кластеризация
основано на расстояниях между точками, и ни отражение (-mat
),
ни перевод (mat + offset
) всего набора данных не изменяют относительный
расстояния между точками.
Как я могу аннотировать расстояние вдоль каждой ветки дерева с помощью дендрограммы, чтобы сравнить расстояния между парами узлов?
В приведенном ниже коде I
покажите, как вы можете использовать данные, возвращаемые dendrogram, для обозначения горизонтальной
сегментов диаграммы с соответствующим расстоянием. Сопоставленные значения
с ключами icoord
и dcoord
дают координаты x и y каждого
трехсегментный инвертированный-U фигуры. В augmented_dendrogram
эти данные
используется для добавления метки расстояния (то есть значения y) каждой горизонтали
сегмент линии в дендрограмме.
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
Для вашего массива mat
расширенная дендрограмма
Таким образом, точки "a" и "c" равны 1.01 единицам, а точка "b" составляет 1,57 единицы от кластер ['a', 'c'].
Кажется, что флаг show_leaf_counts
игнорируется, есть ли способ включить его
так что показано количество объектов в каждом классе?
Флаг show_leaf_counts
применяется только тогда, когда не все исходные данные
точки показаны как листья. Например, когда trunc_mode = "lastp"
,
отображаются только последние узлы p
.
Вот пример со 100 точками:
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()
Это точки в наборе данных:
С p=6
и trunc_mode="lastp"
, dendrogram
показывает только "верхний"
дендрограммы. Ниже показано влияние show_leaf_counts
.