LOF-局部离群因子
LOF-局部离群因子 的真实核心主要位于:
LOF-局部离群因子
1. 方法概述
LOF-局部离群因子 的真实核心主要位于:
core/lof_calculator.py
从当前源码看,这个模块不是简单调用 sklearn 的 LocalOutlierFactor 黑盒,而是自己按 LOF 定义显式计算:
- \(k\) 近邻;
- \(k\)-distance;
- 可达距离;
- 局部可达密度;
- LOF 分数;
- 按固定阈值或分位数阈值给出异常标签。
这意味着它的每个中间量都能单独导出,非常适合写论文或做解释。
2. 数据预处理
2.1 特征矩阵
设处理后的特征矩阵为
$$ X=(x_{ij})_{n\times d} \tag{1} $$
代码要求:
- 必须显式选择特征列;
- 特征列会统一转为数值;
- 含
NaN/inf的样本行会被删除; - 有效样本数至少为 3。
2.2 缩放
当前实现支持:
nonestandardmin_max
标准化形式可写为
$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$
3. LOF 主计算
3.1 \(k\) 近邻与 \(k\)-distance
设 \(N_k(i)\) 表示样本 \(i\) 的 \(k\) 个近邻集合,且 \(k\)-distance 为
$$ k\text{-dist}(i)=\text{样本 }i\text{ 到第 }k\text{ 个近邻的距离} \tag{3} $$
代码会自动把 \(k\) 调整到合法范围:
- 至少为 2;
- 至多为 \(n-1\)。
3.2 可达距离
对样本 \(i\) 与其邻居 \(o\),可达距离为
$$ \mathrm{reach}\text{-}\mathrm{dist}_k(i,o)=\max\big(k\text{-dist}(o),\ d(i,o)\big) \tag{4} $$
3.3 局部可达密度
代码按均值可达距离的倒数定义局部可达密度:
$$ \mathrm{lrd}_k(i)=\frac{1}{\frac{1}{|N_k(i)|}\sum_{o\in N_k(i)}\mathrm{reach}\text{-}\mathrm{dist}_k(i,o)+\varepsilon} \tag{5} $$
3.4 LOF 分数
最终 LOF 分数为
$$ \mathrm{LOF}_k(i)=\frac{\frac{1}{|N_k(i)|}\sum_{o\in N_k(i)}\mathrm{lrd}_k(o)}{\mathrm{lrd}_k(i)+\varepsilon} \tag{6} $$
因此:
- \(\mathrm{LOF}\approx 1\) 时更接近局部正常;
- \(\mathrm{LOF}>1\) 时说明比邻域更稀疏;
- LOF 越大,越可疑。
4. 阈值与评估
4.1 auto 阈值
若 contamination='auto',代码直接使用经验阈值
$$ \tau=1.5 \tag{7} $$
并按
$$ \hat y_i= \begin{cases} 1,& \mathrm{LOF}_k(i)\ge \tau\\ 0,& \text{otherwise} \end{cases} \tag{8} $$
判定异常。
4.2 指定污染率时的阈值
若用户给出具体污染率 \(c\in(0,0.5]\),代码改用分位数阈值:
$$ \tau=Q_{1-c}(\mathrm{LOF}) \tag{9} $$
4.3 有标签时的评价
若存在标签列,代码会把 -1 映射为异常,并尝试计算
$$ \mathrm{ROC\text{-}AUC} \tag{10} $$
但当前实现只显式保留 roc_auc,不会像一些分类器那样同时输出整套 Accuracy/Precision/Recall/F1。
5. 输出结果与论文应用
5.1 Excel 工作表
当前模块导出:
参数结果解读原始数据清洗后特征X缩放后特征X标签(可选)LOF得分异常点Top20特征描述统计相关系数(可选)k距离局部可达密度平均可达距离指标(可选)图表清单
5.2 论文写作表述建议
可以写成:
- 采用局部离群因子(LOF)刻画样本相对于局部邻域的稀疏程度;
- 通过 \(k\)-distance、可达距离和局部可达密度计算 LOF 分数;
- 当 LOF 大于阈值时,将样本判为异常点。
6. 实现说明与注意事项
6.1 当前实现是显式手工 LOF
也就是说,它不是完全依赖现成 API,而是把 k_distance / lrd / mean_reachability / lof 都算出来并导出,这一点非常适合论文附录或结果解释。
6.2 auto 并不等于自动估计污染率
当前代码里 auto 的含义是“直接用经验阈值 1.5”,而不是根据数据自动学习一个最优污染率。
6.3 结果排序按 LOF 分数降序
项目输出的 异常排名 来自 LOF分数 的降序排序,因此即使标签阈值不同,Top 样本的排序依据始终是 LOF 数值本身。
7. 论文写作模板
7.1 方法描述模板
“本文采用局部离群因子(LOF)方法刻画样本相对于其局部邻域的稀疏程度。该方法首先确定样本的 \(k\)-近邻与 \(k\)-distance,再通过可达距离和局部可达密度比较样本与邻域的局部结构差异,并以 LOF 值作为异常性量化指标。依据项目当前实现,LOF 的各个中间量均由代码显式计算并导出,而非完全依赖现成 API,因此论文中可直接报告 k-distance、局部可达密度与 LOF 值的计算口径。若使用 contamination='auto',还应明确指出当前实现采用经验阈值 1.5。”
7.2 结果解释模板
结果部分可写为:LOF 值越大,说明样本相对于其局部邻域越稀疏,因此越可能为异常点。若某些样本同时表现为较大的 k距离、较低的局部可达密度和较高的 LOF 分数,则可认为其局部异常性较为稳定。论文中建议同时展示异常样本排序表、局部密度指标表与 LOF 分布图,以增强对异常形成机制的解释;若存在真实标签,可进一步补充 Precision、Recall、F1 与 ROC-AUC 评价结果。
7.3 表格标题模板
- 表 1 LOF 参数与邻域设置表
- 表 2 样本
k距离、局部可达密度与 LOF 结果表 - 表 3 Top 异常样本排序结果表
- 表 4 带标签场景下 LOF 检测性能指标表
7.4 图表题注模板
- 图 1 LOF 分数分布图及阈值位置示意图。
- 图 2
k距离与局部可达密度对比图。 - 图 3 LOF 异常样本局部结构可视化结果图。
7.5 表格示例
表 1 LOF 异常样本排序结果表示例
| 样本编号 | k_distance |
lrd |
lof |
是否异常 |
|---|---|---|---|---|
| \(i_1\) | ||||
| \(i_2\) |
表注:当 lof 超过设定阈值时,样本被判定为异常;若使用 auto,阈值取项目当前实现中的经验值 1.5。
8. 单篇终审补充
8.1 图题与表题对齐建议
参数表可写为:表X LOF 参数与邻域设置表。结果解读表可写为:表X LOF 结果解释摘要表。原始数据表可写为:表X LOF 原始数据表。清洗后特征X表可写为:表X LOF 清洗后特征矩阵表。缩放后特征X表可写为:表X LOF 缩放后特征矩阵表。标签(可选)表可写为:表X LOF 标签信息表。LOF得分表可写为:表X LOF 得分结果表。异常点Top20表可写为:表X LOF Top20 异常样本排序表。特征描述统计表可写为:表X LOF 特征描述统计表。相关系数(可选)表可写为:表X LOF 特征相关系数表。k距离表可写为:表X LOF k 距离结果表。局部可达密度表可写为:表X LOF 局部可达密度结果表。平均可达距离表可写为:表X LOF 平均可达距离结果表。指标(可选)表可写为:表X LOF 检测指标汇总表。图表清单表可写为:表X LOF 图表索引与路径清单。lof_hist.png建议写为:图X LOF 分数分布图。lof_sorted.png建议写为:图X LOF 分数排序图。lof_top.png建议写为:图X LOF Top 异常样本图。outlier_ratio.png建议写为:图X LOF 异常比例图。pca_2d.png建议写为:图X LOF PCA 二维散点图。
8.2 终审说明
- 当前代表性结果目录采用
run_1/、run_2/分层结构,每层下再含一个具体时间戳结果目录;因此论文若引用 LOF 结果,必须写清楚属于哪一轮run_x,不能只写外层总目录名。 - 当前真实工作表非常细,除了
LOF得分外,还单独导出了k距离、局部可达密度、平均可达距离。若正文要解释 LOF 形成机制,应优先结合这三张中间量表,而不是仅引用最终排序。 - 当前实体图文件主要包括
lof_hist.png、lof_sorted.png、lof_top.png、outlier_ratio.png、pca_2d.png。终稿图题应按这组真实文件名落地,不要替换成通用“异常检测可视化图”。 - 真实 repro 脚本为
repro_lof.py,并通过INPUT_FILE = BASE_DIR / 'repro_inputs' / 'lof_input.csv'读取输入副本,同时将新结果写入repro_outputs/。附录里的复现实验说明应保留这两个相对路径目录。 - 当前实现会把
contamination='auto'解释为经验阈值1.5,这一点与 sklearn 或其他 LOF 实现口径可能不同。论文中若出现“auto”,必须同步给出项目当前的具体解释。
8.3 全量强化补充
本篇终审补充绑定的真实算法目录为 具体的算法3/异常检测/LOF-局部离群因子,本次采用的代表性结果目录为 具体的算法3/异常检测/LOF-局部离群因子/results/lof_enhanced_regression_20260320_002434/run_1/LOF-局部离群因子分析结果_20260320_002434。这里应按 run_1 的内层时间戳目录绑定,而不能只写外层 enhanced 目录名。
主结果工作簿为 具体的算法3/异常检测/LOF-局部离群因子/results/lof_enhanced_regression_20260320_002434/run_1/LOF-局部离群因子分析结果_20260320_002434/LOF-局部离群因子分析结果_20260320_002434.xlsx,实测工作表为:
参数结果解读原始数据清洗后特征X缩放后特征X标签(可选)LOF得分异常点Top20特征描述统计相关系数(可选)k距离局部可达密度平均可达距离指标(可选)图表清单
这套页名说明当前结果不仅输出最终 LOF 排序,还保留了 k距离、局部可达密度 和 平均可达距离 这些机制性中间结果。因此论文若要解释 LOF 原理,应优先结合这些页,而不是只贴 Top20 异常样本表。
当前目录中的真实图文件为:
charts/lof_hist.pngcharts/lof_sorted.pngcharts/lof_top.pngcharts/outlier_ratio.pngcharts/pca_2d.png
复现实物方面,该目录实际包含:
repro_inputs/lof_input.csvrepro_lof.pyrepro_outputs/LOF-局部离群因子分析结果_20260320_002437/...
其中 repro_lof.py 真实写法是 INPUT_FILE = BASE_DIR / 'repro_inputs' / 'lof_input.csv',OUTPUT_DIR = BASE_DIR / 'repro_outputs'。也就是说,这一轮目录不仅保留了主结果,还保留了脚本再运行后产出的完整 repro_outputs/ 子目录。文档里必须把“主结果目录”和“repro_outputs/ 再生产物目录”拆开写,不能把它们当成同一次主运行结果。
9. 软件实现核查补充(2026-07)
- 当前主结果目录应按已有正文绑定的 LOF 代表性结果目录书写,并明确其包含主工作簿、
charts/、repro_lof.py与repro_outputs/。 - 正文应围绕
k距离、局部可达密度、平均可达距离、指标(可选)、图表清单来写。 - 图证应对应
lof_hist.png、lof_sorted.png、lof_top.png、outlier_ratio.png、pca_2d.png。 - 复现脚本应按
repro_lof.py + repro_inputs/lof_input.csv的口径说明;repro_outputs/是再生产物目录,不能和主结果混写。