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

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

http://img.mukewang.com/643e3b000001be5d06560513.jpg

在最坏的情况下,我想知道我是否可以在脉冲或 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()

http://img4.mukewang.com/643e3b0f00010ccb04840381.jpg

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



青春有我
浏览 141回答 2
2回答

白板的微信

您可以使用例如numpyPython 模块生成信号。你可以将你的脉冲添加到这个信号中(当然,如果尺寸是正确的)。我已经为您编写了一个示例,我在其中生成了一个正弦信号,numpy并且在您的问题中添加了类似的脉冲signal.unit_impulse()。为了更好地理解,我在代码中添加了一些注释。代码:import numpy as npimport matplotlib.pyplot as pltimport scipy.signal as signalpositive_impulses = signal.unit_impulse(200, [10, 50, 60])  # Generate positive impulsesnegative_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 signalplt.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 signalplt.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 signalplt.title("Signal with different impulses")plt.tight_layout()plt.show()输出:笔记:为您的信号生成随机脉冲可能更有效。你可以用模块来做random。import randompositive_impulses = signal.unit_impulse(200, random.sample(range(200), 5))  # Generate positive impulsesnegative_impulses = signal.unit_impulse(200, random.sample(range(200), 5))*-1  # Generate negative impulses将random.sample(range(200), 5)返回从 0 到 200 范围内选择的 5 个数字的列表,没有重复。一个随机脉冲的例子:

牛魔王的故事

可以通过将输出视为正常signal和一些噪声的组合来合成时间序列中的异常。最常见的噪声模型是加性噪声,这意味着输出很简单out = signal + noise。在你的情况下,你会在添加之前将单位脉冲缩放到合适的幅度。在这个例子中,脉冲噪声的振幅似乎在 15 左右。PS:幅度,脉冲之间的距离和脉冲的宽度/形状都应该是随机变量。

UYOU

谢谢你的邀请。关于如何产生周期异常值,我到现在还没有这样的经验。但由于它是基于时间序列的,所以我认为我们可以从 Arima 概念开始。如果你能找到p, d,q参数,你就已经找到了数据答案。虽然有很高的计算成本。StackOverflow 中有一些关于如何找到p q d处理时间序列,平稳是Arima模式中最重要的事情。您可以尝试做一阶微分或二阶微分。如果数据集只有1个特征,异常值已经直接显示出来了。祝你好运。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python