为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2023-04-18 14:38:31
我想用本文建议的知识管理方法对一些时间序列数据进行一些实验。问题是我没有访问论文中的数据,但我有相似类型的数据,没有异常值,我需要以脉冲(顶部和底部)的形式人为/手动生成一些异常值,以满足要求如下图所示,来自这篇论文的成果:在最坏的情况下,我想知道我是否可以在脉冲或 Sin 函数的周期性完美序列上生成类似的东西以应用于可用数据。到目前为止,我的实施仅限于这些post1、post2和Welch但为了生成正确的离群值,我正在考虑识别/检测高和低状态,然后经常添加离群值以进一步实验离群值检测器。我不确定将脉冲作为目标异常值的噪声进行卷积是污染我访问或不访问的周期性数据的正确方法。到目前为止,我已经产生了一系列脉冲,但我不知道如何将其包含到一个周期性信号或数据中:import scipy.signal as signalimport matplotlib.pyplot as pltimp = 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()任何帮助将不胜感激,因为许多人都在研究异常和异常值检测等主题。
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以使用例如numpyPython 模块生成信号。你可以将你的脉冲添加到这个信号中(当然,如果尺寸是正确的)。我已经为您编写了一个示例,我在其中生成了一个正弦信号,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()

输出:

//img1.sycdn.imooc.com//643e3b2a0001e2a606590488.jpg

笔记:


为您的信号生成随机脉冲可能更有效。你可以用模块来做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 个数字的列表,没有重复。


一个随机脉冲的例子:

//img1.sycdn.imooc.com//643e3b3900014b2d06570498.jpg


查看完整回答
反对 回复 2023-04-18
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

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

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



查看完整回答
反对 回复 2023-04-18
?
UYOU

TA贡献1878条经验 获得超4个赞

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

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

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

祝你好运。


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信