快速学会一个机器学习算法:层次聚类法

发布于 2025-3-20 07:37
浏览
0收藏

在机器学习领域,聚类分析是一种重要的无监督学习方法,广泛应用于数据挖掘、图像处理、市场细分等多个领域。本文将深入探讨层次聚类算法,包括其基本介绍、算法原理以及一个完整的案例分析,帮助读者全面理解和掌握这一经典的聚类方法。

一、算法介绍

1.1 什么是层次聚类

    层次聚类(Hierarchical Clustering)是一种通过构建层次结构来组织数据的聚类方法。与其他聚类算法不同,层次聚类不需要预先指定簇的数量,而是通过构建一个树状结构(树状图,Dendrogram)来展示数据的分层关系。层次聚类主要分为两类:

  • 凝聚层次聚类(Agglomerative Hierarchical Clustering):自底向上,先将每个数据点视为一个单独的簇,然后逐步合并最相似的簇,直到所有数据点合并为一个簇或达到预定的簇数量。
  • 分裂层次聚类(Divisive Hierarchical Clustering):自顶向下,先将所有数据点视为一个整体簇,然后逐步分裂成更小的簇,直到每个簇仅包含一个数据点或达到预定的簇数量。

二、算法原理

层次聚类的核心在于如何衡量簇与簇之间的相似性或距离,以及如何选择合适的链接方法来决定簇的合并或分裂。以下将详细介绍这些关键概念。

快速学会一个机器学习算法:层次聚类法-AI.x社区

2.3 算法流程

凝聚层次聚类为例,其基本流程如下:

  • 初始化:将每个数据点作为一个独立的簇。
  • 计算距离:计算所有簇之间的距离,根据选择的链接方法确定簇间距离。
  • 合并簇:找到距离最近的两个簇,将它们合并为一个新的簇。
  • 更新距离矩阵:更新新簇与其他簇之间的距离。
  • 重复步骤3-4,直到所有数据点合并为一个簇,或达到预定的簇数量。

三、案例分析

为了更好地理解层次聚类的应用,下面我们通过一个具体的案例进行分析。我们将使用Python中的​​scikit-learn​​库生成模拟数据,并实现层次聚类算法。

3.1 生成模拟数据

我们将生成一个包含三簇数据的二维数据集,每个簇的数据点呈现高斯分布。

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

# 1. 生成模拟数据
X, y_true = make_blobs(n_samples=50, centers=1, cluster_std=0.60, random_state=0)

# 可视化数据
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], s=50, color='gray')
plt.title("模拟数据分布")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

3.2 实现层次聚类

我们将使用​​scipy​​​库中的​​linkage​​​和​​dendrogram​​函数来实现层次聚类,并使用不同的链接方法进行比较。

# 2. 构建层次聚类模型
linked = linkage(X, method='ward')

# 3. 绘制树状图
plt.figure(figsize=(10, 7))
dendrogram(linked,
           orientation='top',
           distance_sort='descending',
           show_leaf_counts=True)
plt.title("层次聚类树状图(Ward法)")
plt.xlabel("样本点索引")
plt.ylabel("距离")
plt.show()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

3.3 确定簇的数量

通过观察树状图,我们可以选择一个合适的距离阈值来确定簇的数量。我们选择将数据分为3个簇。

# 4. 确定簇的数量并进行聚类
n_clusters = 3
cluster = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')  
cluster_labels = cluster.fit_predict(X)

# 5. 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis', s=50)
plt.title(f"层次聚类结果({n_clusters}个簇)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

3.5 运行结果

生成的模拟数据图:

快速学会一个机器学习算法:层次聚类法-AI.x社区

层次聚类树状图:

快速学会一个机器学习算法:层次聚类法-AI.x社区

层次聚类结果:

快速学会一个机器学习算法:层次聚类法-AI.x社区

    通过上述代码,我们生成了一个二维数据集,并使用层次聚类方法将其分为三个簇。树状图清晰地展示了数据的分层结构,选择合适的距离阈值后,聚类结果与真实簇的分布高度吻合,验证了层次聚类的有效性。

四、总结

层次聚类作为一种经典的聚类方法,具有以下优缺点:

优点

  • 无需预先指定簇的数量:通过树状图可以灵活选择簇的数量。
  • 能够发现数据的层次结构:适用于需要多层次分析的数据。
  • 适用于不同形状的簇:尤其是在选择合适的链接方法时。

缺点

  • 计算复杂度高:对于大规模数据集,计算和存储成本较高。
  • 对噪声和异常值敏感:可能会影响聚类结果的准确性。
  • 链接方法的选择依赖经验:不同的链接方法可能导致不同的聚类结果。

    在实际应用中,层次聚类适用于中小规模的数据集,特别是当需要理解数据的层次结构时。然而,对于大规模数据集,可能需要考虑其他更高效的聚类算法,如K-Means或DBSCAN。

本文转载自​​宝宝数模AI​​,作者:BBSM

已于2025-3-20 09:39:36修改
收藏
回复
举报


回复
相关推荐