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

如何基于非线性阈值y=a/(|x|-c)识别数据框中的异常值

找出符合非线性阈值的异常值对应的z标识

没问题,这事儿好办!咱们一步步来搞定这个需求:

首先得明确核心逻辑:先给每个x值计算对应的阈值threshold = a/(abs(x)-c),然后根据你定义的“异常”规则(比如y超过阈值或者低于阈值)筛选出目标行,最后提取对应的z列标识就行。不过要先处理分母为0或负数的特殊情况,避免报错。

1. 设定参数并处理特殊值

先自定义你需要的a和c,比如我这里用a=10、c=2做示例。然后先过滤掉abs(x)-c <= 0的行——毕竟分母为0会报错,负数的话计算出来的阈值是负数,而你的y是0到5的正数,这种情况大概率也不符合你的异常判断逻辑:

# 自定义参数,按需修改
a <- 10
c <- 2

# 过滤掉分母无效的行,避免计算出错
df_filtered <- df[abs(df$x) > c, ]

2. 计算每行的阈值

接下来给过滤后的每行计算对应的非线性阈值:

df_filtered$threshold <- a / (abs(df_filtered$x) - c)

3. 筛选异常值并提取z标识

现在关键是定义“异常值”——你是想找y大于阈值的点,还是y小于阈值的点?两种情况我都给你写好示例:

情况1:找y大于阈值的异常值对应的z

# 筛选y超过阈值的行
outliers_above <- df_filtered[df_filtered$y > df_filtered$threshold, ]
# 提取对应的z标识
z_outliers_above <- outliers_above$z

情况2:找y小于阈值的异常值对应的z

# 筛选y低于阈值的行
outliers_below <- df_filtered[df_filtered$y < df_filtered$threshold, ]
# 提取对应的z标识
z_outliers_below <- outliers_below$z

(可选)可视化验证

要是想直观看看这些异常值的分布,用ggplot画个图就能一目了然:

library(ggplot2)

ggplot(df_filtered, aes(x = x, y = y)) +
  geom_point(alpha = 0.5, color = "gray") +
  # 画出红色的阈值曲线
  geom_line(aes(y = threshold), color = "red", linewidth = 1) +
  # 用蓝色标记出y超过阈值的异常值
  geom_point(data = outliers_above, aes(x = x, y = y), color = "blue", size = 2) +
  labs(title = "y vs x with Nonlinear Threshold", x = "x", y = "y") +
  theme_minimal()

小提醒

  • 如果你需要保留abs(x)-c <=0的行,可以单独处理:比如这些行计算出来的阈值会是Inf、-Inf或者NaN,你可以根据自己的业务逻辑判断这些行是否属于异常值。
  • 参数a和c可以随时修改,只要替换开头的a和c的值就行,完全灵活适配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:51