正在加载中...

展开本页目录
算法教程LOF-局部离群因子

LOF-局部离群因子

No.165 · 在线教程

LOF-局部离群因子 的真实核心主要位于:

LOF-局部离群因子

1. 方法概述

LOF-局部离群因子 的真实核心主要位于:

  • core/lof_calculator.py

从当前源码看,这个模块不是简单调用 sklearn 的 LocalOutlierFactor 黑盒,而是自己按 LOF 定义显式计算:

  1. \(k\) 近邻;
  2. \(k\)-distance;
  3. 可达距离;
  4. 局部可达密度;
  5. LOF 分数;
  6. 按固定阈值或分位数阈值给出异常标签。

这意味着它的每个中间量都能单独导出,非常适合写论文或做解释。

2. 数据预处理

2.1 特征矩阵

设处理后的特征矩阵为

$$ X=(x_{ij})_{n\times d} \tag{1} $$

代码要求:

  1. 必须显式选择特征列;
  2. 特征列会统一转为数值;
  3. NaN/inf 的样本行会被删除;
  4. 有效样本数至少为 3。

2.2 缩放

当前实现支持:

  • none
  • standard
  • min_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. 表 1 LOF 参数与邻域设置表
  2. 表 2 样本 k距离、局部可达密度与 LOF 结果表
  3. 表 3 Top 异常样本排序结果表
  4. 表 4 带标签场景下 LOF 检测性能指标表

7.4 图表题注模板

  1. 图 1 LOF 分数分布图及阈值位置示意图。
  2. 图 2 k距离 与局部可达密度对比图。
  3. 图 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.pnglof_sorted.pnglof_top.pngoutlier_ratio.pngpca_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.png
  • charts/lof_sorted.png
  • charts/lof_top.png
  • charts/outlier_ratio.png
  • charts/pca_2d.png

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

  • repro_inputs/lof_input.csv
  • repro_lof.py
  • repro_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.pyrepro_outputs/
  • 正文应围绕 k距离局部可达密度平均可达距离指标(可选)图表清单 来写。
  • 图证应对应 lof_hist.pnglof_sorted.pnglof_top.pngoutlier_ratio.pngpca_2d.png
  • 复现脚本应按 repro_lof.py + repro_inputs/lof_input.csv 的口径说明;repro_outputs/ 是再生产物目录,不能和主结果混写。