KDE_OD-核密度异常
KDEOD-核密度异常 的真实核心主要位于:
KDE_OD-核密度异常
1. 方法概述
KDE_OD-核密度异常 的真实核心主要位于:
core/kde_od_calculator.py
从当前源码看,这个模块实现的是基于核密度估计的异常检测流程:
- 选择 ID 列、特征列、标签列;
- 处理缺失值并做可选缩放;
- 训练
KernelDensity; - 以样本对数密度的相反数作为异常分数;
- 用污染率、分位数或 z-score 规则给出阈值;
- 导出得分表、异常样本表、指标与图表。
2. 数据预处理
2.1 缺失值处理
代码支持:
dropmeanmedianzero
2.2 缩放
支持:
nonestandardminmaxrobust
2.3 特征矩阵
设预处理后的特征矩阵为
$$ X=(x_{ij})_{n\times d} \tag{1} $$
如果样本数小于 2,代码会直接拒绝运行。
3. 带宽选择与核密度
3.1 Scott 带宽
若选择 scott,代码使用
$$ h_{\text{Scott}}=n^{-1/(d+4)} \tag{2} $$
3.2 Silverman 带宽
若选择 silverman,代码使用
$$ h_{\text{Silverman}}=\left(\frac{n(d+2)}{4}\right)^{-1/(d+4)} \tag{3} $$
3.3 交叉验证带宽
若选择 cv,代码会在对数网格上搜索
$$ h^*=\arg\max_h \mathrm{CVScore}(h) \tag{4} $$
并将最优 bandwidth 写入输出参数 final_bandwidth。
3.4 KDE 密度与异常分数
对样本 \(x_i\),核密度估计可写为
$$ \hat f(x_i)=\frac{1}{nh^d}\sum_{k=1}^{n}K\!\left(\frac{x_i-x_k}{h}\right) \tag{5} $$
代码通过 model.score_samples(X) 获得对数密度:
$$ \ell_i=\log \hat f(x_i) \tag{6} $$
并定义异常分数
$$ S_i=-\ell_i \tag{7} $$
因此密度越低,\(S_i\) 越大,越可能是异常点。
4. 阈值规则
4.1 污染率阈值
若选择 threshold_method=contamination,则
$$ \tau=Q_{1-\text{contamination}}(S) \tag{8} $$
4.2 分位数阈值
若选择 percentile,则
$$ \tau=Q_q(S) \tag{9} $$
其中 \(q\) 对应 percentile。
4.3 z-score 阈值
若选择 zscore,则
$$ \tau=\bar S+k\,\mathrm{std}(S) \tag{10} $$
其中 \(k\) 对应参数 zscore_k。
4.4 最终标签
代码按
$$ \hat y_i= \begin{cases} 1,& S_i\ge \tau\\ 0,& \text{otherwise} \end{cases} \tag{11} $$
输出 is_anomaly。
5. 输出结果、评价指标与论文应用
5.1 有标签时的指标
若提供标签列,代码假设其满足“1=异常,0=正常”,并计算:
$$ \mathrm{Precision}=\frac{TP}{TP+FP},\quad \mathrm{Recall}=\frac{TP}{TP+FN},\quad \mathrm{F1}=\frac{2PR}{P+R} \tag{12} $$
同时还会统计:
tpfpfntn
5.2 Excel 工作表
当前项目导出:
ParametersMetricsRawDataProcessedDataScoresMergedAnomaliesCharts
5.3 论文写作表述建议
可以写成:
- 采用核密度估计对样本空间概率密度进行拟合;
- 以负对数密度作为异常强度分数;
- 根据污染率、分位数或 z-score 规则确定异常阈值;
- 对超过阈值的样本判定为异常。
6. 实现说明与注意事项
6.1 该模块的核心是 -log_density
因此论文中若要和软件输出完全一致,建议直接把异常分数写成式(7)。
6.2 带宽选择会显著影响结果
带宽过大时会把局部稀疏结构抹平,带宽过小时又容易把噪声误判为异常,因此 scott/silverman/manual/cv 的选择应在报告中说明。
6.3 当前模块不会自动学习未来阈值
阈值完全来自当前样本分布,因此当数据批次变化明显时,阈值也会随之变化。
7. 论文写作模板
7.1 方法描述模板
“本文采用基于核密度估计的低概率样本识别方法,首先利用核函数对样本分布进行拟合,然后以样本对数密度的相反数构造异常分数,并结合阈值规则识别异常样本。依据项目当前实现,带宽既可按 scott、silverman 等经验规则给定,也可通过交叉验证或手动指定方式设置;阈值则支持污染率、分位数与 z-score 三种规则。因此,论文中应同步报告带宽选择方式、阈值规则及其参数设置。”
7.2 结果解释模板
结果部分可写为:异常分数越大,说明样本对应的估计概率密度越低,因此越可能位于数据分布的稀疏区域。若带宽设置过大,则局部异常结构可能被平滑;若带宽过小,则噪声样本可能被过度放大,因此应结合带宽选择方式对结果进行讨论。论文结果部分宜同时展示异常样本排序表、阈值说明表与分数分布图,从而把参数选择、评分机制与最终异常判别逻辑统一起来。
7.3 表格标题模板
- 表 1 KDE 异常检测带宽与阈值规则设置表
- 表 2 样本核密度异常分数排序结果表
- 表 3 Top 异常样本识别结果表
- 表 4 带标签场景下 KDE 检测性能指标表
7.4 图表题注模板
- 图 1 KDE 异常分数分布图及阈值位置示意图。
- 图 2 不同带宽设置下的异常分数对比图。
- 图 3 KDE 异常样本识别结果可视化图。
7.5 表格示例
表 1 KDE 异常检测结果表示例
| 样本编号 | 对数密度 | 异常分数 | 阈值规则 | 预测标签 |
|---|---|---|---|---|
| \(i_1\) | ||||
| \(i_2\) |
表注:异常分数按负对数密度构造,分数越大表示样本越偏离主体分布;阈值规则需结合 contamination、quantile 或 z-score 参数共同解释。
8. 单篇终审补充
8.1 图题与表题对齐建议
Parameters表可写为:表X KDE 异常检测参数与带宽设置表。Metrics表可写为:表X KDE 检测性能指标汇总表。RawData表可写为:表X KDE 原始数据表。ProcessedData表可写为:表X KDE 处理后数据表。Scores表可写为:表X KDE 样本异常分数结果表。Merged表可写为:表X KDE 异常分数与标签合并结果表。Anomalies表可写为:表X KDE Top 异常样本结果表。Charts表可写为:表X KDE 图表索引与路径清单。score_hist.png建议写为:图X KDE 异常分数分布图。pca_scatter.png建议写为:图X KDE PCA 二维散点图。
8.2 终审说明
- 当前代表性结果目录采用“结果目录 +
repro_outputs/子目录”的嵌套结构,真实主工作簿为KDE_OD-核密度异常分析结果_时间戳.xlsx,复现运行则会在repro_outputs/下再生成一层新的结果目录。论文附录若描述复现实验目录结构,应把这一点写清楚。 - 当前真实工作表为
Parameters/Metrics/RawData/ProcessedData/Scores/Merged/Anomalies/Charts,并不额外导出单独的阈值表。因此正文若讨论阈值规则,应在文字中解释,而不是声称工作簿已单列阈值 sheet。 - 当前实体图文件主要是
score_hist.png与pca_scatter.png,终稿图题应围绕“分数分布”和“二维投影结果”展开,不要虚构带宽比较图,除非该次实验目录里真实生成了对应文件。 - 真实 repro 脚本为
repro_kde_od.py,并通过INPUT_FILE = BASE_DIR / 'repro_inputs' / 'kde_od_input.csv'读取输入副本。附录若展示脚本片段,应保持这种BASE_DIR / repro_inputs的相对路径风格。 - 当前结果目录下可能并存多次时间戳输出与多次 repro 输出。论文若引用某次结果,必须绑定具体目录时间戳,避免把不同轮次导出混作同一实验结果。
8.3 全量强化补充
- 本轮按真实磁盘再次核对,算法目录为
具体的算法3/异常检测/KDE_OD-核密度异常,代表性结果目录为具体的算法3/异常检测/KDE_OD-核密度异常/results/pytest_kde_ui/KDE_OD-核密度异常分析结果_20260329_170125。 - 该目录的主工作簿为
KDE_OD-核密度异常分析结果_20260329_170125.xlsx,实际工作表为Parameters、Metrics、RawData、ProcessedData、Scores、Merged、Anomalies、Charts。该工作簿没有Threshold独立 sheet,阈值规则应从Parameters/Metrics与正文说明中解释。 - 当前主图目录为
charts/,其中实体图为score_hist.png与pca_scatter.png。复现运行会在repro_outputs/KDE_OD-核密度异常分析结果_20260329_170127/下生成新的工作簿和新的charts/目录,工作表结构与主结果一致。 - 当前输入副本位于
repro_inputs/kde_od_input.csv,repro_kde_od.py中明确写有INPUT_FILE = BASE_DIR / 'repro_inputs' / 'kde_od_input.csv',并把复现输出写入OUTPUT_DIR = BASE_DIR / 'repro_outputs'。因此它属于“标准输入副本 + 嵌套复现输出目录”结构。 - 需要区分两个层级:
results/pytest_kde_ui是测试聚合目录,KDE_OD-核密度异常分析结果_20260329_170125才是可引用的单次结果目录。论文或交付清单不应把pytest_kde_ui直接写成一次算法运行结果。 - 旧的
20251231目录只包含主 xlsx 和charts/,没有 repro 脚本;若需要证明复现链路,应优先引用20260329_170125这一带repro_inputs与repro_outputs的目录。
9. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/异常检测/KDE_OD-核密度异常/results/pytest_kde_ui/KDE_OD-核密度异常分析结果_20260329_170125。 - 正文应围绕
Parameters、Metrics、RawData、ProcessedData、Scores、Merged、Anomalies、Charts来写。 - 图证应对应
score_hist.png与pca_scatter.png,并把repro_outputs/下的新结果目录作为复现再生产物说明。 - 复现脚本应按
repro_kde_od.py + repro_inputs/kde_od_input.csv的口径说明。