【问题标题】:Removal of outliers using numpy.argwhere使用 numpy.argwhere 去除异常值
【发布时间】:2020-06-23 09:39:47
【问题描述】:

大家好,这个问题可能更多是关于逻辑而不是代码,希望有人可以点亮它。
所以,我有一个包含一些异常值的数据列表,我想通过使用列表中每个项目之间的差异并确定差异太大的位置来删除它。
在此示例中,我想从数据列表中删除索引 [2,3,4]。最好的方法是什么??
我尝试使用 np.argwhere() 方法来查找索引,但是,我被困在如何使用它的结果来切片 np.array??

data=[4.0, 4.5, 22.5, 40.5, 22.5, 3.5, 3.0, 3.5, 4.5, 3.5, 2.5]
data=np.array(data)
d = data[:-1] - data[1:]
print(np.mean(d)) 

在此示例中,当我打印差异 (d) 时,它返回给我:

print(d) # returns:[ -0.5 -18.  -18.   18.   19.    0.5  -0.5  -1.    1.    1. ]

这很好。现在,我应用的逻辑是指出在 d 中我们有一个高于原始数据平均值的数字。

x = np.argwhere(d>np.mean(data))
print(x)        # returns: array([3], dtype=int64), array([4], dtype=int64)
indices_to_extract = [x[0]-1,x[-1]]
print(indices_to_extract)      # returns: [array([2], dtype=int64), array([[4]], dtype=int64)]
a1 = np.delete(r,indices_to_extract,axis=0)
print(a1)       #returns: [ 4.   4.5 40.5  3.5  3.   3.5  4.5  3.5  2.5]


 #Desirable return:
[ 4.   4.5 3.5  3.  3.5  4.5  3.5  2.5]

主要问题是,如何从可用于切片的 np.argwhere() 数字范围中得出结果??

【问题讨论】:

  • 这是一个如何用这种方法去除异常值的问题,或者什么是去除异常值的最佳方法?因为有比简单距离更好的方法来检测异常值。

标签: python python-3.x list numpy numpy-slicing


【解决方案1】:

获取列表项之间的差异的问题在于,例如索引为 1 (4.5) 的值将被视为异常值(它会因差异而获得高值)。此外,您可以在获取差异时同时获得正值和负值,因此如果您想以这种方式进行操作,您应该将模块 (abs) 应用于差异的结果。

发现异常值的方法如下:

计算 z 分数:

d = (data - np.mean(data)) / np.std(data)

从数据中选择除异常值(高于 75% 分位数)之外的每个值:

data[np.where( ~(d > np.quantile(d, 0.75)))]

输出:

array([4. , 4.5, 3.5, 3. , 3.5, 4.5, 3.5, 2.5])

【讨论】:

  • 快速提问,~ 对代码做了什么?以前没见过??
  • 这是否定,所以所有的真都变成了假,反之亦然
【解决方案2】:

我建议使用更稳健的中位数标准化距离:

d = np.abs(data - np.median(data))
mdev = np.median(d)
s = d / (mdev if mdev else 1.)
print(data[s < 4])

您可以将阈值(此处为最后一行的4)更改为您想要的准确度。

输出:

[4.  4.5 3.5 3.  3.5 4.5 3.5 2.5]

【讨论】:

    【解决方案3】:

    要将np.argwhere() 用于一系列数字,请在您的情况下说[3,20]

    x = np.argwhere((data<20) & (data>3))
    

    要返回小于/大于数字的数组(比如低于 20 的数据),您可以简单地使用:

    data[np.where(data<20)]
    

    对于一系列数字说[3,20]

    data[np.where((data<20)&(data>3))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 2015-07-29
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2012-05-21
      相关资源
      最近更新 更多