Восстановить элементы из каждого кластера, созданного дипрограммой Scipy - PullRequest
0 голосов
/ 03 июля 2018

Я строю дендрограмму и усекаю ее, чтобы показать только 6 самых больших кластеров. Кроме того, маркировка выполняется с помощью простой функции листовой метки:

def llf(id):
   return str(id)

tree = sch.dendrogram(Z, truncate_mode='lastp', 
                      leaf_label_func=llf, p=6, show_contracted=False,
                      show_leaf_counts=False, leaf_rotation=90, 
                      no_labels = False, orientation='right')        

Мой вывод выглядит так:

enter image description here

Моя цель - заменить неописательные метки для листьев минимальным значением членов внутри этого кластера. Например, если верхний лист - это кластер, который содержит диапазон от 10 до 1000, то я хотел бы заменить «2468» на 10. Реальная логика замены тиков на графике проста для реализации:

fig, ax = plt.subplots()
mislabels = ["foo" for i in range(7)]
ax.set_xticklabels(mislabels, fontsize=10, rotation=45)

Есть какие-нибудь идеи относительно того, как извлечь ценности из лидеров?

Пока что я могу отобразить каждый синглтон-лист на его кластер с помощью fcluster. Однако, это только отображает мои первоначальные 1230 точек в кластер. Мне нужно сопоставить точку, помеченную как «2468», с ее кластером, и я не уверен, как это сделать.

Спасибо!

1 Ответ

0 голосов
/ 21 августа 2018

Я нашел способ сделать это

fig, ax = plt.subplots(2,2,figsize=(10,5))
ax = ax.ravel()
# [idx_plot[k]:, idx_plot[k]:]
for k, val in enumerate(linkages['ward']):    
    cluster_local = cluster_labels[val]['ward'][6]    
    leaders = sch.leaders(linkages['ward'][val], cluster_local)
    dates_labels = dict()
    for v, i in enumerate(leaders[1]):
        date_idx = np.where(cluster_local == i)
        dates_labels[leaders[0][v]] = (fechas[val][idx_plot[val]:][date_idx[0][0]].strftime('%y/%m'), fechas[val][idx_plot[val]:][date_idx[0][-1]].strftime('%y/%m'))
    mislabels = [dates_labels[leaders[0][i]][0] + ', ' + dates_labels[leaders[0][i]][1] for i in range(6)]
    yuca = sch.dendrogram(linkages['ward'][val], truncate_mode='lastp', ax=ax[k], leaf_label_func=llf, p=6, show_contracted=False, show_leaf_counts=False,
                          leaf_rotation=0, no_labels=False, orientation = 'right' )
#     ax[k].set_xticklabels(mislabels, fontsize=10, rotation=90)
    ax[k].set_yticklabels(mislabels, fontsize=10, rotation=0)
    ax[k].set_title(val)
plt.tight_layout()
plt.show()

enter image description here

...