Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:拒绝列表中的异常值(序列)_Python_Algorithm_Numpy - Fatal编程技术网

Python:拒绝列表中的异常值(序列)

Python:拒绝列表中的异常值(序列),python,algorithm,numpy,Python,Algorithm,Numpy,我试图在python中找到一种算法,该算法根据数据集的a)趋势(增长/收缩)b)和与近邻的数值距离来查找异常值:x不超过x-1的>abs(1%) 编辑:如果python中有可用的算法,它也可以是三次样条插值 我已经看到了使用STD偏差的NUMPY算法,但是由于我必须考虑列表的系列,这个算法对于这种情况不起作用。 0.0937, 0.0934, 0.0933, 0.0931, 0.0933, 0.0936, 0.1091 < == outlier, 0.0938, 0.0945, 0.094

我试图在python中找到一种算法,该算法根据数据集的a)趋势(增长/收缩)b)和与近邻的数值距离来查找异常值:x不超过x-1的>abs(1%)

编辑:如果python中有可用的算法,它也可以是三次样条插值

我已经看到了使用STD偏差的NUMPY算法,但是由于我必须考虑列表的系列,这个算法对于这种情况不起作用。

0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091 < == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065 < == outlier since -,
0.1123,
0.1198
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091<==异常值,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065<==自-以来的异常值,
0.1123,
0.1198

您可以做的是,假设步长为1,计算数据的前后梯度。您的异常值是适用这些条件的元素:

  • 向后和向前的梯度没有相同的标志:趋势的变化
  • 后向梯度的绝对值大于左邻域绝对值的1%
我对你的说法的解释是,两者都必须是真实的

f
成为数据的一维numpy数组

f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091, #< == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065, #< == outlier since -,
0.1123,
0.1198
])
bg = 0.0*f # backward gradient, we want them to have the same size as f
fg = 0.0*f # forward gradient, we want them to have the same size as f
bg[1:] = f[1:]-f[:-1]
fg[:-1] = f[1:]-f[:-1]

outliers = (bg*fg<0) * np.hstack((False, np.where(np.abs(bg[1:])>0.01*np.abs(f[:-1]),True,False) ))
# You don't want to remove an element and the next
outliers[1:] = outliers[1:]*np.where( outliers[:-1], False, True )

print 'Outliers = ', f[outliers]
print 'Good = ', f[np.where( outliers, False, True)]
f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091,#<==异常值,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065,#<==异常值自-,
0.1123,
0.1198
])
bg=0.0*f#向后梯度,我们希望它们的大小与f相同
fg=0.0*f#正向梯度,我们希望它们的大小与f相同
bg[1:]=f[1:]-f[:-1]
fg[:-1]=f[1:]-f[:-1]
异常值=(bg*fg0.01*np.abs(f[:-1]),真,假)
#您不希望删除一个元素,而删除下一个元素
离群值[1:]=离群值[1:]*np.其中(离群值[:-1],假,真)
打印“异常值=”,f[异常值]
打印'Good=',f[np.where(异常值、假、真)]

我用你的数据做了这个例子,只要用任何东西替换
f

你能做的就是计算数据的前后梯度,假设步长为1。您的异常值是适用这些条件的元素:

  • 向后和向前的梯度没有相同的标志:趋势的变化
  • 后向梯度的绝对值大于左邻域绝对值的1%
我对你的说法的解释是,两者都必须是真实的

f
成为数据的一维numpy数组

f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091, #< == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065, #< == outlier since -,
0.1123,
0.1198
])
bg = 0.0*f # backward gradient, we want them to have the same size as f
fg = 0.0*f # forward gradient, we want them to have the same size as f
bg[1:] = f[1:]-f[:-1]
fg[:-1] = f[1:]-f[:-1]

outliers = (bg*fg<0) * np.hstack((False, np.where(np.abs(bg[1:])>0.01*np.abs(f[:-1]),True,False) ))
# You don't want to remove an element and the next
outliers[1:] = outliers[1:]*np.where( outliers[:-1], False, True )

print 'Outliers = ', f[outliers]
print 'Good = ', f[np.where( outliers, False, True)]
f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091,#<==异常值,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065,#<==异常值自-,
0.1123,
0.1198
])
bg=0.0*f#向后梯度,我们希望它们的大小与f相同
fg=0.0*f#正向梯度,我们希望它们的大小与f相同
bg[1:]=f[1:]-f[:-1]
fg[:-1]=f[1:]-f[:-1]
异常值=(bg*fg0.01*np.abs(f[:-1]),真,假)
#您不希望删除一个元素,而删除下一个元素
离群值[1:]=离群值[1:]*np.其中(离群值[:-1],假,真)
打印“异常值=”,f[异常值]
打印'Good=',f[np.where(异常值、假、真)]

我用你的数据做了这个例子,只要用任何东西替换
f

如果你想用Python算法处理单调递增的数据,请看这个问题:

特别是,此答案使用numpy:


您可以将其与用于std偏差的numpy算法结合使用。

如果您希望Python算法用于单调递增的数据,请参阅以下问题:

特别是,此答案使用numpy:


您可以将其与标准偏差的numpy算法结合使用。

在寻找算法之前,您应该定义“异常值”实际上是什么。您不需要示例,您需要一个数学定义,例如,“如果……某个值被视为异常值”您如何定义异常值?2个标准偏差之外的异常值?在中心50%之外y或>x?“趋势”也不清楚。线性回归?三次样条曲线?在我看来,你对离群值的“眼球”定义是错误的:它不是0.1065,因为它太低而奇怪,它是0.1082,因为它太高而看起来奇怪。我们只需要移动0.1082就可以得到一条干净的曲线,而如果我们假设它是0.1065,这太低了,我们也必须改变0.1123和0.1198。这就是为什么必须明确你的标准的原因。在寻找算法之前,你应该定义“离群值”实际上是什么。你不需要例子,你需要一个数学定义,例如,“如果……某个值被认为是离群值”,你如何定义离群值?2个标准偏差之外的异常值?在中心50%之外y或>x?“趋势”也不清楚。线性回归?三次样条曲线?在我看来,你对离群值的“眼球”定义是错误的:它不是0.1065,因为它太低而奇怪,它是0.1082,因为它太高而看起来奇怪。我们只需要移动0.1082就可以得到一条干净的曲线,而如果我们假设它是0.1065,这太低了,我们也必须改变0.1123和0.1198。这就是为什么明确你的标准很重要。