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()
输出:
笔记:
为您的信号生成随机脉冲可能更有效。你可以用模块来做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 个数字的列表,没有重复。
一个随机脉冲的例子:
TA贡献1830条经验 获得超3个赞
可以通过将输出视为正常signal
和一些噪声的组合来合成时间序列中的异常。最常见的噪声模型是加性噪声,这意味着输出很简单out = signal + noise
。在你的情况下,你会在添加之前将单位脉冲缩放到合适的幅度。在这个例子中,脉冲噪声的振幅似乎在 15 左右。
PS:幅度,脉冲之间的距离和脉冲的宽度/形状都应该是随机变量。
TA贡献1878条经验 获得超4个赞
谢谢你的邀请。关于如何产生周期异常值,我到现在还没有这样的经验。但由于它是基于时间序列的,所以我认为我们可以从 Arima 概念开始。
如果你能找到
p
,d
,q
参数,你就已经找到了数据答案。虽然有很高的计算成本。StackOverflow 中有一些关于如何找到p
q
d
处理时间序列,平稳是Arima模式中最重要的事情。您可以尝试做一阶微分或二阶微分。如果数据集只有1个特征,异常值已经直接显示出来了。
祝你好运。
添加回答
举报