目录

前言

一、层次聚类是什么?

二、层次聚类的优点和缺点

三、层次聚类的应用场景

四、构建层次聚类模型的注意事项

五、层次聚类模型的实现类库

六、层次聚类模型的评价指标

七、类库scikit-learn实现层次聚类的例子

八、层次聚类的模型参数

总结


前言

层次聚类是机器学习中无监督学习的一种聚类算法。

一、层次聚类是什么?

层次聚类是无监督机器学习中聚类算法的一种。基于簇间的相似度在不同层次上分析数据,形成树状的聚类结构。有自底向上的聚合(Agglomerative)和自顶向下的分拆(Divisive)两种策略。自底向上的聚合策略最为常见。

聚合层次聚类算法,首先假设每个样本都是一个单独的簇,然后将相似度高的两个簇进行合并,建立一个新的簇,重复该过程,直到满足停止条件(只有一个簇为止)。

簇间相似度的计算方法:
最小距离:两个簇的最近样本决定,又称为单链接算法。
最大距离:两个簇的最远样本决定,又称为全链接算法。
平均距离:两个簇的所有样本对距离平均值决定,又称为均链接算法。
中心距离:两个簇的中心间的距离决定。
最小方差/离差平方和(ward):两个簇的所有样本对的距离平方和的平均决定。

二、层次聚类的优点和缺点

优点

  • 算法简单,易于理解;
  • 不需要预先指定聚类个数,自动得到聚类层次结构;
  • 聚类结果可以通过树状图(Dendrogram)进行可视化;
  • 可以处理非凸数据集;

缺点

  • 对于噪声和离群点比较敏感;
  • 高的时间复杂度(n^3)和空间复杂度(n^2),不适合大数据集;
  • 算法很可能聚类成链状;
  • 由于聚类结果是层次结构,无法像 K-means 那样直接得到聚类中心;

三、层次聚类的应用场景

层次聚类是一种常见的聚类分析技术,其应用场景包括但不限于以下几个方面:

  • 生物学:层次聚类可以用于生物学中,将多个相关的基因或蛋白质数据聚类成几个无关的类别,从而更好地进行基因或蛋白质的分类和分析。
  • 市场营销:层次聚类可以用于市场营销中,将多个相关的市场指标聚类成几个无关的类别,从而更好地进行市场分析和定位。
  • 社交网络分析:层次聚类可以用于社交网络分析中,将多个相关的社交网络数据聚类成几个无关的社区,从而更好地进行社交网络分析和挖掘。
  • 医学诊断:层次聚类可以用于医学诊断中,将多个相关的病例数据聚类成几个无关的疾病类型,从而更好地进行疾病诊断和治疗。
  • 图像处理:层次聚类可以用于图像处理中,将多个相关的图像数据聚类成几个无关的图像类型,从而更好地进行图像处理和分析。

总之,层次聚类是一种非常常用的聚类分析技术,可应用于多种领域,特别是需要进行多个数据聚类和分类的场景下。

四、构建层次聚类模型的注意事项

层次聚类虽然可以进行可视化,可解释性强,易于理解,但不适合大规模数据集,尤其是需要根据实际情况来确定最终类的数量,小样本集,可以直观的根据树状图进行切割,而规模较大的数据集,一是不易用数据图展示,再就是很难确定如何进行最佳的切割已得到较好的聚类结果。

五、层次聚类模型的实现类库

Python有许多库可以实现层次聚类,以下是其中一些常用的库:

  • scipy.cluster.hierarchy:这个库提供了许多用于层次聚类的函数,包括linkage、dendrogram等。其中,linkage函数用于计算层次聚类的距离矩阵,dendrogram函数用于绘制层次聚类的树状图。
  • scikit-learn:这个库提供了许多机器学习算法的实现,其中包括层次聚类算法。可以使用AgglomerativeClustering类来实现层次聚类。
  • fastcluster:这个库提供了一些快速的层次聚类算法的实现,包括SLINK、CLINK和UPGMA等。

以上三个库都可以实现层次聚类,具体使用哪一个取决于你的需求和数据量大小。

六、层次聚类模型的评价指标

  • 轮廓系数(Silhouette Coefficient):衡量一个样本聚类的紧密程度和与其他聚类的分离程度。轮廓系数的取值范围在-1到1之间,越接近1表示聚类效果越好。
  • Calinski-Harabasz指数:衡量聚类结果的凝聚程度和分离程度,值越大表示聚类效果越好。
  • Davies-Bouldin指数:衡量聚类结果的凝聚程度和分离程度,值越小表示聚类效果越好。
  • Jaccard系数和Rand指数:用于比较聚类结果与真实分类之间的相似性,值越大表示聚类效果越好。
  • 模块度(Modularity):用于评估社区发现算法的性能,常用于无向加权网络的聚类分析。
  • 熵(Entropy):衡量聚类结果的多样性和熵值,值越小表示聚类效果越好。
  • Fowlkes-Mallows指数:用于比较聚类结果与真实分类之间的相似性,值越大表示聚类效果越好。

这些指标都是用来评估聚类模型的性能的,可以根据具体情况选择使用哪个指标。需要注意的是,不同的评价指标可能会得出不同的结论,所以最好综合考虑多个指标来评估聚类模型的性能。

七、类库scikit-learn实现层次聚类的例子

当使用`sklearn.cluster`中的`AgglomerativeClustering`类进行层次聚类时,可以按照以下步骤进行:

1. 导入必要的库和数据集:

from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs

# 生成示例数据
X, y = make_blobs(n_samples=100, centers=3, random_state=42)

2. 创建`AgglomerativeClustering`对象并指定参数:

# 创建AgglomerativeClustering对象
clustering = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')

3. 使用`fit_predict`方法进行聚类:

# 进行聚类
labels = clustering.fit_predict(X)

4. 对聚类结果进行评价:

聚类结果的评价可以使用一些指标,如轮廓系数(Silhouette Coefficient)和Calinski-Harabasz指数(Calinski-Harabasz Index)。这些指标可以通过`sklearn.metrics`模块中的相应函数进行计算。

from sklearn.metrics import silhouette_score, calinski_harabasz_score

# 计算轮廓系数
silhouette_avg = silhouette_score(X, labels)
print("轮廓系数:", silhouette_avg)

# 计算Calinski-Harabasz指数
ch_score = calinski_harabasz_score(X, labels)
print("Calinski-Harabasz指数:", ch_score)


八、层次聚类的模型参数

sklearn.cluster中AgglomerativeClustering类的参数如下:

  • n_clusters:int,可选参数,默认值为2。指定聚类的簇数。
  • affinity:str或可调用对象,可选参数,默认值为"euclidean"。指定计算样本之间距离的度量方法。可以是以下字符串之一:"euclidean"(欧氏距离)、"l1"(曼哈顿距离)、"l2"(欧几里德距离)、"manhattan"(曼哈顿距离)、"cosine"(余弦距离)、"precomputed"(使用预先计算的距离矩阵)。
  • linkage:str,可选参数,默认值为"ward"。指定连接算法。可以是以下字符串之一:"ward"(Ward方差最小化算法)、"complete"(最大距离算法)、"average"(平均距离算法)。
  • connectivity:array-like或可调用对象,可选参数,默认值为None。指定连接矩阵,用于限制聚类的连接关系。
  • compute_full_tree:bool,可选参数,默认值为"auto"。指定是否计算完整的层次聚类树。当样本数较大时,可以将其设置为False以加快计算速度。
  • distance_threshold:float,可选参数,默认值为None。指定聚类的距离阈值。超过该阈值的聚类将被视为单独的簇。
  • memory:str或可调用对象,可选参数,默认值为None。指定内存缓存的使用方式。
  • compute_distances:bool,可选参数,默认值为False。指定是否在计算聚类之前计算样本之间的距离。
     

总结

本文主要简单介绍了层次聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,示例和模型的参数等。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐