一文搞懂层次聚类和密度聚类方法!

70 阅读6分钟

推荐直接网站在线阅读:aicoting AI算法面试学习在线网站

聚类(Clustering)是一种典型的无监督学习方法,其目标是在没有标签信息的情况下,将数据样本按照相似性划分为若干簇,使得同一簇内的样本相似度高,不同簇之间差异显著。常见方法包括基于划分的 K-Means、基于层次的 层次聚类、以及基于密度的 DBSCAN、OPTICS 等。聚类广泛应用于用户分群、市场细分、文本主题发现、图像分割等任务,是数据挖掘和探索性分析中的重要工具。

所有相关源码示例、流程图、模型配置与知识库构建技巧,我也将持续更新在Github:AIHub,欢迎关注收藏!

什么是层次聚类

在无监督学习方法中,层次聚类(Hierarchical Clustering)是一种常见且直观的聚类方法,广泛应用于文本分析中的主题发现、基因表达数据的模式识别、社会网络中群体结构挖掘、以及图像处理和市场细分等场景。与 K-Means 等划分式方法不同,层次聚类通过构建样本间的层次关系,形成一棵聚类树(dendrogram),帮助我们理解数据的多层次结构。

层次聚类的核心思想是:

  • 自底向上(凝聚型,Agglomerative):初始时将每个样本视为一个簇,然后逐步将最相似的簇合并,直到最终形成一个簇或达到设定的簇数。
  • 自顶向下(分裂型,Divisive):初始时将所有样本视为一个整体簇,然后逐步分裂为更小的簇,直至达到指定的簇数。

常用的是凝聚型层次聚类,因为其计算效率更高且直观。

层次聚类依赖于簇间的距离定义,不同的度量方式会影响结果:

  • 单链法(Single Linkage):簇间最短距离。容易出现“链式效应”。
  • 全链法(Complete Linkage):簇间最长距离。倾向于得到紧凑的簇。
  • 平均链法(Average Linkage):簇间平均距离。综合了单链与全链的特点。
  • Ward 方法:基于平方误差最小化,倾向于生成方差较小、大小相对均衡的簇。

以凝聚型层次聚类为例,算法的工作步骤如下:

  1. 将每个样本作为一个独立簇。
  2. 计算所有簇之间的距离。
  3. 找到最近的两个簇并合并。
  4. 更新簇间距离矩阵。
  5. 重复步骤 2-4,直到所有样本被合并为一个簇或达到预设簇数。

是不是有点像二分法或者归并排序。

最终结果可以用树状图(dendrogram)直观展示,每个分支的高度代表簇之间的距离。

下面用一段代码形象的理解一下:

from sklearn.datasets import load_iris
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# 1. 加载数据
iris = load_iris()
X = iris.data

# 2. 层次聚类 (AgglomerativeClustering)
model = AgglomerativeClustering(n_clusters=3, linkage='ward')
labels = model.fit_predict(X)

print("聚类结果:", labels[:20])

# 3. 绘制树状图
Z = linkage(X, method='ward')
plt.figure(figsize=(8, 5))
dendrogram(Z, truncate_mode='level', p=3)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()

输出结果如下:

我简单解释一下,比如第一次聚类,第7个样本和第8个样本距离最近,那么他们就成一个组合,组合之间再进行聚类,最后是不是就聚成了目标类别了。

层次聚类的优势在于无需预先指定簇数,能够揭示数据的多层次结构,且结果可视化直观。但其缺点是计算复杂度较高,难以扩展到超大规模数据集,同时对噪声与异常值敏感。在小规模数据分析、模式探索和数据可视化场景中,层次聚类依然是一种非常有价值的方法。

密度聚类方法

密度聚类方法通过寻找数据空间中高密度区域来划分簇,能够自然地处理噪声和非凸形簇结构,是传统划分式方法(如 K-Means)难以解决的问题。我们出去玩在地图中搜索美食,这些热点区域或者人口事件聚集区都是通过密度聚类方法实现的。

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)和 OPTICS(Ordering Points To Identify the Clustering Structure)是两种典型的密度聚类方法。

1.DBSCAN

DBSCAN 的核心思想是:簇是由密度可达的点组成的区域,而低密度区域视为噪声。

  • 核心概念:
  • -邻域:样本点周围半径为 的区域。
  • 核心点:其 -邻域内点数 ≥ minPts。
  • 边界点:位于核心点 -邻域内,但本身点数 < minPts。
  • 噪声点:不属于任何簇的点。
  • 聚类规则:
  1. 从任意未访问点开始,若其为核心点,则以该点为中心扩展簇,将密度可达的点加入簇。
  2. 对簇中新增的核心点重复扩展过程,直到簇无法再扩展。
  3. 重复以上步骤,直到所有点都被访问过。

DBSCAN 可以发现任意形状的簇,能自动识别噪声点,并且无需预设簇数。但是它对参数 和 minPts 比较敏感,同时在高维数据中效果会有所下降,因为高维数据中密度概念就失效了。

2.OPTICS

OPTICS 是 DBSCAN 的改进,主要解决 DBSCAN 在参数选择(尤其是 )上的限制。

  • 核心思想:不直接生成簇,而是生成 可达距离序列(reachability distance),记录点之间的密度结构。
  • 聚类规则:
  1. 对每个点计算核心距离(core distance)和可达距离(reachability distance);
  2. 按可达距离顺序访问所有点,形成一个有序列表;
  3. 可通过可达距离的突变检测不同密度区域,从而识别簇。

OPTICS能发现不同密度的簇,并且不需要严格指定 ε 值,适合数据密度不均匀的场景。但是计算复杂度比 DBSCAN 高,结果需要进一步分析才能确定簇边界。 下面我们用实现的代码展示一下这两种方法的效果好坏:

from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
from sklearn.cluster import OPTICS
import matplotlib.pyplot as plt

# 生成非凸形数据
X, y = make_moons(n_samples=300, noise=0.05, random_state=42)

# DBSCAN 聚类
dbscan = DBSCAN(eps=0.2, min_samples=5)
labels_dbscan = dbscan.fit_predict(X)

# OPTICS 聚类
optics = OPTICS(min_samples=5, xi=0.05, min_cluster_size=0.1)
labels_optics = optics.fit_predict(X)

# 可视化 DBSCAN
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.scatter(X[:,0], X[:,1], c=labels_dbscan, cmap='viridis', s=30)
plt.title("DBSCAN Clustering")

# 可视化 OPTICS
plt.subplot(1,2,2)
plt.scatter(X[:,0], X[:,1], c=labels_optics, cmap='viridis', s=30)
plt.title("OPTICS Clustering")
plt.show()

运行结果如下,可以看到DBSCAN 和 OPTICS 都能识别非凸簇,OPTICS 对不同密度簇表现更稳健。

总结时刻到,DBSCAN 和 OPTICS 是密度聚类的代表方法:

  • DBSCAN 简单高效,适合簇密度均匀、噪声点明确的数据;
  • OPTICS 解决了 DBSCAN 对参数敏感的问题,能处理不同密度的簇,但计算复杂度更高。

总体来说,密度聚类方法在非球形簇、异常点检测和探索性数据分析中具有明显优势,是传统划分聚类方法的重要补充。

最新的文章都在公众号aicoting更新,别忘记关注哦!!!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!