我为我的数据集生成了一个树状图,我不满意某些级别的分裂是如何排序的。因此,我正在寻找一种方法来交换单个分裂的两个分支(或叶子)。
如果我们查看底部的代码和树状图,有两个标签11
和25
与大群集的其余部分分开。我对此非常不满意,并且希望11
和25
的分支是分割的右分支,而群集的其余部分是左分支。显示的距离仍然是相同的,因此数据不会改变,只是美学。
可以这样做吗?如何?我专门用于手动干预,因为在这种情况下,最佳叶子排序算法应该不起作用。
import numpy as np
# random data set with two clusters
np.random.seed(65) # for repeatability of this tutorial
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[10,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[20,])
X = np.concatenate((a, b),)
# create linkage and plot dendrogram
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(X, 'ward')
plt.figure(figsize=(15, 5))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(
Z,
leaf_rotation=90., # rotates the x axis labels
leaf_font_size=12., # font size for the x axis labels
)
plt.show()
答案 0 :(得分:2)
我有一个类似的问题,通过在链接中使用optimum_ordering选项得到解决。我附上了您的案例的代码和结果,虽然可能不完全符合您的要求,但对我来说似乎有很大的改进。
import numpy as np
import matplotlib.pyplot as plt
# random data set with two clusters
np.random.seed(65) # for repeatability of this tutorial
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[10,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[20,])
X = np.concatenate((a, b),)
# create linkage and plot dendrogram
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(X, 'ward', optimal_ordering = True)
plt.figure(figsize=(15, 5))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(
Z,
leaf_rotation=90., # rotates the x axis labels
leaf_font_size=12., # font size for the x axis labels
distance_sort=False,
show_leaf_counts=True,
count_sort=False
)
plt.show()