【问题标题】:Outlier detection approach with smaller datasets具有较小数据集的异常值检测方法
【发布时间】:2019-12-10 09:47:40
【问题描述】:

我有一个 python 函数,它将较小的图像列表boxes(表示为数组)和整个图像img 作为参数并查找异常值。异常值将明显比列表中的其他图像更亮或更暗,但更常见的情况是更暗。

def find_outliers(boxes, img):
    means = [np.mean(box['src']) for box in boxes]
    asc = sorted(means)
    q1, q3 = np.percentile(asc, [25,75])
    iqr = q3 - q1
    lower = q1 - (1.5 * iqr)
    upper =  q3 + (1.5 * iqr)

    # print('thresholds:', lower, upper)
    return list(filter(lambda x: np.mean(x['src']) < lower or np.mean(x['src']) > upper, boxes))

这种方法允许我根据图像创建阈值,而不是提出硬值,这在我的情况下是理想的。如果我继续这种方法,我需要解决 3 个问题。

  1. 有时较亮/较暗的图像数量超过正常图像。这些图像具有极端值,这使我的异常值方法偏向于认为它们是正常的。
  2. 有时boxes 的数量非常少(3 或4)。这使得该方法很难找到足够的下限和上限。
  3. 下限和上限可以是负数,但我的所有值都将大于或等于 0。

是否有更适合此类问题的统计方法?有没有其他方法可以根据图像建立阈值?

注意:我也尝试过标准差异常值方法,但这种方法不适合这种情况。

【问题讨论】:

  • 您说根据图像创建阈值,但您没有在函数中使用img?我知道这些盒子来自img(是img 的子图像)。这是正确的吗?
  • 没错。我还没有使用过 img,但如果有办法我可以,我只是想让社区知道这是可能的。
  • 所以我会将这些框与 img 的百分位数进行比较;如果您愿意,我可以将其写为答案,以便您尝试。
  • 这不是一个坏主意,请做!

标签: python numpy opencv comparison outliers


【解决方案1】:

我们不是在框列表中查找异常值,而是计算整个图像的上下边界,并且平均灰度值超出这些边界的任何框都被视为异常值: p>

def find_outliers(boxes, img):
    q1, q3 = np.percentile(img, [25,75])
    iqr = q3 - q1
    lower = q1 - (1.5 * iqr)
    upper =  q3 + (1.5 * iqr)

    # print('thresholds:', lower, upper)
    return list(filter(lambda x: np.mean(x['src']) < lower or np.mean(x['src']) > upper, boxes))

【讨论】:

  • 该方法很有帮助,但引入了很多误报。这是因为图像中有些框很暗,但与其他框相比仍然非常相似,这意味着它们不是异常值。
  • 嗯,也许你可以调整 iqr 因子,例如2 而不是 1.5。但最后,您必须决定是否需要相对于整个图像的异常值(我的回答),以及相对于框列表(您的原件)的异常值。恐怕我看不到任何将这两种方法结合起来的实用方法。
  • 是的,我和你在一起。可能不得不向另一个方向发展。
  • 我在 Stack Exchange 上问了同样的问题以获取统计信息,并得到了很好的见解:stats.stackexchange.com/questions/420220/…
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2014-04-16
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多