具有较小数据集的异常值检测方法

Outlier detection approach with smaller datasets

我有一个 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. 有时 brighter/darker 图像的数量超过正常图像。这些图像具有极端值,这会使我的离群值方法产生偏差,认为它们是正常的。
  2. 有时 boxes 的数量很少(3 或 4)。这使得该方法很难找到足够的下限和上限。
  3. 下限和上限可以为负,但我的所有值都将大于或等于 0。

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

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

我们不是在框列表中寻找异常值,而是计算整个图像的下边界和上边界,并且考虑平均灰度值超出这些边界的任何框作为异常值:

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))