返回列表

聚类算法:无监督学习中的数据分组艺术

发布于 ·

聚类算法:无监督学习中的数据分组艺术

在机器学习的世界里,我们通常被分为两类问题:有监督学习无监督学习。聚类算法是后者的核心,它不依赖于已知的标签或分类,而是通过发现数据内部的隐藏结构来将相似的样本聚集在一起。这种能力使它在探索性数据分析、客户细分、图像分割等众多领域发挥着重要作用。本文将深入探讨聚类算法的原理、常见类型及其优缺点,并通过一个简单的Python示例展示其应用。

1. 什么是聚类?

简单来说,聚类(Clustering) 是一种将一组对象按照某种相似性度量分成若干个“簇”(Clusters)的任务。其目标是:

  • 组内相似度高:同一个簇内的数据点彼此之间非常相似。

  • 组间差异大:不同簇之间的数据点差异显著。

聚类算法不需要训练数据集中的标签信息,因此它是一种典型的无监督学习方法


2. 常见的聚类算法

2.1 K-Means 聚类(最经典)

K-Means 是最广泛使用的一种聚类算法。它的基本思想是:

  1. 随机选择 $ k $ 个初始质心(centroids);
  2. 将每个数据点分配到距离最近的质心所在的簇;
  3. 重新计算每个簇的质心(即该簇所有点的均值);
  4. 重复步骤2–3,直到质心不再变化或达到最大迭代次数。
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

生成示例数据

X = np.random.randn(100, 2)

创建K-Means模型并拟合

kmeans = KMeans(nclusters=3, randomstate=0) labels = kmeans.fitpredict(X)

可视化结果

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.scatter(kmeans.cluster
centers[:, 0], kmeans.clustercenters[:, 1], s=200, marker='x', color='red', label='Centroids') plt.title('K-Means Clustering') plt.legend() plt.show()

优点:

  • 简单高效,适用于大规模数据集;
  • 收敛速度快。

缺点:

  • 必须预先指定簇的数量 $ k $;
  • 对异常值敏感;
  • 只能发现球形簇,无法处理非凸形状的数据。

2.2 层次聚类(Hierarchical Clustering)

层次聚类有两种主要方式:凝聚式(Agglomerative)分裂式(Divisive)。其中凝聚式更常见:

  • 开始时,每个点自成一个簇;
  • 每次合并距离最近的两簇;
  • 形成树状结构(称为树状图 dendrogram),可通过设定阈值确定最终簇数。
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

Z = linkage(X, method='ward') # Ward方法最小化簇内方差
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.title("Dendrogram for Hierarchical Clustering")
plt.xlabel("Data Points")
plt.ylabel("Distance")
plt.show()

优点:

  • 无需预设簇数;
  • 能发现任意形状的簇;
  • 提供直观的可视化工具(dendrogram)。

缺点:

  • 时间复杂度高($ O(n^3) $),不适合大数据集;
  • 一旦合并,不可撤销(贪心策略)。

2.3 DBSCAN(Density-Based Spatial Clustering)

DBSCAN 基于密度进行聚类,能有效识别噪声并找到任意形状的簇。

核心概念

  • 核心点(Core Point):在其邻域半径 $\epsilon$ 内有至少 minsamples 个点;

  • 边界点(Border Point):不属于核心点,但可被某个核心点直接访问;

  • 噪声点(Noise Point):既不是核心点也不是边界点。

from sklearn.cluster import DBSCAN

dbscan = DBSCAN(eps=0.5, minsamples=5)
labels
db = dbscan.fitpredict(X)

可视化

plt.scatter(X[:, 0], X[:, 1], c=labels
db, cmap='plasma') plt.title('DBSCAN Clustering (Including Noise)') plt.show()

优点:

  • 自动确定簇数;
  • 抗噪能力强;
  • 可发现任意形状的簇。

缺点:

  • 对参数 $\epsilon$ 和 minsamples 敏感;
  • 在高维空间中效果下降(“维度灾难”)。

3. 如何选择合适的聚类算法?

| 算法 | 是否需设k | 形状适应性 | 抗噪性 | 时间复杂度 | 适用场景 |
|------------|-----------|-------------|--------|------------|----------|
| K-Means | 是 | 仅球形 | 弱 | $O(nkd)$ | 数据呈球形分布,规模大 |
| 层次聚类 | 否 | 强 | 中 | $O(n^3)$ | 小规模数据,需层次结构 |
| DBSCAN | 否 | 强 | 强 | $O(n \log n)$ | 含噪声、非凸簇 |

💡 建议:先尝试 K-Means,若效果不佳再考虑 DBSCAN 或层次聚类。

4. 实际应用案例

假设你是一家电商公司的数据分析师,拥有用户购买行为数据(如年龄、月消费金额)。你想将用户分为高价值、普通、低活跃三类:

  1. 使用 K-Means 聚类,通过肘部法则(Elbow Method)确定最佳 $ k = 3 $;
  2. 分析每个簇的中心点,解释其业务含义;
  3. 针对不同群体制定差异化营销策略。

5. 总结与展望

聚类算法作为无监督学习的基石,为我们理解数据的内在结构提供了强大工具。尽管每种算法都有其局限,但它们共同推动了数据挖掘、模式识别和信息检索的发展。随着深度学习与图神经网络的兴起,现代聚类方法也在不断演进,例如使用自编码器(Autoencoder)进行降维后再聚类等。

掌握这些经典算法不仅有助于解决实际问题,也为进一步探索更复杂的机器学习模型打下坚实基础。

🚀 动手实践:不妨用 sklearn.datasets.makeblobs 生成不同分布的数据集,对比不同聚类算法的表现!

如果你觉得这篇文章有帮助,欢迎点赞或分享,也欢迎在评论区讨论你最常用的聚类应用场景!