You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于损失值列表精准设置尾部起始处的异常值检测阈值?

基于KDE图定位异常值阈值的方法

要精准找到KDE曲线尾部起始处的阈值(即密度局部最小值位置),可以按以下步骤操作:

1. 拟合KDE并提取密度数据

先对损失值列表拟合KDE曲线,同时提取对应的损失值(x轴)和密度值(y轴)数据,确保x轴覆盖足够宽的范围(包含尾部区域)。
示例代码:

import numpy as np
from scipy.stats import gaussian_kde

# loss_list为你的损失值列表
loss_array = np.array(loss_list)
# 拟合KDE
kde_model = gaussian_kde(loss_array, bw_method='scott')
# 生成密集的x点,覆盖损失值范围并延伸至尾部
x_values = np.linspace(loss_array.min(), loss_array.max() * 1.2, 1000)
# 计算对应密度
density_values = kde_model(x_values)

2. 定位局部最小值

目标是找到密度曲线从下降转为上升的谷底点(右侧尾部的起始位置):

  • 计算密度的一阶导数,找到导数由负变正的索引(对应密度从递减转递增的位置)
  • 从候选点中选取x值最大的那个,即为右侧尾部的分界阈值

示例代码:

# 计算一阶导数
density_derivative = np.diff(density_values)
# 寻找导数从负变正的位置(密度谷底)
crossover_idx = np.where(np.diff(np.sign(density_derivative)) > 0)[0]

if crossover_idx.size > 0:
    # 取最右侧的谷底点作为阈值
    threshold = x_values[crossover_idx[-1] + 1]
    print(f"识别到的阈值:{threshold:.4f}")
else:
    # 若无明显谷底,用分位数法兜底(比如99%分位数)
    threshold = np.percentile(loss_array, 99)
    print(f"无明显局部最小值,使用99%分位数作为阈值:{threshold:.4f}")

3. 验证与微调

  • 将识别出的阈值绘制到KDE图上,直观确认是否处于尾部起始位置
  • 若曲线波动较大,可调整KDE的带宽参数(如bw_method),让曲线更平滑后重新计算阈值;也可结合业务场景,对阈值进行小幅手动调整

补充说明

如果损失值分布没有明显的密度谷底(比如尾部平缓延伸),可以结合业务容忍度,用分位数法(如95%/99%分位数)或3σ原则作为替代,但优先以KDE的局部最小值为基准,因为它更贴合数据的实际分布特征。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:09:56