当前位置:  首页>> 技术小册>> Python机器学习实战

第八章:聚类分析与层次聚类

引言

在机器学习的广阔领域中,聚类分析作为无监督学习的代表,扮演着至关重要的角色。它旨在将数据集中的样本划分为若干个组或“簇”,使得同一簇内的样本相似度较高,而不同簇之间的样本相似度较低。聚类分析不依赖于预定义的标签或类别,这使得它在探索性数据分析、市场细分、图像分割、社交网络分析等众多领域具有广泛的应用。本章将深入探讨聚类分析的基本概念、常用算法,并重点介绍层次聚类这一经典聚类方法,通过实例展示其在实际问题中的应用。

8.1 聚类分析基础

8.1.1 聚类分析的定义与目的

聚类分析是一种将数据集中的对象分组为多个类或簇的过程,每个簇内的对象彼此相似,而不同簇之间的对象则差异较大。聚类分析的主要目的是发现数据中的潜在结构和模式,而不需要事先知道数据的类别标签。

8.1.2 聚类算法的分类

聚类算法可以根据不同的划分标准进行分类,常见的分类方式包括:

  • 基于划分的聚类:如K-means算法,通过迭代将数据集划分为K个簇,使得簇内平方和最小。
  • 基于层次的聚类:如AGNES(自底向上的合并)和DIANA(自顶向下的分裂),通过构建层次结构来聚类数据。
  • 基于密度的聚类:如DBSCAN算法,根据样本的密度进行聚类,能够发现任意形状的簇。
  • 基于网格的聚类:如STING算法,将数据空间划分为网格单元,然后在网格单元上进行聚类。
  • 基于模型的聚类:如GMM(高斯混合模型),假设数据是由多个高斯分布生成的,通过估计这些分布的参数来聚类数据。
8.1.3 聚类质量的评估

评估聚类结果的好坏是聚类分析中的一个重要问题。常用的评估指标包括:

  • 轮廓系数:结合了簇内紧密度和簇间分离度的概念,值越大表示聚类效果越好。
  • Calinski-Harabasz指数:也称为方差比准则,通过计算簇内离散度与簇间离散度的比值来评估聚类效果。
  • Davies-Bouldin指数:基于簇的分离度和相似度来评价聚类效果,值越小表示聚类效果越好。

8.2 层次聚类算法详解

8.2.1 层次聚类概述

层次聚类算法通过构建一个层次结构来逐步合并或分裂数据集中的样本,从而形成最终的聚类结果。它分为凝聚的层次聚类和分裂的层次聚类两种。

  • 凝聚的层次聚类:从每个样本作为一个单独的簇开始,逐步合并最相似的簇,直到满足某个终止条件(如达到预设的簇数量或簇间相似度低于某个阈值)。
  • 分裂的层次聚类:将所有样本视为一个簇,然后逐步分裂成更小的簇,直到每个簇只包含一个样本或满足其他终止条件。
8.2.2 AGNES算法(自底向上的合并)

AGNES(Agglomerative Nesting)是最典型的凝聚层次聚类算法之一。其算法流程如下:

  1. 初始化:将每个样本视为一个单独的簇。
  2. 计算相似度:计算所有簇对之间的相似度(常用距离作为不相似度的度量,如欧氏距离、曼哈顿距离等)。
  3. 合并最相似的簇:选择相似度最高的两个簇进行合并,形成一个新的簇。
  4. 更新相似度矩阵:重新计算新簇与其他簇之间的相似度。
  5. 重复步骤3和4:直到所有样本都被合并到一个簇中,或者满足其他终止条件(如达到预设的簇数量)。
8.2.3 层次聚类的优缺点

优点

  • 不需要预先指定簇的数量。
  • 能够发现数据中的层次结构。
  • 可以通过可视化手段(如树状图)直观地展示聚类过程。

缺点

  • 合并或分裂的决策一旦做出,就无法撤销,即不可逆性。
  • 计算复杂度较高,特别是对于大数据集。
  • 终止条件的选择可能影响聚类结果的质量。

8.3 层次聚类实战

8.3.1 数据集准备

为了演示层次聚类的应用,我们将使用一个经典的数据集,如鸢尾花(Iris)数据集。该数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),并属于三个不同的类别(Setosa、Versicolour、Virginica)。尽管这里我们知道数据的真实类别,但我们将忽略这些标签,仅使用特征进行聚类分析。

8.3.2 使用Scikit-learn实现层次聚类

在Python中,我们可以使用Scikit-learn库中的AgglomerativeClustering类来实现层次聚类。以下是一个简单的示例代码:

  1. from sklearn.datasets import load_iris
  2. from sklearn.cluster import AgglomerativeClustering
  3. import matplotlib.pyplot as plt
  4. from sklearn.preprocessing import StandardScaler
  5. # 加载数据
  6. iris = load_iris()
  7. X = iris.data
  8. # 数据标准化
  9. scaler = StandardScaler()
  10. X_scaled = scaler.fit_transform(X)
  11. # 执行层次聚类
  12. model = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward')
  13. labels = model.fit_predict(X_scaled)
  14. # 可视化结果
  15. plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', marker='o')
  16. plt.title('Agglomerative Clustering of Iris Dataset')
  17. plt.xlabel('Sepal Length (scaled)')
  18. plt.ylabel('Sepal Width (scaled)')
  19. plt.show()

在上述代码中,我们首先加载了鸢尾花数据集,并对数据进行了标准化处理以消除不同特征之间的量纲影响。然后,我们使用AgglomerativeClustering类进行了层次聚类,指定了簇的数量为3(尽管我们事先知道类别数为3,但在实际应用中这通常是未知的),并选择了欧氏距离作为相似度度量,Ward方法作为簇间距离的计算方式。最后,我们通过散点图可视化了聚类结果。

8.3.3 结果分析与讨论

通过对比聚类结果与真实类别,我们可以评估层次聚类的效果。在理想情况下,聚类结果应与真实类别高度一致。然而,由于层次聚类是无监督学习方法,其聚类效果往往受到初始条件、相似度度量方式、簇间距离计算方法等多种因素的影响。因此,在实际应用中,我们可能需要尝试不同的参数组合,并结合领域知识来优化聚类结果。

结论

本章详细介绍了聚类分析的基本概念、常用算法以及层次聚类算法(特别是AGNES算法)的原理和实现方法。通过实例展示了如何在Python中使用Scikit-learn库进行层次聚类分析,并讨论了聚类结果的评估与优化。层次聚类作为无监督学习领域中的一种重要技术,其在数据探索、模式识别等方面的应用价值不容忽视。随着数据科学和机器学习技术的不断发展,我们有理由相信,聚类分析将在更多领域发挥更大的作用。


该分类下的相关小册推荐: