正在加载中...

展开本页目录
算法教程DBSCAN-密度聚类

DBSCAN-密度聚类

No.115 · 在线教程

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,其基本思想是:在给定邻域半径与最小样本数阈值的条件下,将高密度区域扩展为聚类,并将无法归入任何高密度区域的样本识…

DBSCAN-密度聚类

1. 方法概述

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,其基本思想是:在给定邻域半径与最小样本数阈值的条件下,将高密度区域扩展为聚类,并将无法归入任何高密度区域的样本识别为噪声点。与需要预先指定聚类数的算法不同,DBSCAN 更适合发现任意形状簇,同时能够显式区分核心点、边界点和噪声点。

本项目中的 DBSCAN-密度聚类 模块是对 sklearn.cluster.DBSCAN 的工程化封装。程序读取首列为样本 ID、其余列为数值特征的数据表,对特征进行可选归一化处理后,调用 DBSCAN.fit_predict 生成聚类标签,并额外输出核心样本标记、噪声比例、轮廓系数、聚类汇总表以及散点图。

设共有 \(n\) 个样本、\(p\) 个数值特征,原始数据矩阵记为

$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$

其中首列仅用于保存样本 ID,不参与距离计算;实际参与聚类的是首列之后的全部数值列。根据当前界面实现,指标设置页会把全部非 ID 列统一作为聚类特征,而不提供进一步筛选。

2. 问题定义与数据预处理

记第 \(i\) 个样本的特征向量为 \(x_i\in\mathbb{R}^p\)。项目支持 nonestandardminmax 三种预处理模式。

2.1 Z-score 标准化

normalization=standard 时,采用标准化变换

$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$

其中 \(\mu_j\) 与 \(\sigma_j\) 分别为第 \(j\) 个特征的样本均值与标准差。

2.2 Min-Max 归一化

normalization=minmax 时,采用线性缩放

$$ z_{ij}=\frac{x_{ij}-\min_i x_{ij}}{\max_i x_{ij}-\min_i x_{ij}} \tag{3} $$

normalization=none,则直接令 \(z_{ij}=x_{ij}\)。于是可得到用于 DBSCAN 的处理后特征矩阵

$$ Z=(z_{ij})_{n\times p} \tag{4} $$

2.3 符号说明

符号 含义
\(n\) 样本数量
\(p\) 参与聚类的特征维数
\(x_i\) 第 \(i\) 个样本的原始特征向量
\(z_i\) 第 \(i\) 个样本的预处理后特征向量
\(\varepsilon\) 邻域半径 eps
\(\mathrm{MinPts}\) 最小样本数阈值 min_samples
\(N_\varepsilon(z_i)\) 样本 \(z_i\) 的 \(\varepsilon\)-邻域
\(y_i\) 第 \(i\) 个样本的聚类标签,\(-1\) 表示噪声
\(c_i\) 核心样本标记,核心点取 1,否则取 0
\(K\) 最终簇数量,不含噪声簇
\(n_{\text{noise}}\) 噪声点数量

3. 核心数学模型

3.1 邻域定义与距离度量

对样本 \(z_i\),其 \(\varepsilon\)-邻域定义为

$$ N_\varepsilon(z_i)=\left\{z_j\mid d(z_i,z_j)\le \varepsilon\right\} \tag{5} $$

当前实现支持四种距离度量:euclideanmanhattanchebyshevminkowski。其中 Minkowski 距离可统一表示为

$$ d_q(z_i,z_j)=\left(\sum_{r=1}^{p}|z_{ir}-z_{jr}|^q\right)^{1/q} \tag{6} $$

当 \(q=2\) 时对应欧氏距离,当 \(q=1\) 时对应曼哈顿距离;切换到 chebyshev 时,距离定义为

$$ d_\infty(z_i,z_j)=\max_{1\le r\le p}|z_{ir}-z_{jr}| \tag{7} $$

对于 minkowski 选项,代码未额外暴露阶数参数,因此沿用 sklearn 的默认设定。

3.2 核心点、边界点与噪声点

若样本 \(z_i\) 的 \(\varepsilon\)-邻域中样本数不少于 \(\mathrm{MinPts}\),则称 \(z_i\) 为核心点:

$$ |N_\varepsilon(z_i)|\ge \mathrm{MinPts} \tag{8} $$

若样本自身不满足式(8),但落在某个核心点的 \(\varepsilon\)-邻域内,则可视为边界点:

$$ |N_\varepsilon(z_i)|<\mathrm{MinPts},\quad \exists z_j\ \text{为核心点且}\ z_i\in N_\varepsilon(z_j) \tag{9} $$

若样本既不是核心点,也不属于任何核心点的邻域,则被标记为噪声点:

$$ z_i\notin \bigcup_{z_j\in \mathcal{C}_{\text{core}}}N_\varepsilon(z_j) \tag{10} $$

在程序输出中,噪声点统一使用标签 \(y_i=-1\) 表示。

3.3 密度可达与聚类形成

若 \(z_j\in N_\varepsilon(z_i)\) 且 \(z_i\) 为核心点,则称 \(z_j\) 从 \(z_i\) 直接密度可达:

$$ z_j\in N_\varepsilon(z_i),\quad z_i\in \mathcal{C}_{\text{core}} \tag{11} $$

若存在点序列 \(z_{i_1},z_{i_2},\ldots,z_{i_m}\),使得相邻两点满足式(11),则称 \(z_{i_m}\) 从 \(z_{i_1}\) 密度可达。由此,一个聚类可理解为由某个核心点出发,经密度可达关系扩展得到的样本集合:

$$ \mathcal{G}_k=\left\{z_i\mid z_i\ \text{从某个核心种子点密度可达}\right\} \tag{12} $$

3.4 项目输出中的统计量

项目在 Labels 表中输出样本标签 \(y_i\) 与核心样本标记 \(c_i\)。其中核心点总数计算为

$$ n_{\text{core}}=\sum_{i=1}^{n}\mathbf{1}(c_i=1) \tag{13} $$

噪声比例计算为

$$ \rho_{\text{noise}}=\frac{n_{\text{noise}}}{n} \tag{14} $$

最终簇数量仅统计非噪声标签:

$$ K=\left|\{y_i\mid y_i\ge 0\}\right| \tag{15} $$

3.5 轮廓系数计算口径

程序会尝试计算轮廓系数,但并不是对全部样本直接计算,而是先剔除噪声点,仅在非噪声样本集合

$$ \mathcal{I}=\{i\mid y_i\neq -1\} \tag{16} $$

上计算

$$ \mathrm{Silhouette}= \frac{1}{|\mathcal{I}|}\sum_{i\in \mathcal{I}}\frac{b_i-a_i}{\max(a_i,b_i)} \tag{17} $$

其中 \(a_i\) 为样本 \(i\) 与同簇样本的平均距离,\(b_i\) 为其到最近其他簇样本的平均距离。只有当非噪声簇数量不少于 2,且非噪声样本数大于簇数量时,程序才会输出该指标;否则结果表中的轮廓系数留空。

4. 算法流程

结合当前项目实现,DBSCAN-密度聚类 的实际流程如下:

  1. 用户上传 .xlsx.xls.csv 文件,要求首列为样本 ID,其余列为数值特征。
  2. 进入数据校验阶段,程序检查:
    • 数据至少包含两列;
    • 首列样本 ID 不能重复;
    • 所有特征列必须为数值型且不含空值;
    • 所有特征列不能是常数列。
  3. 指标设置页读取首列之后的全部字段,并默认将其全部作为聚类特征。
  4. 在方法设置页输入 epsmin_samplesmetricnormalization
  5. 程序对特征矩阵执行可选标准化或归一化,得到处理后矩阵 \(Z\)。
  6. 调用 sklearn.cluster.DBSCAN 进行拟合,生成标签 \(y_i\),并通过 model.core_sample_indices_ 标记核心点。
  7. 汇总得到 LabelsSummaryMetricsParameters 等结果表。
  8. 若特征维数不少于 2,则基于处理后数据前两维绘制聚类散点图;若只有 1 个特征,则绘制单轴散点图。
  9. 最终把结果保存为 Excel 文件,并自动生成复现脚本 repro_dbscan_密度聚类.py

5. 关键参数说明

5.1 eps

eps 是邻域半径,决定一个样本在多大距离范围内可被视为“邻居”。当前界面允许范围为 0.011000.0,步长为 0.1,默认值为 0.5eps 过小会导致大量样本被判为噪声,过大则可能把原本分离的簇错误合并。

5.2 min_samples

min_samples 表示形成核心点所需的最小邻域样本数,当前界面允许范围为 11000,默认值为 5。该值越大,算法越倾向于把低密度区域识别为噪声;该值越小,越容易形成小规模簇。

5.3 metric

当前模块支持以下距离度量:

  • euclidean
  • manhattan
  • chebyshev
  • minkowski

该参数直接传入 sklearn.DBSCAN。不同度量会改变邻域结构,因此会显著影响核心点判定和最终聚类结果。

5.4 normalization

normalization 取值为:

  • none:不做缩放
  • standard:执行 z-score 标准化
  • minmax:执行 Min-Max 归一化

对于不同量纲并存的数据,若不做缩放,距离计算往往会被大尺度特征主导,因此通常建议优先试验 standardminmax

6. 评价指标与输出结果解释

程序最终输出的 Excel 文件包含以下工作表:

  1. RawData:原始输入数据。
  2. Features:参与聚类的原始特征矩阵。
  3. ProcessedData:归一化或标准化后的特征矩阵。
  4. Labels:样本 ID、聚类标签 label 和核心样本标记 is_core
  5. Summary:各标签对应的样本数量统计,其中 label=-1 表示噪声点。
  6. Metrics:样本数、特征数、簇数量、噪声点数量、噪声比例、核心点数量、轮廓系数。
  7. Parameters:算法参数及衍生统计量。
  8. Charts:图表文件路径索引。

当前结果目录组织形式为:

  1. results/DBSCAN-密度聚类分析结果_<时间戳>/dbscan_results_<时间戳>.xlsx
  2. results/DBSCAN-密度聚类分析结果_<时间戳>/dbscan_results_<时间戳>_plots/dbscan_cluster_scatter.png
  3. results/DBSCAN-密度聚类分析结果_<时间戳>/repro_dbscan_密度聚类.py
  4. results/DBSCAN-密度聚类分析结果_<时间戳>/repro_inputs/

图表绘制口径也与实现一致:

  1. 当特征维数不少于 2 时,使用处理后数据前两维作图。
  2. 核心点以圆点表示,边界点以方点表示,噪声点以灰色叉号表示。
  3. 当只有 1 个特征时,程序把该特征作为横轴,纵轴固定为 0,仅用于展示标签分布。

从论文解释角度看,若噪声比例较高,说明当前参数下只有少量区域满足高密度扩展条件;若核心点数量较多且轮廓系数较高,则说明有效聚类结构较为稳定。但 DBSCAN 的评价结果高度依赖 epsmin_samples 与距离度量,因此解释时应结合参数敏感性共同讨论。

7. 论文写作模板

7.1 方法描述模板

可将本项目的实现表述为:

“本文采用 DBSCAN 方法对样本进行密度聚类分析。首先对首列之外的全部数值特征进行整理,并根据研究需要选择是否进行标准化或归一化处理。随后以邻域半径 \(\varepsilon\) 和最小样本数 \(\mathrm{MinPts}\) 为控制参数,构造每个样本的 \(\varepsilon\)-邻域,并据此判定核心点、边界点与噪声点。对于可由核心点经密度可达关系扩展得到的样本集合,将其归为同一聚类;未归入任何聚类的样本记为噪声点。最终输出样本聚类标签、核心点标记、噪声比例及轮廓系数,用于评估聚类结构与异常分布情况。”

若论文需要更强调工程实现一致性,可进一步说明:本文实现基于 sklearn.cluster.DBSCAN,并支持 euclideanmanhattanchebyshevminkowski 四种距离度量,以及 nonestandardminmax 三种预处理模式。

7.2 结果解释模板

结果部分可写为:DBSCAN 在给定 \(\varepsilon\) 与 \(\mathrm{MinPts}\) 条件下识别出若干密度簇,并将无法归属到稳定密度区域的样本标记为噪声点。若噪声比例较高,应结合参数设定与样本分布讨论密度阈值是否过严;若轮廓系数较高,则说明密度可达形成的簇结构具有较好的可分性。

7.3 表格标题模板

表题可写为:DBSCAN 聚类结果、核心点统计与噪声比例汇总表。

7.4 图表题注模板

图注可写为:DBSCAN 聚类分布图及噪声样本识别结果。

7.5 表格示例

建议列名:样本编号、聚类标签、核心点标记、噪声标记、轮廓系数、参数设置。

8. 实现说明与注意事项

  1. 该模块适用于存在密度差异、可能含噪声点、且不希望预先指定聚类数的无监督聚类任务。
  2. 当前实现要求首列样本 ID 唯一;如果对象名称存在重复,程序会在上传后直接阻断。
  3. 所有特征列必须为数值型且不能为常数列,因此分类变量需先编码,常量字段需先删除。
  4. 当前指标设置页默认使用全部非 ID 特征列,不提供进一步特征勾选;如果研究只希望基于部分特征聚类,应在导入前先整理数据列。
  5. 轮廓系数仅在非噪声样本且至少存在两个有效簇时才计算,因此留空并不一定表示程序出错,而可能是当前 DBSCAN 结果不满足评价条件。
  6. 结果图仅基于处理后数据前两维绘制,不能完全代表高维空间中的真实簇分布。
  7. epsmin_samples 对结果影响极大,实际研究中应结合经验、k-distance 图或多组参数对比进行敏感性分析。
  8. 当数据各维尺度差异较大时,应优先考虑 standardminmax 预处理,否则距离计算可能被个别大尺度特征主导。

9. 论文写作建议

论文中建议重点报告:

  1. epsmin_samples 的设定依据;
  2. 噪声点数量及比例;
  3. 非噪声簇数量与簇规模;
  4. 轮廓系数或其他有效聚类指标。

如果结果中噪声点较多,不宜简单写成“聚类失败”,更合理的表述通常是“数据存在较多低密度离散样本”。正文中还可配合二维散点图展示核心簇与噪声点的空间分布。

10. 单篇终审补充

10.1 图题与表题对齐建议

当前 DBSCAN 模块的真实导出页名已经固定,建议论文终稿直接沿用:

  • RawData
  • Features
  • ProcessedData
  • Labels
  • Summary
  • Metrics
  • Parameters
  • Charts

其中 Summary 是正文最适合引用的主结果页,Labels 是样本标签明细,Metrics 是轮廓系数等统计指标,Parameters 保存 epsmin_samples、距离度量与标准化方式。不要把 Features 误写成“降维结果”,它只是参与聚类的特征表。

当前图文件位于结果目录 <xlsx文件名>_plots/ 子目录,程序生成的主图名为:

  • dbscan_cluster_scatter.png

因此图题建议写成“DBSCAN 聚类散点图”。不要写成“k-distance 曲线图”或“可达距离图”,因为当前实现并没有导出这些调参辅助图。

10.2 终审说明

当前实现不会输出簇中心,因此论文不应把 DBSCAN 写成“中心型聚类方法并输出中心向量”。真实软件是通过 LabelsSummary 和散点图来表达结果,其中噪声点直接编码为 -1,这才是与实现一致的描述。

另外,结果目录中的较新 repro 脚本已经统一采用 repro_inputs/... 相对路径。也就是说,这一模块的“可复现性”表述可以直接按新框架写,不需要像旧算法那样保留绝对路径兼容说明。

10.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/DBSCAN-密度聚类,本次选定的真实结果目录为 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240。这一轮目录结构比较干净,主工作簿、主图、复现脚本和 repro_inputs 来自同一时间戳,不应再与旧的 enhanced 回归目录或 pytest 目录混写。

该目录下主结果工作簿为 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240/dbscan_results_20260329_171240.xlsx,实测工作表为:

  • RawData
  • Features
  • ProcessedData
  • Labels
  • Summary
  • Metrics
  • Parameters
  • Charts

这里的真实页名再次说明当前实现并不输出簇中心,而是以 LabelsSummary 为主结果表达,Features 只是参与聚类的特征表。正文如果要写“结果表”,应优先引用 SummaryMetrics;如果要说明样本级分簇,应引用 Labels,而不是虚构一个并不存在的中心表。

本轮主图位于 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240/dbscan_results_20260329_171240_plots/dbscan_cluster_scatter.png。该目录下没有额外的 k-distance 图、可达距离图或 condensed tree 图,所以图题只能按真实导出写成“DBSCAN 聚类散点图”。

复现实物方面,本轮目录实际包含:

  • 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240/repro_dbscan_密度聚类.py
  • 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240/repro_inputs/window1_dbscan_meanshift_input.csv

脚本内已固定为 INPUT_FILE = 'repro_inputs/window1_dbscan_meanshift_input.csv',这说明复现实验输入已经从绝对路径切换到结果目录内部的相对路径副本。与此同时,该轮目录没有预置 dbscan_repro.xlsx,因此应把当前目录描述为“主结果 + 可执行 repro 入口”,而不是“主结果和 repro 再生产物均已同轮固化”。

8. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/聚类与降维/DBSCAN-密度聚类/results/DBSCAN-密度聚类分析结果_20260329_171240
  • 正文应围绕 LabelsSummaryMetricsParametersFeaturesCharts 来写。
  • 图证应对应 dbscan_cluster_scatter.png,并把噪声点 -1 与簇解释清楚。
  • 复现脚本应按 repro_dbscan_密度聚类.py + repro_inputs/window1_dbscan_meanshift_input.csv 的口径说明。