树状图y轴标记混乱

时间:2019-02-21 20:22:46

标签: python scikit-learn hierarchical-clustering dendrogram

我在熊猫中有一个大的(106x106)相关矩阵,其结构如下:

+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+
|   |         0         |        1         |        2         |        3         |        4         |        5        |        6         |        7         |        8         |         9         |
+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+
| 0 |               1.0 |   0.465539925807 |   0.736955649673 |   0.733077703346 |  -0.177380436347 | -0.268022641963 |  0.0642473239514 | -0.0136866435594 |  -0.025596700815 | -0.00385065532308 |
| 1 |    0.465539925807 |              1.0 |  -0.173472213691 |   -0.16898620433 | -0.0460674481563 | 0.0994673318696 |   0.137137216943 |   0.061999118034 |  0.0944808695878 |   0.0229095105328 |
| 2 |    0.736955649673 |  -0.173472213691 |              1.0 |   0.996627003263 |  -0.172683935315 |  -0.33319698831 | -0.0562591684255 | -0.0306820050477 | -0.0657065745626 |  -0.0457836647012 |
| 3 |    0.733077703346 |   -0.16898620433 |   0.996627003263 |              1.0 |  -0.153606414649 | -0.321562257834 | -0.0465540370732 | -0.0224318843281 | -0.0586629098513 |  -0.0417237678539 |
| 4 |   -0.177380436347 | -0.0460674481563 |  -0.172683935315 |  -0.153606414649 |              1.0 | 0.0148395123941 |   0.191615549534 |   0.289211355855 |    0.28799868259 |    0.291523969899 |
| 5 |   -0.268022641963 |  0.0994673318696 |   -0.33319698831 |  -0.321562257834 |  0.0148395123941 |             1.0 |   0.205432455075 |   0.445668299971 |   0.454982398693 |    0.427323555674 |
| 6 |   0.0642473239514 |   0.137137216943 | -0.0562591684255 | -0.0465540370732 |   0.191615549534 |  0.205432455075 |              1.0 |   0.674329392219 |   0.727261969241 |     0.67891326835 |
| 7 |  -0.0136866435594 |   0.061999118034 | -0.0306820050477 | -0.0224318843281 |   0.289211355855 |  0.445668299971 |   0.674329392219 |              1.0 |   0.980543049288 |    0.939548790275 |
| 8 |   -0.025596700815 |  0.0944808695878 | -0.0657065745626 | -0.0586629098513 |    0.28799868259 |  0.454982398693 |   0.727261969241 |   0.980543049288 |              1.0 |    0.930281915882 |
| 9 | -0.00385065532308 |  0.0229095105328 | -0.0457836647012 | -0.0417237678539 |   0.291523969899 |  0.427323555674 |    0.67891326835 |   0.939548790275 |   0.930281915882 |               1.0 |
+---+-------------------+------------------+------------------+------------------+------------------+-----------------+------------------+------------------+------------------+-------------------+

为简单起见在这里被截断。

如果我计算链接,然后使用以下代码绘制树状图:

from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(result_df.corr(),'average')
plt.figure()
fig, axes = plt.subplots(1, 1, figsize=(20, 20))
axes.tick_params(axis='both', which='major', labelsize=15)

dendrogram(Z=Z, labels=result_df_null_cols.columns, 
           leaf_rotation=90., ax=axes, 
           color_threshold=2.)

它产生如下的树状图: enter image description here

我的问题是围绕y轴。在我看到的所有示例中,Y轴都限制在0,2之间-我已阅读将其解释为(1-corr)。在我的结果中,边界更高。 0是高度相关的项目(1-1 = 0),2是低相关性项目(1 - -1 = 2)的截止值。

我找到了following answer,但是找到了it does not agree with this answerreferenced lecture notes here

无论如何-希望有人可以弄清哪个来源是正确的来源,并帮助传播有关该主题的一些知识。

1 个答案:

答案 0 :(得分:4)

已用于parent.frames[0].SomeFunction()的度量是欧氏距离,请参见here,而不是实际值。因此,它可以超过2,并且完全取决于我们使用的距离度量的类型。

这支持this答案中提到的观点。

  

1)y轴是对单个数据的接近度的度量   点或簇。

然后,使用以下距离在每对集群之间使用以下距离来计算树。

From Documentation:

enter image description here

在您提到的示例中,

即使各个值不超过linkage(),我们也会得到以下树状图。

enter image description here

(-1, +1)

原因是大小为45的距离数组( from scipy.spatial import distance distance.pdist(df, 'euclidean') -每对列;顺序说明here)将具有以下值:

10 C 2

如果我们建立一个具有均匀分布的随机值矩阵。 array([1.546726 , 0.79914141, 0.79426728, 2.24085106, 2.50838998, 2.22772899, 2.52578923, 2.55978527, 2.51553289, 2.11329023, 2.10501739, 1.66536963, 1.6303103 , 1.71821177, 2.04386712, 2.03917033, 2.03614219, 0.0280283 , 2.33440388, 2.68373496, 2.43771817, 2.68351612, 2.73148741, 2.66843754, 2.31758222, 2.67031469, 2.4206485 , 2.66539997, 2.7134241 , 2.65058045, 1.44756593, 1.39699605, 1.55063416, 1.56324546, 1.52001219, 1.32204039, 1.30206957, 1.29596715, 1.2895916 , 0.65145881, 0.62242858, 0.6283212 , 0.08642582, 0.11145739, 0.14420816]) 大小为(-1, 1),树状图将与此类似!

enter image description here

因此,您的问题的解决方案是

您需要将相关值转换为某种形式的距离度量。

  1. 我们可以使用squareform()中建议的相同的other answer。这是一种实现距离测量的两个方面的胶带方法。它必须为零(在相同的两个点之间),并且对于任何两个点都必须为非负数。这可以通过从中减去每个corr值来实现。

  2. 我们可以直接使用具有相关性的(160, 160)函数作为度量。该实现可用here。记住要转换数据框,因为我们需要在每一列而不是行之间建立关联。

了解解决方案的示例:

distance.pdist

enter image description here