从 scipy 树状图生成的每个簇中恢复元素
Recover elements from each cluster generated by scipy dendrogram
我正在构建树状图并将其截断以仅显示最大的 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')
我的输出如下所示:
我的目标是用该集群中成员的最小值替换叶子的非描述性标签。例如,如果顶部叶子是包含 10 到 1000 范围的簇,那么我想用 10 替换“2468”。替换图中刻度的实际逻辑很容易实现:
fig, ax = plt.subplots()
mislabels = ["foo" for i in range(7)]
ax.set_xticklabels(mislabels, fontsize=10, rotation=45)
关于如何从领导者内部提取价值有什么想法吗?
到目前为止,我能够使用 fcluster 将每个单例叶映射到它的集群。但是,这只会将我最初的 1230 个点映射到一个集群。我需要将标记为“2468”的点映射到它的簇,但我不确定该怎么做。
谢谢!
我找到方法了
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()
我正在构建树状图并将其截断以仅显示最大的 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')
我的输出如下所示:
我的目标是用该集群中成员的最小值替换叶子的非描述性标签。例如,如果顶部叶子是包含 10 到 1000 范围的簇,那么我想用 10 替换“2468”。替换图中刻度的实际逻辑很容易实现:
fig, ax = plt.subplots()
mislabels = ["foo" for i in range(7)]
ax.set_xticklabels(mislabels, fontsize=10, rotation=45)
关于如何从领导者内部提取价值有什么想法吗?
到目前为止,我能够使用 fcluster 将每个单例叶映射到它的集群。但是,这只会将我最初的 1230 个点映射到一个集群。我需要将标记为“2468”的点映射到它的簇,但我不确定该怎么做。
谢谢!
我找到方法了
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()