BIRCH-BIRCH
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)原本是一类基于聚类特征(Clustering Feature, CF)树的层次聚类方法,适用于大规模数据的逐步压缩与聚类分析。本项目中的 BIR…
BIRCH-BIRCH
1. 方法概述
BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)原本是一类基于聚类特征(Clustering Feature, CF)树的层次聚类方法,适用于大规模数据的逐步压缩与聚类分析。本项目中的 BIRCH-BIRCH 模块并未完整实现标准 CF 树结构,而是采用面向表格数据的简化 BIRCH 流程:先对选定特征进行标准化,然后按样本顺序构建 CF 子簇;当子簇数量超过给定上限时,通过放宽阈值重新构建子簇;若用户指定最终聚类数,则在子簇中心上执行带权 KMeans 二次聚类,最终得到样本聚类标签、聚类中心、子簇信息和评价指标。
设样本数为 \(n\),参与聚类的特征数为 \(p\)。记原始特征矩阵为
$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$
其中第 1 列以外的字段均为数值型特征,首列仅作为样本标识参与结果回填,不参与距离计算。
2. 符号定义与问题描述
对第 \(i\) 个样本,记其特征向量为 \(x_i\in\mathbb{R}^p\)。若启用标准化,则模块对每一列执行 z-score 变换:
$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j},\qquad \mu_j=\frac{1}{n}\sum_{i=1}^{n}x_{ij},\ \sigma_j=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_{ij}-\mu_j)^2} \tag{2} $$
若某一列 \(\sigma_j=0\),实现中将其置为 1,以避免除零错误。经过预处理后得到聚类输入矩阵 \(Z=(z_{ij})_{n\times p}\);若用户关闭标准化,则 \(Z=X\)。
本模块的目标是基于 \(Z\) 构建若干子簇,并在需要时进一步压缩为 \(K\) 个最终聚类,使得同簇样本在欧氏距离意义下尽量接近,不同簇中心尽量分离。
2.1 符号说明
| 符号 | 含义 |
|---|---|
| \(n\) | 样本数量 |
| \(p\) | 参与聚类的特征维数 |
| \(x_i\) | 第 \(i\) 个样本的原始特征向量 |
| \(z_i\) | 第 \(i\) 个样本的标准化后特征向量 |
| \(\mu_j,\sigma_j\) | 第 \(j\) 个特征的均值与标准差 |
| \(CF_s\) | 第 \(s\) 个子簇的聚类特征三元组 |
| \(N_s,LS_s,SS_s\) | 子簇样本数、线性和与平方和 |
| \(u_s\) | 第 \(s\) 个子簇中心 |
| \(\tau\) | 子簇并入阈值 threshold |
| \(M\) | 构建完成后的子簇数量 |
| \(K\) | 最终聚类数 n_clusters |
| \(w_s\) | 第 \(s\) 个子簇在二次聚类中的权重,取 \(N_s\) |
| \(\mu_k\) | 第 \(k\) 个最终聚类中心 |
| \(y_i\) | 第 \(i\) 个样本的最终聚类标签 |
3. 核心数学模型
3.1 CF 子簇表示
对第 \(s\) 个子簇,模块用三元组 \((N_s,LS_s,SS_s)\) 表示其聚类特征:
$$ CF_s=(N_s,LS_s,SS_s) \tag{3} $$
其中 \(N_s\) 为子簇样本数,\(LS_s=\sum z_i\) 为线性和,\(SS_s=\sum z_i\odot z_i\) 为逐维平方和。由此可得子簇中心
$$ u_s=\frac{LS_s}{N_s} \tag{4} $$
以及实现中定义的子簇平均离散度
$$ r_s=\frac{1}{p}\sum_{j=1}^{p}\sqrt{\max\left(\frac{SS_{sj}}{N_s}-u_{sj}^2,\ 0\right)} \tag{5} $$
其中 \(r_s\) 用于描述子簇内部离散程度,但当前实现的合并判据主要依赖样本到子簇中心的欧氏距离,而不是严格的半径或直径约束。
3.2 子簇构建与更新规则
当新样本 \(z_i\) 到来时,先寻找最近子簇中心:
$$ s^*=\arg\min_{1\le s\le M}\|z_i-u_s\|_2 \tag{6} $$
若最近距离不超过阈值 \(\tau\),则将该样本并入对应子簇;否则新建一个子簇:
$$ \|z_i-u_{s^*}\|_2\le\tau\Rightarrow \begin{cases} N_{s^*}\leftarrow N_{s^*}+1\\ LS_{s^*}\leftarrow LS_{s^*}+z_i\\ SS_{s^*}\leftarrow SS_{s^*}+z_i\odot z_i \end{cases} \tag{7} $$
若 \(\|z_i-u_{s^*}\|_2>\tau\),则令
$$ CF_{M+1}=(1,z_i,z_i\odot z_i) \tag{8} $$
从而形成新的子簇。这里的构建方式是按样本顺序单遍扫描完成,因此具有一定的顺序敏感性。
3.3 子簇数量控制与阈值重建
模块中的 branching_factor 并不是标准 BIRCH 中 CF 树节点的分支数,而是子簇数量上限。若单次扫描得到的子簇个数 \(M\) 超过该上限,则系统放宽阈值后从头重建子簇。设第 \(t\) 次重建使用的阈值为 \(\tau^{(t)}\),则有
$$ \tau^{(t+1)}=1.2\,\tau^{(t)} \tag{9} $$
实现中最多执行 max_rebuild=5 次重建;若仍超出上限,则保留最后一次放宽阈值后的结果。
3.4 子簇级带权 KMeans 二次聚类
若用户设置最终聚类数 \(K=n_{\text{clusters}}\),且满足 \(0<K<M\),则模块在子簇中心集合 \(\{u_s\}_{s=1}^{M}\) 上执行带权 KMeans,其中权重取子簇规模 \(w_s=N_s\)。其优化目标可写为
$$ \min_{\{\mathcal{G}_k,\mu_k\}_{k=1}^{K}} \sum_{k=1}^{K}\sum_{u_s\in\mathcal{G}_k}w_s\|u_s-\mu_k\|_2^2 \tag{10} $$
在簇划分给定时,第 \(k\) 个最终中心的更新公式为
$$ \mu_k=\frac{\sum_{u_s\in\mathcal{G}_k}w_su_s}{\sum_{u_s\in\mathcal{G}_k}w_s} \tag{11} $$
实现中该过程采用随机种子 42 初始化中心,最多迭代 100 次;若某一类在迭代中变为空簇,则从现有子簇中心中随机抽取一点重新作为该类中心。若 \(K\le 0\) 或 \(K\ge M\),则模块不再执行二次聚类,而是直接以全部子簇中心作为最终聚类中心。
3.5 样本最终归属与评价指标
无论最终中心来自子簇中心还是带权 KMeans,样本标签都按“样本到最终中心最近”重新分配:
$$ y_i=\arg\min_{1\le k\le K}\|z_i-\mu_k\|_2 \tag{12} $$
基于最终标签 \(y_i\) 与中心 \(\mu_k\),模块计算簇内平方和(SSE):
$$ \mathrm{SSE}=\sum_{i=1}^{n}\|z_i-\mu_{y_i}\|_2^2 \tag{13} $$
Calinski-Harabasz 指数为
$$ \mathrm{CH}= \frac{\displaystyle \frac{1}{K-1}\sum_{k=1}^{K}n_k\|\mu_k-\bar z\|_2^2} {\displaystyle \frac{1}{n-K}\sum_{i=1}^{n}\|z_i-\mu_{y_i}\|_2^2} \tag{14} $$
其中 \(n_k\) 为第 \(k\) 个簇的样本数,\(\bar z\) 为总体均值。对 Davies-Bouldin 指数,先定义簇内平均离散度
$$ s_k=\frac{1}{n_k}\sum_{y_i=k}\|z_i-\mu_k\|_2 \tag{15} $$
则 DB 指数为
$$ \mathrm{DB}=\frac{1}{K}\sum_{k=1}^{K}\max_{l\ne k}\frac{s_k+s_l}{\|\mu_k-\mu_l\|_2} \tag{16} $$
轮廓系数采用“同簇平均距离与最近异簇平均距离”的比较思想。记 \(a_i\) 为样本 \(i\) 与同簇样本的平均距离,\(b_i\) 为其到最近异簇的平均距离,则
$$ \mathrm{Silhouette}= \frac{1}{n}\sum_{i=1}^{n}\frac{b_i-a_i}{\max(a_i,b_i)} \tag{17} $$
其中 Silhouette 越大越好,CH 越大越好,DB 越小越好,SSE 越小说明簇内更紧凑。需要注意的是,项目实现为控制计算量,在样本数超过 500 时会先随机抽样 500 个样本,再计算轮廓系数,因此该指标在大样本情形下是采样近似值,而非全样本精确值。
4. 算法流程
结合本项目实现,BIRCH-BIRCH 的计算流程可概括为:
- 读取用户上传的数据表,要求首列为样本名称,其余列为无缺失的数值特征。
- 在特征选择页勾选参与聚类的特征列,形成矩阵 \(X\)。
- 若
standardize=True,按式(2) 对各特征执行 z-score 标准化,得到 \(Z\)。 - 按样本顺序逐个扫描 \(Z\),根据式(6) 至式(8) 构建 CF 子簇。
- 若子簇数超过
branching_factor,按式(9) 放宽阈值并整体重建,最多重建 5 次。 - 若设置 \(0<K<M\),则对子簇中心执行带权 KMeans,按式(10) 至式(11) 得到最终中心;否则直接以子簇中心作为最终中心。
- 按式(12) 为全部样本重新分配最终标签,并计算式(13) 至式(17) 所示指标。
- 输出聚类结果、聚类中心、子簇中心、子簇规模、参数配置、评价指标和散点图,并生成复现脚本
repro_birch.py。
5. 关键参数说明
5.1 threshold
threshold 为样本并入最近子簇的距离阈值。该值越小,生成的子簇通常越多、簇结构越细;该值越大,更容易把新样本吸收到已有子簇中。界面允许取值范围为 0.001 到 10.0,步长为 0.05,默认值为 0.5。
5.2 branching_factor
在本实现中,branching_factor 表示允许保留的子簇最大数量,默认值为 50,界面允许范围为 2 到 500。当子簇数超过该上限时,程序不会像标准 BIRCH 那样扩展 CF 树,而是通过提高 threshold 重新构建子簇,因此该参数的工程含义更接近“压缩粒度控制”。
5.3 n_clusters
n_clusters 为最终聚类数,界面允许范围为 0 到 200,默认值为 3。若 0 < n_clusters < M,系统对子簇中心执行带权 KMeans;若 n_clusters=0 或 \(n_{\mathrm{clusters}}\ge M\),则最终聚类直接等于全部子簇。结果文件中的 参数配置 sheet 会记录实际生效的最终聚类数,因此当用户输入值与最终子簇数量关系不满足二次聚类条件时,输出中的 n_clusters 可能等于实际最终簇数而非原始输入值。
5.4 standardize
standardize 控制是否对特征执行 z-score 标准化。对于量纲差异明显的指标,应优先启用该选项;若变量本身已处于统一尺度,也可关闭。
5.5 feature_cols
该参数记录实际参与聚类的特征列集合。由于距离、子簇构建与评价指标全部基于这些列完成,因此论文中必须明确说明特征筛选范围。
6. 评价指标与输出结果解释
本模块在结果页和 Excel 文件中输出以下核心内容:
原始数据:首列样本标识与所选特征的原始观测值。处理后数据:标准化后的聚类输入矩阵;若未标准化,则与原始特征保持一致。聚类结果:每个样本对应的最终聚类标签 \(y_i\)。聚类中心:最终聚类中心 \(\mu_k\) 的逐维取值。聚类规模:每个最终簇包含的样本数量。子簇中心与子簇规模:CF 压缩阶段形成的中间结构,用于解释二次聚类前的数据压缩结果。评价指标:SSE、CH、DB、Silhouette 四项无监督聚类指标。参数配置:包含threshold、branching_factor、n_clusters、standardize、所选特征列及标准化均值/标准差,便于复现。Charts与散点图:当特征维数不少于 2 时,系统基于处理后数据前两维绘制聚类散点图,用颜色区分不同簇。
项目实际结果目录组织为:
results/BIRCH-BIRCH分析结果_<时间戳>/BIRCH_results_<时间戳>.xlsxresults/BIRCH-BIRCH分析结果_<时间戳>/BIRCH_plots_<时间戳>/scatter.pngresults/BIRCH-BIRCH分析结果_<时间戳>/repro_birch.pyresults/BIRCH-BIRCH分析结果_<时间戳>/repro_inputs/
其中 repro_birch.py 会自动写入输入文件路径、特征列与方法参数,便于复现实验。若输入文件不可直接复制,则程序会将当前数据表导出为 birch_repro_data.csv 作为复现输入。
从论文解释角度看,若 Silhouette 与 CH 较高、DB 与 SSE 较低,通常可认为当前聚类结果具有更好的紧凑性与分离性;但最终结论仍需结合具体业务语义、特征含义和簇规模分布共同判断。若最终只形成 1 个簇,或样本数不大于簇数,则程序会将部分指标记为 NaN,此时应避免机械解读评价结果。
7. 论文写作模板
7.1 方法描述模板
可将本项目中的实现表述为:
“本文采用 BIRCH-BIRCH 模块对样本进行无监督聚类分析。首先根据研究目标选择参与聚类的指标,并对特征变量进行 z-score 标准化处理。随后按照样本顺序构建 CF 子簇,当样本到最近子簇中心的欧氏距离不超过阈值时,将其并入现有子簇,否则新建子簇。若子簇数量超过设定上限,则通过放宽阈值重新构建子簇。在此基础上,进一步对子簇中心执行按子簇规模加权的 KMeans 聚类,得到最终聚类中心与样本标签。最后采用 SSE、Calinski-Harabasz 指数、Davies-Bouldin 指数及轮廓系数评价聚类效果,并结合聚类中心与簇规模解释样本的结构性差异。”
若需要更强调实现一致性,也可在文中补充说明:本研究使用的是基于 CF 子簇压缩与二次加权聚类的工程化 BIRCH 方案,而非完整 CF 树结构的标准 BIRCH。
7.2 结果解释模板
结果部分可写为:BIRCH 聚类后共得到 \(K\) 个有效簇,各簇在样本规模、中心位置和类内离散程度上表现出明显差异。若轮廓系数较高且 Davies-Bouldin 指数较低,则说明聚类结果具有较好的分离度与紧凑性;若部分簇规模过小,则应结合阈值设置讨论其是否代表边缘样本群体。
7.3 表格标题模板
表题可写为:BIRCH 聚类结果与评价指标汇总表。
7.4 图表题注模板
图注可写为:BIRCH 聚类样本分布及聚类中心示意图。
7.5 表格示例
建议列名:簇编号、样本数、样本占比、中心坐标、SSE、CH 指数、DBI、轮廓系数。
8. 实现说明与注意事项
- 该模块适用于以表格数据为主、样本首列为名称、其余列为数值特征的无监督聚类问题。
- 数据校验要求数据至少包含两列,且首列之后的所有列均为数值型并且不含空值;首列样本名称允许重复,因此同名样本不会被系统直接拒绝。
- 当前实现不直接支持类别变量编码、缺失插补或异常值稳健处理,这些步骤应在聚类前完成。
- 结果页散点图仅使用处理后数据的前两维特征绘制,并不是经过 PCA 或其他降维后的二维投影,因此图形主要用于直观展示,而不能完全替代高维聚类结构解释。
- 由于子簇构建采用顺序扫描,结果对样本输入顺序可能存在一定敏感性;在论文中如需强调稳健性,建议补充顺序扰动或参数敏感性分析。
branching_factor在本实现中表示子簇数量上限,而非标准 BIRCH 的树分支数;论文描述时不宜照搬经典教材定义。- 当
n_clusters=0时,结果反映的是“子簇级压缩结构”而非固定簇数的最终聚类,此时更适合作为探索性分析。 - 若需要与标准 BIRCH 文献严格对齐,应在方法说明中明确指出本项目采用的是简化实现,并说明最终阶段引入了子簇级带权 KMeans。
9. 论文写作建议
论文结果部分建议至少放 4 类信息:
- 参数配置表;
- 聚类中心与簇规模表;
- 子簇结构表;
- SSE、CH、DB、Silhouette 评价指标表。
若论文更关注方法一致性,应明确写出:当前实现是“CF 子簇压缩 + 二次带权 KMeans”的工程化 BIRCH,而不是标准 CF 树完整实现。解释结果时,建议同时结合最终簇和中间子簇,不要只看最终标签。
10. 单篇终审补充
10.1 图题与表题对齐建议
当前 BIRCH 模块的真实导出工作簿以中文页名为主,论文终稿建议直接按程序输出写表题。实际结果页包括:
原始数据处理后数据聚类结果聚类中心聚类规模子簇中心子簇规模评价指标参数配置Charts
其中 聚类结果 是正文主表,聚类中心 与 聚类规模 适合结果章节,子簇中心 与 子簇规模 更适合作为 BIRCH 两阶段压缩结构的实现证据。Charts 只是图路径索引页,不是嵌图页。
图文件保存在结果目录下形如 BIRCH_plots_<timestamp>/ 的子目录中,当前实现的主图名为:
scatter.png
因此图题建议写成“BIRCH 聚类散点图”,不要写成树状图或 CF 树图,因为当前程序没有导出这些图。
10.2 终审说明
这篇文档最容易误写的地方,是把当前实现说成“标准 BIRCH 完整 CF 树实现”。从真实代码看,软件先做子簇压缩,再对子簇中心做带权二次聚类,因此 子簇中心 与 子簇规模 是非常关键的中间结果。论文若只保留最终簇标签,会丢掉本实现最有辨识度的工程特征。
另外,当前结果目录中同时存在 repro_birch.py 与 repro_birch_birch.py 两类脚本,但它们都已经采用 repro_inputs/... 相对路径口径。论文或软件说明里可以统一表述为“结果目录包含基于 repro_inputs 的复现实验脚本”,不必把脚本名写死成单一文件。
10.3 全量强化补充
本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/BIRCH-BIRCH,本次优先采用的真实结果目录为 具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236。这里应把 BIRCH_results_20260329_171236.xlsx 视为主结果工作簿,而不是把同目录内的复现脚本误写成已经落地的第二份结果。
该主工作簿实测包含以下工作表:
原始数据处理后数据聚类结果聚类中心聚类规模子簇中心子簇规模评价指标参数配置Charts
这套页名说明当前软件确实同时保留了最终聚类结果与 BIRCH 压缩阶段的中间证据,因此正文引用时应优先将 聚类结果、聚类规模 作为主结果表,将 子簇中心、子簇规模 作为“CF 压缩后再聚类”的实现支撑表。若论文只保留最终标签和中心,会把本实现最关键的工程差异删掉。
图文件在 具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236/BIRCH_plots_20260329_171236/scatter.png,因此这一轮真实主结果只绑定一张散点图。当前目录里没有与主工作簿并列的预生成 birch_repro.xlsx,所以不能把这一轮目录写成“主结果 + 已执行 repro 结果双工作簿并存”的口径。
复现实物方面,这一轮目录里实际存在:
具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236/repro_birch.py具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236/repro_birch_birch.py具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236/repro_inputs/window1_birch_input.csv具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236/repro_inputs/birch_birch_repro_data.csv
脚本源码中已实锤采用相对路径口径,即 repro_birch.py 使用 INPUT_FILE = 'repro_inputs/window1_birch_input.csv',repro_birch_birch.py 使用 INPUT_FILE = 'repro_inputs/birch_birch_repro_data.csv'。因此这里应明确区分两件事:BIRCH_results_20260329_171236.xlsx 是该轮主导出成果,两个 repro_*.py 是该轮保留下来的复现入口,而不是已经执行完成的再生产物。
8. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/聚类与降维/BIRCH-BIRCH/results/BIRCH-BIRCH分析结果_20260329_171236。 - 正文应围绕
聚类结果、聚类规模、子簇中心、子簇规模、参数设置、评价指标来写。 - 图证应对应
scatter.png,并把 CF 压缩后的二次聚类口径说明清楚。 - 复现入口应按
repro_birch.py/repro_birch_birch.py + repro_inputs/...的口径说明;它们是复现入口,不是已执行完成的再生产物。