在小尺寸向量中查找异常值

问题描述 投票:0回答:1

假设我有一个 n 元素向量,由某些带有需要定位的尖峰的测量值组成(n 很小,比如 5-7)。我的任务是找到向量中“比其他元素大得多”的所有元素。如果 n 较大且“大”元素的数量较小,则基于计算标准差(或 z 分数)的方法会很好地发挥作用。然而,n 很小,“大”元素的数量甚至可以等于 n。所以,统计方法是行不通的。

这类似于寻找图像中的亮点,整个图像可以是明亮的。例如,我们可以对向量进行阈值处理,但这是有风险的,因为向量的实际内容可能会发生变化。现在,我将使用以下代码:

pnormalize=p/np.max(p)
pthreshold=np.where(pnormalize>0.6,1,0)

我对此感到不安的是 0.6 的选择是任意的。实际上,对于像 [13.45 0.3 1.4 0.8 11.1] 这样的向量,结果是 [1 0 0 0 1],这是有效的,对于 [13.45 0.3 1.4 0.8 7.1] 来说,这很容易失败,这是“显而易见的”我有两个元素比其他元素大得多,但代码提供了漏报。我不能任意降低阈值,因为噪声确实存在,并且也不希望出现任何误报。

有什么建议吗?

python outliers threshold
1个回答
0
投票

一种可能的方法是找到向量的中值。然后查看每个元素并找出其值与中位数之间的差。如果差异大于预定义的阈值(或者您可以尝试使用中位数来设置此阈值),则可以将该点识别为异常值。这个的实现可能看起来像这样:

import numpy as np

def find_outliers(data, threshold_factor=2):
    median = np.median(data)
    median_abs_dev = np.median(np.abs(data - median))
    threshold = median_abs_dev * threshold_factor
    outliers = np.abs(data - median) > threshold
    return outliers

# Example usage:
data = np.array([13.45, 0.3, 1.4, 0.8, 7.1])
outliers = find_outliers(data)
print(outliers)
© www.soinside.com 2019 - 2024. All rights reserved.