scipy hierarchy.linkage和Bray-Curtis距离不一致

时间:2018-02-05 20:39:48

标签: python scipy cluster-analysis dendrogram skbio

我正在处理来自几个不同样本站(站点)的一组物种数量(计数)。我使用scikit-bio的pw_distance函数计算了每对可能的样本站之间的Bray-Curtis相似度。这会产生一个距离矩阵,其值在0到1之间。到目前为止一直很好。

我想使用该距离矩阵来生成一个树形图,显示样本站如何聚集在一起。我正在使用scipy的hierachy.linkage函数来查找树形图的链接,然后使用hierarchy.dendrogram进行绘图。

这是我的代码:

from skbio.diversity.beta import pw_distances
from scipy.cluster import hierarchy

bc_dm = pw_distances(counts, stations, metric = "braycurtis")

# use (1 - bc_dm) to get similarity rather than dissimilarity
sim = 1 - bc_dm.data

Z = hierarchy.linkage(sim, 'ward')
hierarchy.dendrogram(
    Z,
    leaf_rotation=0.,  # rotates the x axis labels
    leaf_font_size=10.,  # font size for the x axis labels
    labels=bc_dm.ids,
    orientation="left"
)

here is a link to the dendrogram produced by the above code

据我了解,树形图上的距离应与Bray-Curtis相似度(类似于距离)相对应,但树形图上的距离值最大值超过30.这是正确的吗?如果没有,我如何缩放我的距离以对应样本站之间的Bray-Curtis相似性?如果它是正确的,那么树形图上的距离真的对应于什么?

1 个答案:

答案 0 :(得分:1)

查看评论中分享的链接,因为它们可以解决您的问题。

这些链接中未涵盖的一个from collections import Counter from toolz import concat short_list = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ] long_list = [ [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [6, 7, 8, 9, 10], [2, 3, 11, 12, 13] ] for idx, i in enumerate(short_list): long_list_filtered = (x for x in concat(long_list[:idx] + long_list[idx+1:]) if x in set(i))) print(idx, Counter(long_list_filtered)) # 0 Counter({2: 2, 3: 2}) # 1 Counter({4: 1, 5: 1, 6: 1}) # 2 Counter() # 3 Counter({10: 1}) 步骤是您应该在scikit-bio上调用链接,而不是bc_dm.condensed_form()bc_dm。这将以您需要的格式为您提供输入。如果您传递2D矩阵,sim会假定它是您的linkage矩阵,并根据这些数据计算样本之间的欧几里德距离。

另外,请务必注意counts method参数,因为这会影响树形图中分支长度的解释。 scipy.cluster.hierarchy.linkage的文档字符串包含有关如何为不同方法计算这些内容的详细信息。