层次聚类python,scipy(dendrogram, linkage,fcluster函数)总算有博文说清楚层次聚类Z矩阵的意义了

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了层次聚类python,scipy(dendrogram, linkage,fcluster函数)总算有博文说清楚层次聚类Z矩阵的意义了相关的知识,希望对你有一定的参考价值。

这里,我们来解读一下scipy中给出的层次聚类scipy.cluster.hierarchy的示例:

import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
Z = linkage(X, method='centroid')
f = fcluster(Z,t=3,criterion='distance')
fig = plt.figure(figsize=(5, 3))
dn = dendrogram(Z)
print('Z:\\n', Z)
print('f:\\n', f)
plt.show()

可以得到输出结果:

Z:
 [[ 2.          7.          0.          2.        ]
 [ 5.          6.          0.          2.        ]
 [ 1.          9.          1.          3.        ]
 [ 4.          8.          1.          3.        ]
 [ 0.         11.          1.66666667  4.        ]
 [ 3.         12.          3.25        5.        ]
 [10.         13.          7.26666667  8.        ]]
f:
 [2 1 2 3 2 1 1 2]

f代表了[2, 8, 0, 4, 1, 9, 9, 0]的每一个元素属于哪一个类别,这里设置了3类。如果想要5类的话,就可以在fcluster函数中的t参数设置为t=5即可。
最令人头大的是Z矩阵的意义,翻看了很多的博客都没有写清楚的。这里,我来讲解一下:

由于层次聚类每一次都会聚合两个类,那么如果有n个样本,那么最终会进行(n-1)次聚合,显然,Z矩阵有n-1行,这就意味着每一行表示了一次操作。那么接下来,我们从上到下解读。

首先,Z矩阵的构成一定是一个(n-1)*4的矩阵。前两个元素是每一步合并的两个簇,第三个元素是这些集群之间的距离,第四个元素是合并后的新簇中元素个数。

第一步:
根据Z的第一行,那么索引2和7将会合并为一个新的类,新的类给一个新的索引,譬如为8,第三个数0表示索引2和7的两个簇之间的距离为0,这是显然的。最后一个数2表示当前合并完的这个类有2个元素。
在这里插入图片描述
在这里插入图片描述
同理,我们可以把这一系列过程都表达如下:
在这里插入图片描述
最后,我们来分析一下各个函数以及常用参数的设置:

linkage函数
在这里插入图片描述
1.第一个参数y为一个尺寸为(m,n)的二维矩阵。一共有n个样本,每个样本有m个维度。
2.参数method =
’single’:一范数距离
’complete’:无穷范数距离
’average’:平均距离
’centroid’:二范数距离
’ward’:离差平方和距离
3.返回值:(n-1)*4的矩阵Z

fcluster函数->从给定链接矩阵定义的层次聚类中形成平面聚类
在这里插入图片描述

这个函数压平树状图
这种分配主要取决于距离阈值t——允许的最大簇间距离
1.参数Z是linkage函数的输出Z。
2.参数scalar:形成扁平簇的阈值。
3.参数criterion:
’inconsistent’:预设的,如果一个集群节点及其所有后代的不一致值小于或等于 t,那么它的所有叶子后代都属于同一个平面集群。当没有非单例集群满足此条件时,每个节点都被分配到自己的集群中。
’distance’:每个簇的距离不超过t
4.输出是每一个特征的类别。

dendrogram函数
绘制层次聚类图
在这里插入图片描述
(未完待续…后续完善dendrogram函数作图的细节与完善以及如何基于相关性来做聚类)

作于:
2021-6-8
17:15

以上是关于层次聚类python,scipy(dendrogram, linkage,fcluster函数)总算有博文说清楚层次聚类Z矩阵的意义了的主要内容,如果未能解决你的问题,请参考以下文章

Python scipy/numpy中相关性的层次聚类?

使用scipy进行层次聚类和k-means聚类

如何从 SciPy 的层次凝聚聚类中获取质心?

R语言绘图——层次聚类图及树状图添加side bar

在python中层次聚类的每一步打印所有聚类和样本

显示scipy树状图的簇标签