2

我想用本文提出的KM方法对一些时间序列数据进行一些实验。问题是我没有访问论文中的数据,但我有类似类型的数据,没有异常值,我需要以脉冲(顶部和底部)的形式人工/手动生成一些异常值,以满足要求如下图所示,来自这篇论文的成果:

图像

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

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

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

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

图像

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

4

3 回答 3

1

numpy您可以使用例如: Python 模块生成信号。你可以将你的冲动添加到这个信号中(当然,如果尺寸正确的话)。我已经为您编写了一个示例,我在其中生成了一个 Sinus 信号,并在您的问题中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)返回从 0 到 200 范围内选择的 5 个数字的列表,没有重复。

随机脉冲的示例:

随机脉冲

于 2020-08-05T12:41:21.010 回答
0

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

PS:振幅、脉冲之间的距离和脉冲的宽度/形状都应该是随机变量。

于 2020-08-01T15:16:35.827 回答
-2

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

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

  2. 要处理时间序列,在华宇模式中,平稳是最重要的。您可以尝试做一阶差分或二阶差分。如果数据集只有 1 个特征,则异常值已经直接显示出来。

祝你好运。

希望对您有所帮助。

怀俄明

于 2020-07-31T23:45:32.293 回答