如何通过异常值检测方法在周期性或基于序列的数据上生成作为异常值的脉冲以进行实验?

How can generate impulse as outliers on periodic or sequenced-based data for doing experiments via outliers detection methods?

我想用KM approach has been suggested in this paper对一些时间序列数据进行一些实验。问题是我没有访问论文中的数据,但我有相似类型的数据,没有异常值,我需要以脉冲(顶部和底部)的形式生成一些异常值 artificially/manually 以满足要求正如本文成果中的下图所示:

在最坏的情况下,我想知道我是否可以在脉冲或 Sin 函数的周期性完美序列上生成类似的东西以应用于可用数据。 到目前为止,我的实现仅限于这些 post1, and Welch 但为了生成正确的离群值,我正在考虑 identifying/detecting 高和低状态,然后经常添加离群值以进一步实验离群值检测器。

我不确定将脉冲作为噪声卷积到目标异常值是否是污染我访问或不访问的周期性数据的正确方法。

到目前为止,我已经生成了一系列脉冲,但我不知道如何将其包含到一个周期信号或数据中:

import scipy.signal as signal
import matplotlib.pyplot as plt
imp = signal.unit_impulse(200, [10,50,60])

fig, ax = plt.subplots(1,1, figsize=(8,6))

ax.set_xlabel('Cycles')
plt.plot(imp)
plt.title('Generating impulse outliers in desired cycles: 10, 50 & 60')
plt.ylim((0.0, 1.4))
plt.show()

任何帮助将不胜感激,因为许多人都在研究异常和异常值检测等主题。

感谢邀请。 关于如何产生周期异常值,我到现在还没有这样的经验。但由于它是基于时间序列的,所以我认为我们可以从 Arima 概念开始。

  1. 如果你能找到pdq参数,你就已经找到数据答案了。虽然有很高的计算成本。 Whosebug 中有一些关于如何找到 p q d

    的参考
  2. 对于时间序列的处理,Arima模式中平稳性是重中之重。您可以尝试做一阶微分或二阶微分。如果数据集只有1个特征,异常值已经直接显示出来了。

祝你好运。

希望对您有所帮助。

怀俄明

可以通过将输出视为正常 signal 和一些 noise 的组合来合成时间序列中的异常。最常见的噪声模型是 加性噪声 ,这意味着输出只是 out = signal + noise。在你的情况下,你会在添加之前将单位脉冲缩放到合适的幅度。在示例中,脉冲噪声的幅度似乎在 15 左右。

PS:振幅,脉冲之间的距离和脉冲的width/shape应该都是随机变量。

您可以使用例如:numpy Python 模块生成信号。你可以将你的脉冲添加到这个信号中(当然,如果尺寸是正确的)。我已经为您编写了一个示例,其中我使用 numpy 生成了一个正弦信号,并且像您的问题一样添加了带有 signal.unit_impulse() 的脉冲。为了更好地理解,我在代码中添加了一些注释。

代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as signal

positive_impulses = signal.unit_impulse(200, [10, 50, 60])  # Generate positive impulses
negative_impulses = signal.unit_impulse(200, [80, 100, 150])*-1  # Generate negative impulses

# Generate the Sinus signal.
t = np.linspace(1, 200, 200)
x_sin_sig = np.sin(t / (2 * np.pi))
plt.subplot(4, 1, 1)
plt.plot(t, x_sin_sig)
plt.title("Signal")
plt.ylabel("Sin")


plt.subplot(4, 1, 2)
plt.plot(t, x_sin_sig + positive_impulses)  # Add the positive impulses to the original signal
plt.title("Signal with positive impulses")

plt.subplot(4, 1, 3)
plt.plot(t, x_sin_sig + negative_impulses)  # Add the negative impulses to the original signal
plt.title("Signal with negative impulses")

plt.subplot(4, 1, 4)
plt.plot(t, x_sin_sig + positive_impulses + negative_impulses)  # Add the both impulses to the original signal
plt.title("Signal with different impulses")

plt.tight_layout()
plt.show()

输出:

注:

为您的信号生成随机脉冲可能更有效。您可以使用 random 模块。

import random

positive_impulses = signal.unit_impulse(200, random.sample(range(200), 5))  # Generate positive impulses
negative_impulses = signal.unit_impulse(200, random.sample(range(200), 5))*-1  # Generate negative impulses

random.sample(range(200), 5) 将 return 一个从 0 到 200 范围内选择的 5 个数字的列表,没有重复。

随机脉冲示例: