【问题标题】:Detecting outliers from a list从列表中检测异常值
【发布时间】:2019-08-09 21:05:41
【问题描述】:

我想从列表中检测和存储异常值,这就是我正在做的事情

代码:

def outliers(y,thresh=3.5):
    
    m = np.median(y)
    abs_dev = np.abs(y - m)
    left_mad = np.median(abs_dev[y <= m])
    right_mad = np.median(abs_dev[y >= m])
    y_mad = left_mad * np.ones(len(y))
    y_mad[y > m] = right_mad
    modified_z_score = 0.6745 * abs_dev / y_mad
    modified_z_score[y == m] = 0
    return modified_z_score > thresh

bids = [5000,5500,4500,1000,15000,5200,4900]

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z]

结果如下:

out_liers = array([ 1000, 15000])

有没有更好的方法来做到这一点,我不是在数组中而是在列表中得到结果? 另外请有人解释一下我们为什么使用

thresh=3.5

modified_z_score = 0.6745 * abs_dev / y_mad

【问题讨论】:

  • 如果你需要一个列表而不是 numpy 数组,numpy 数组很方便地提供了一个tolist 函数:out_liers.tolist()。您的其他疑问最好由代码的原作者回答。

标签: python arrays python-3.x list outliers


【解决方案1】:

这行得通:

def outliers_modified_z_score(ys, threshold=3.5):
    ys_arr = np.array(ys)
    median_y = np.median(ys_arr)
    median_absolute_deviation_y = np.median(np.abs(ys_arr - median_y))
    modified_z_scores = 0.6745 * (ys_arr - median_y) / median_absolute_deviation_y
    return (ys_arr[np.abs(modified_z_scores) > threshold]).tolist()

【讨论】:

  • 非常感谢!你能解释一下 3.5 和 0.6745 的值吗
  • 0.6745 是因为 E[MAD] = 0.6745 * sigma 用于正态分布变量。尝试:x = np.random.normal(size=100000000) 然后print(np.median(np.abs(x - np.median(x))).mean() / x.std()) 3.5 也由 Iglewicz 和 Hoaglin(异常值测试的创建者)凭经验发现。见:hwbdocuments.env.nm.gov/Los%20Alamos%20National%20Labs/TA%2054/…
【解决方案2】:

那是因为您正在使用numpy 函数。那里使用的默认类型是numpy.ndarray,它可以加快计算速度。如果您只需要一个列表作为输出参数,请使用tolist() 方法。

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z].tolist()

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2019-07-24
    • 1970-01-01
    • 2015-07-23
    • 2023-03-07
    • 2020-04-03
    • 2018-12-06
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多