Как можно генерировать импульсы в виде выбросов на периодических или последовательных данных для проведения экспериментов с помощью методов обнаружения выбросов?

Я хочу провести несколько экспериментов с данными временных рядов с помощью KM был предложен в этом paper. Проблема в том, что у меня нет доступа к данным в документе, но у меня есть данные аналогичного типа, которые не имеют выбросов, и мне нужно сгенерировать некоторые выбросы искусственно / вручную в форме импульса (вверху и внизу), чтобы удовлетворить требованиям, поскольку он показано на следующем рисунке из этого бумажного достижения:

img

В худшем случае мне было интересно, смогу ли я сгенерировать что-то подобное для периодической идеальной последовательности импульсов или функции Sin, чтобы применить к доступным данным. Пока моя реализация ограничена этими post1, post2 и Welch, но для того, чтобы генерировать правильные выбросы, я думал об идентификации / обнаружении высоких и низких состояний, а затем часто добавлял выбросы для дальнейших экспериментов с детекторами выбросов.

Я не уверен, что свертка импульсов в виде шума для нацеливания на выбросы - это правильный способ испортить периодические данные, к которым я обращаюсь, или нет.

Пока что я сгенерировал серию импульсов, но я понятия не имею, как я могу включить их в один периодический сигнал или данные:

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

img

Любая помощь будет принята с благодарностью, поскольку многие люди работают над такими темами, как обнаружение аномалий и выбросов.


person Mario    schedule 30.07.2020    source источник


Ответы (3)


Вы можете сгенерировать сигнал, например: numpy Python module. И вы можете добавить к этому сигналу свои импульсы (конечно, если размеры верны). Я написал для вас пример, в котором я сгенерировал синусовый сигнал с 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) вернет список из 5 номеров, выбранных из диапазона от 0 до 200, без дубликатов.

Пример со случайными импульсами:

Случайные импульсы

person milanbalazs    schedule 05.08.2020
comment
Спасибо за полезный вклад. Это то, что я искал. - person Mario; 09.08.2020

Синтез аномалий во временных рядах можно выполнить, рассматривая выходные данные как комбинацию нормального signal и некоторого шум. Самая распространенная модель шума - это аддитивный шум, что означает, что на выходе получается просто out = signal + noise. В вашем случае вы должны масштабировать единичные импульсы до подходящей амплитуды перед добавлением. В этом примере амплитуда импульсного шума составляет около 15.

PS: И амплитуда, и расстояние между импульсами, и ширина / форма импульса, вероятно, должны быть случайными величинами.

person Jon Nordby    schedule 01.08.2020
comment
Спасибо за ваш вклад. вы можете предложить сценарий кода? - person Mario; 02.08.2020

Спасибо за приглашение. Что касается того, как генерировать периодические выбросы, у меня до сих пор нет такого опыта. Но поскольку он основан на временных рядах, я думаю, что мы можем начать с концепции Аримы.

  1. если вы можете найти параметр p, d, q, вы уже достигли ответа с данными. хотя есть высокая стоимость вычислений. в StackOverflow есть справка о том, как найти p q d

  2. чтобы иметь дело с временными рядами, стационарность - самая важная вещь в режиме Arima. Можно попробовать сделать 1-й дифференциал или 2-й дифференциал. Если в наборе данных есть только одна характеристика, выброс уже проявился напрямую.

Удачи.

Надеюсь, это было полезно.

WY

person Yong Wang    schedule 31.07.2020