之前学习的回归和分类一般属于监督式学习,接下来学习一下无监督学习,因为聚类任务一般都是通过无监督学习来实现的,所以我们本文主要讲解聚类任务。

聚类算法概述

在机器学习中,不涉及深度学习的无监督聚类算法主要通过挖掘数据的相似度、密度、分布或空间结构实现自动分组,以下是最常见的几类及其核心特点:

一、基于划分的聚类算法

这类算法直接将数据划分为预设数量的簇,通过优化 “簇内紧凑、簇间分散” 的目标函数迭代求解。

1. Kmeans(K - 均值聚类)

  • 核心思想:

    • 手动指定簇数 K,随机选择 K 个初始 “质心”(簇中心);

    • 迭代:将每个样本分配到最近的质心所在簇,再计算新的质心(簇内样本均值);

    • 直到质心稳定或迭代结束。

  • 优点:简单高效,适合大规模数据,时间复杂度低(O (n),n 为样本数);

  • 缺点:需提前确定 K 值,对初始质心敏感,仅适用于凸形簇(如球形),对噪声和异常值敏感;

  • 适用场景:客户分群、简单图像颜色聚类、文本主题初步分组。

2. K-medoids(K - 中心聚类)

  • 核心思想:改进 Kmeans,用簇中 “实际样本”(而非均值)作为质心,减少异常值影响。

  • 优点:抗噪声能力强于 Kmeans;

  • 缺点:计算效率低于 Kmeans(需比较样本间距离),仍需指定 K;

  • 适用场景:含少量异常值的中小规模数据(如用户行为数据分群)。

3. PAM(围绕中心点的划分)

  • 核心思想:K-medoids 的经典实现,通过最小化 “簇内样本到中心的距离总和” 优化,更稳健但计算成本高。

  • 适用场景:小规模数据(如几十到几百样本)的聚类。

二、基于密度的聚类算法

通过数据的 “密度分布” 划分簇,能识别任意形状的簇,且可自动排除噪声。

1. DBSCAN(密度聚类)

  • 核心思想:

    • 定义 “核心点”:半径 ε 内至少包含 MinPts 个样本的点;

    • 核心点通过 “密度可达” 关系形成簇,非核心点且不被核心点覆盖的为噪声。

  • 优点:无需指定簇数,能处理任意形状簇(如环形、月牙形),抗噪声能力强;

  • 缺点:对参数 ε(半径)和 MinPts 敏感,高维数据中 “密度” 定义模糊(距离失效);

  • 适用场景:空间数据聚类(如地理位置分群)、含噪声的复杂形状数据(如传感器数据异常检测)。

2. OPTICS(有序点识别聚类结构)

  • 核心思想:DBSCAN 的改进,通过计算 “可达距离” 生成聚类顺序图,可在不同密度下识别簇,减少对参数的依赖。

  • 优点:能发现不同密度的簇,参数鲁棒性更强;

  • 缺点:结果解读较复杂,计算效率低于 DBSCAN;

  • 适用场景:数据密度差异大的场景(如既有密集簇也有稀疏簇)。

3. Mean Shift(均值漂移)

  • 核心思想:通过 “密度梯度上升” 找到数据分布的峰值(密度最大点),样本向最近峰值 “漂移”,最终形成簇。

  • 优点:无需指定簇数,能处理任意形状簇,对噪声不敏感;

  • 缺点:计算耗时(需迭代漂移),依赖核函数带宽(影响邻域范围);

  • 适用场景:目标跟踪(视频中物体聚类)、图像分割(复杂纹理场景)。

三、基于层次的聚类算法

通过构建 “层次树”(树状图)实现聚类,可分为 “自底向上”(凝聚式)和 “自顶向下”(分裂式)。

1. 层次凝聚聚类(Agglomerative Clustering)

  • 核心思想:

    • 初始每个样本为一个簇,迭代合并最相似的两个簇(通过簇间距离度量,如单链接、全链接、平均链接);

    • 直到所有样本合并为一个簇或达到预设簇数。

  • 优点:无需指定簇数,可通过树状图直观展示层次关系;

  • 缺点:计算复杂度高(O (n³)),不适合大规模数据,合并后无法拆分;

  • 适用场景:小规模数据的层次化分组(如生物物种分类、文本主题层级聚类)。

2. BIRCH(平衡迭代减少聚类)

  • 核心思想:通过 “聚类特征树(CF Tree)” 压缩数据,适合超大规模数据(百万级样本),速度极快。

  • 优点:内存效率高,可处理海量数据;

  • 缺点:对高维数据效果差,适合低维、凸形簇;

  • 适用场景:大规模数据的初步聚类(如日志数据快速分组)。

四、基于模型的聚类算法

假设数据服从某种概率分布,通过拟合模型参数实现聚类。

1. GMM(高斯混合模型)

  • 核心思想:假设数据由 K 个高斯分布混合生成,通过 EM 算法估计每个分布的参数(均值、协方差),样本属于概率最高的分布对应的簇。

  • 优点:能输出样本属于每个簇的概率(软聚类),适合近似高斯分布的数据;

  • 缺点:需指定 K,对非高斯分布数据拟合差,易陷入局部最优;

  • 适用场景:语音识别(声学特征聚类)、基因表达数据分析(假设基因表达服从高斯分布)。

五、基于网格的聚类算法

将数据空间划分为网格单元,通过网格内样本密度聚类,计算效率极高。

1. STING(统计信息网格)

  • 核心思想:将数据空间递归划分为多层网格,每个网格存储统计信息(如样本数、均值),通过网格间的统计特性判断簇。

  • 优点:速度快(时间复杂度与数据量无关,仅依赖网格数);

  • 缺点:精度依赖网格粒度,不适合高维数据(网格数量爆炸);

  • 适用场景:低维、大规模空间数据(如地图坐标聚类)。

六、其他经典聚类算法

1. 谱聚类(Spectral Clustering)

  • 核心思想:将数据映射到低维空间(通过拉普拉斯矩阵特征值分解),再用 Kmeans 聚类,适合非线性可分数据。

  • 优点:能处理复杂形状簇,理论基础扎实;

  • 缺点:计算复杂度高(依赖矩阵分解),对参数敏感;

  • 适用场景:图像分割、社交网络社区发现(节点聚类)。

2. HDBSCAN(层次密度聚类)

  • 核心思想:DBSCAN 的改进,自动调整半径 ε,通过 “密度层次树” 发现不同密度的簇,参数鲁棒性更强。

  • 优点:解决 DBSCAN 对参数的依赖,保留密度聚类的优势;

  • 缺点:计算成本高于 DBSCAN;

  • 适用场景:替代 DBSCAN 的大多数场景,尤其数据密度差异大时。

总结:算法选择依据

数据特点 推荐算法
大规模、凸形簇 Kmeans、BIRCH
任意形状簇、含噪声 DBSCAN、HDBSCAN、Mean Shift
中小规模、层次化结构 层次凝聚聚类
近似高斯分布数据 GMM
高维、非线性可分数据 谱聚类(需先降维)
低维、空间数据 STING、DBSCAN

这些算法均不涉及深度学习,完全基于传统机器学习的统计方法或几何原理,是处理无标签数据聚类的基础工具。实际应用中需结合数据规模、维度、分布形状和业务目标选择,并通过评估指标(如轮廓系数、Calinski-Harabasz 指数)验证效果。

我们这里主要讲述Kmeans和Mean Shift这两种算法

Kmeans

Kmeans(K - 均值聚类)是机器学习中最经典的无监督学习算法之一,用于将无标签数据自动划分为 K 个不同的簇(类别)。它基于样本间的 “距离”(通常是欧氏距离)进行聚类,目标是让簇内数据尽可能相似,簇间数据尽可能不同。以下是其核心概念、流程和特点的详细介绍:

一、核心思想与原理

核心目标: 将 n 个样本划分到 K 个簇中,使得每个样本属于离其最近的簇中心(质心),并最小化 簇内误差平方和(Inertia):

“均值” 的含义: 每个簇的中心是该簇所有样本在特征空间中的平均值(例如二维空间中,质心是所有点的坐标平均值)。

二、算法流程(以欧氏距离为例)

  1. 初始化: 随机选择 K 个样本作为初始质心(Cluster Centroid)。

  2. 分配样本: 计算每个样本到 K 个质心的距离,将样本分配到距离最近的质心所在的簇。

  3. 更新质心: 重新计算每个簇内所有样本的均值,作为新的质心。

  4. 迭代收敛: 重复步骤 2 和 3,直到质心不再显著移动(或达到最大迭代次数)。

三、关键参数与优化

  • K 值的选择:

    • 需手动指定,常用方法:

      • 肘部法(Elbow Method):绘制不同 K 值对应的 Inertia 曲线,选择 “拐点”(斜率突然变缓的点);

      • 轮廓系数(Silhouette Coefficient):评估簇内凝聚度和簇间分离度,值越大越好。

  • 初始化方法:

    • 随机初始化可能导致局部最优,推荐使用 Kmeans++(初始质心尽可能远,加速收敛)。

  • 距离度量:

    • 常用欧氏距离,也可根据数据类型选择曼哈顿距离、余弦相似度等。

四、优缺点与适用场景

优点:

  • 原理简单,实现高效,适合大规模数据;

  • 时间复杂度低(O (nKt),n 为样本数,K 为簇数,t 为迭代次数);

  • 可扩展性强,支持并行计算。

缺点:

  • 需手动指定 K 值,且对结果影响大;

  • 仅适用于凸形簇(如球形),对非凸形状(如环形、月牙形)效果差;

  • 对初始质心敏感,可能陷入局部最优;

  • 对噪声和异常值敏感(均值易受极端值影响);

  • 高维数据效果差(维度灾难导致距离度量失效)。

适用场景:

  • 客户分群(如 RFM 模型);

  • 图像分割(如按颜色聚类像素);

  • 文本聚类(如新闻主题分组);

  • 数据预处理(如特征压缩)。

五、改进与变种

  1. K-medoids(K - 中心点聚类): 用簇内实际样本(而非均值)作为中心,抗噪声能力更强。

  2. Mini-Batch Kmeans: 每次迭代仅用一小部分样本更新质心,大幅提升效率,适合超大规模数据。

  3. Kernel Kmeans: 通过核函数将数据映射到高维空间,处理非线性可分的数据。

  4. 二分 Kmeans(Bisecting Kmeans): 递归地将一个簇分为两个,直到达到 K 个簇,减少局部最优问题。

六、与其他聚类算法的对比

算法 Kmeans DBSCAN 层次聚类
簇数 K 需手动指定 自动发现 可灵活选择
簇形状 仅凸形 任意形状 任意形状
对噪声敏感
计算复杂度 O (nKt),高效 O (n²),中等 O (n³),高
适用数据规模 大规模 中小规模 小规模

七、代码示例(Python)

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 生成模拟数据(3个簇)
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)

# 初始化Kmeans模型
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, random_state=0)

# 拟合数据并预测簇标签
y_pred = kmeans.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='x')
plt.title('Kmeans Clustering (K=3)')
plt.show()

执行结果如下:

总结

Kmeans 是聚类算法的入门选择,适合快速处理大规模数据并发现 “自然分组”。但其依赖手动调参(K 值)和数据分布(凸形簇),实际应用中需结合数据特性选择更合适的算法(如 DBSCAN、高斯混合模型)。

Mean Shift

Mean Shift(均值漂移)是一种基于密度的无监督聚类算法,通过迭代寻找数据分布的 “密度峰值”(局部最大值)来实现自动聚类。它无需预设簇的数量,能识别任意形状的簇,且对噪声不敏感,广泛应用于计算机视觉(如目标跟踪)、图像处理等领域。以下是其核心原理、流程和特点的详细介绍:

优缺点与适用场景

优点:

  • 无需预设簇数量,自动发现数据中的簇结构;

  • 能识别任意形状的簇(如环形、月牙形),不局限于凸形;

  • 对噪声和离群点不敏感(通过核函数加权降低影响);

  • 理论基础扎实,基于非参数密度估计。

缺点:

  • 计算复杂度高(O (n²),n 为样本数),对大规模数据效率低;

  • 对核带宽参数敏感,需谨慎选择;

  • 无法处理密度差异大的簇(可能漏检低密度区域的簇)。

适用场景:

  • 计算机视觉中的目标跟踪(如视频中人脸 / 车辆的持续定位);

  • 图像分割(如按颜色 / 纹理聚类像素);

  • 异常检测(识别远离高密度区域的样本);

  • 数据分布探索(发现数据的多峰结构)。

代码示例如下:

from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np

# 生成模拟数据(2个簇,形状不规则)
X, _ = make_blobs(n_samples=300, centers=2, cluster_std=0.80, random_state=0)

# 自动估计核带宽(关键参数)
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=50)

# 初始化Mean Shift模型
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)

# 拟合数据并预测簇标签
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

# 获取簇数量
n_clusters_ = len(np.unique(labels))

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], s=200, c='red', marker='x')
plt.title(f'Mean Shift Clustering (Estimated clusters: {n_clusters_})')
plt.show()

执行结果:

变种与扩展

  1. Hierarchical Mean Shift: 通过不同带宽的迭代,发现不同尺度下的簇结构,适合多层次数据。

  2. Kernelized Mean Shift: 使用核技巧将数据映射到高维空间,增强非线性聚类能力。

  3. Fast Mean Shift: 通过近似算法(如 KD 树)加速邻域搜索,提升大规模数据处理效率。

总结

Mean Shift 是一种优雅的密度聚类算法,特别适合无需先验知识、需识别复杂形状簇的场景。但其计算开销较大,对参数敏感,实际应用中需权衡效率与效果。对于大规模数据,可考虑使用 Mini-Batch Kmeans 或 DBSCAN 等更高效的算法。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐