大家好,我是爱酱。本篇将会系统讲解朴素聚类方法中的两大经典代表:层次聚类(Hierarchical Clustering)和密度聚类(Density-Based Clustering, 以DBSCAN为例)。内容包括基本原理、算法流程、数学表达、实际案例和工程应用,适合初学者和进阶读者。
注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!
一、聚类是什么?
聚类(Clustering)是无监督学习中的一种基础任务,目标是将数据集中的样本按照相似性自动分组,使得同一组内的样本相似度高,不同组间的样本差异大。聚类广泛应用于数据探索、客户分群、图像分析、异常检测等领域。
二、层次聚类(Hierarchical Clustering)
1. 基本思想
层次聚类是一种通过构建“层级结构”来分组数据的无监督聚类方法。其核心思想是根据样本间的距离或相似度,逐步合并或分裂样本,最终形成一棵聚类树(dendrogram)。
-
凝聚型(自底向上,Agglomerative):每个样本初始为一个单独的簇,逐步合并最近的两个簇,直到所有样本合并为一个簇或达到预设簇数。
-
分裂型(自顶向下,Divisive):所有样本初始为一个大簇,逐步将簇拆分为更小的子簇,直到每个样本单独成簇或达到预设簇数。
2. 距离度量与合并准则
-
常用距离度量:欧氏距离、曼哈顿距离、余弦相似度等。
-
合并/分裂准则(Linkage):
-
最短距离(Single Linkage):两簇最近点的距离。
-
最长距离(Complete Linkage):两簇最远点的距离。
-
平均距离(Average Linkage):两簇所有点对的平均距离。
-
中心距离(Centroid Linkage):簇中心之间的距离。
-
3. 算法流程(以凝聚型为例)
-
计算所有样本对之间的距离,初始化每个样本为一个簇。
-
找到距离最近的两个簇,合并为新簇。
-
更新距离矩阵(根据选定的linkage方式)。
-
重复步骤2-3,直到只剩一个簇或达到指定簇数。
4. 数学表达
假设有个样本,距离矩阵为
,每次合并距离最小的两个簇
:
其中为两簇间的距离,根据不同linkage方式有不同计算公式。
5. 结果展示
-
层次聚类结果通常用树状图(dendrogram)展示,直观反映聚类过程和层级关系。
三、密度聚类(Density-Based Clustering, 以DBSCAN为例)
1. 基本思想
密度聚类以DBSCAN(Density-Based Spatial Clustering of Applications with Noise)为代表,通过数据点的“密度”来定义簇。核心思想是:簇是数据空间中密度较高的区域,簇之间被密度较低的区域分隔。
2. 关键概念
-
核心点(Core Point):以该点为中心、半径
的邻域内,至少包含MinPts个点。
-
边界点(Border Point):本身邻域内点数不足MinPts,但在某个核心点的邻域内。
-
噪声点(Noise/Outlier):既不是核心点,也不是任何核心点邻域内的边界点。
3. 算法流程
-
对每个未访问点,查找其
邻域内的所有点。
-
如果邻域点数
MinPts,将该点标为核心点,创建新簇。
-
递归将邻域内所有密度可达的点加入同一簇。
-
对剩余未分配的点重复上述过程。
-
未能归入任何簇的点视为噪声。
4. 数学表达
-
-邻域:
-
核心点判定:
爱酱也单独发过密度聚类(DBSCAN)的文章介绍,内容非常深入,并包含大量代码演示跟范例,欢迎大家去看看,加深对这个算法的了解!
传送门——
【AI深究】密度聚类(DBSCAN)全网最详细全流程详解与案例(附Python代码演示)| 数学定义与公式 | DBSCAN算法 | 实际案例与流程 | 代码实现 | 优、缺点分析_dbscan算法l流程图代码-优快云博客
四、层次聚类与密度聚类的代码实现与可视化
1. 层次聚类(Hierarchical Clustering)代码示例
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
# 生成二维数据
np.random.seed(0)
X = np.vstack([
np.random.normal(loc=[2, 2], scale=0.4, size=(30, 2)),
np.random.normal(loc=[6, 6], scale=0.4, size=(30, 2)),
np.random.normal(loc=[2, 6], scale=0.4, size=(30, 2))
])
# 层次聚类(凝聚型,平均距离)
Z = linkage(X, method='average')
# 绘制树状图
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()
# 指定聚类数,划分簇
clusters = fcluster(Z, t=3, criterion='maxclust')
plt.figure(figsize=(6, 6))
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='rainbow', s=50)
plt.title('Hierarchical Clustering Result')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
代码说明:
-
用
scipy.cluster.hierarchy
实现凝聚型层次聚类,linkage
方法可选'average'(平均距离)、'single'(最短距离)、'complete'(最长距离)等。 -
dendrogram
绘制树状图,展示聚类层级关系。 -
fcluster
指定聚类数,得到每个点的簇标签,散点图直观显示聚类效果。
2. 密度聚类(DBSCAN)代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
# 生成二维数据(含噪声)
np.random.seed(0)
X = np.vstack([
np.random.normal(loc=[2, 2], scale=0.3, size=(30, 2)),
np.random.normal(loc=[6, 6], scale=0.3, size=(30, 2)),
np.random.normal(loc=[4, 4], scale=0.8, size=(40, 2))
])
# DBSCAN聚类
db = DBSCAN(eps=0.5, min_samples=5)
labels = db.fit_predict(X)
# 可视化聚类结果
plt.figure(figsize=(6, 6))
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
class_member_mask = (labels == k)
xy = X[class_member_mask]
if k == -1:
# 噪声点
plt.scatter(xy[:, 0], xy[:, 1], c=[col], marker='x', s=80, label='Noise')
else:
plt.scatter(xy[:, 0], xy[:, 1], c=[col], marker='o', s=50, label=f'Cluster {k+1}')
plt.title('DBSCAN Clustering Result')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
代码说明:
-
用
sklearn.cluster.DBSCAN
实现密度聚类,设置邻域半径eps
和最小点数min_samples
。 -
labels=-1
表示噪声点,其余为不同簇。 -
可视化显示不同簇和噪声点,体现DBSCAN对异常点的识别能力。
五、优缺点与工程应用建议
层次聚类
优点:
-
不需预先指定簇数(可根据树状图后期裁剪)。
-
能反映数据的层级结构。
-
适合小样本、结构清晰的数据。
缺点:
-
计算复杂度高,难以扩展到大规模数据。
-
对噪声和离群点敏感。
-
聚类结果不可逆,合并/分裂后无法回退。
应用建议:
-
常用于生物信息学(如基因表达分析)、文档归类、市场细分等领域。
-
适合探索性分析和可视化数据结构。
密度聚类(DBSCAN)
优点:
-
能发现任意形状的簇。
-
自动识别噪声点,无需预设簇数。
-
对异常值鲁棒。
缺点:
-
对参数
eps
和min_samples
敏感,参数选择需结合数据分布。 -
在高维数据或密度变化大的数据上效果有限。
应用建议:
-
适合空间数据聚类、异常检测、图像分割等任务。
-
常用于地理信息分析、社交网络分析等领域。
六、总结
层次聚类和密度聚类是无监督学习中两类经典的朴素聚类方法。层次聚类通过递归合并或分裂样本,构建数据的层级结构,适用于小规模、结构清晰的数据分析与可视化。密度聚类以DBSCAN为代表,能发现任意形状的簇并自动识别噪声,适合空间分布复杂、含异常点的数据场景。理解这两类聚类方法的原理、优缺点和工程应用,有助于在实际项目中灵活选择合适的聚类策略。
谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力。
如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!