Рубрики
Без рубрики

Сглаживание ваших данных с фильтром Savitzky-Golay и Python

В этой статье рассматриваются обработка сигналов. Точнее, он показывает, как сгладить набор данных, который представляет некоторые флуктуации, чтобы получить результирующий сигнал, который более понятный и легче проанализирован. Чтобы сгладить набор данных, нам нужно использовать фильтр, то есть математическая процедура, которая позволяет сглаживать ваши данные с фильтром Savitzky-Golay и Python Подробнее »

Автор оригинала: Andrea Ridolfi.

В этой статье рассматриваются обработка сигналов. Точнее, он показывает, как сгладить набор данных, который представляет некоторые флуктуации, чтобы получить результирующий сигнал, который более понятный и легче проанализирован. Чтобы сгладить набор данных, нам нужно использовать фильтр, то есть математическая процедура, которая позволяет избавиться от колебаний, генерируемых внутренним шумом, присутствующим в нашем наборе данных. Python Предоставляет несколько фильтров, они дифференцируются на основе математической процедуры, с которой они обрабатывают данные.

В этой статье мы увидим один из наиболее широко используемых фильтров, так называемых Фильтр Savitzky-Golay Отказ

Чтобы проиллюстрировать его функционирование и его основные параметры, мы применим фильтр Savitzky-Golay к набору данных и посмотрите, как сгенерированные функции установки изменяются при изменении некоторых параметров.

Короче

Фильтр Savitzky-Golay – это фильтр с низким уровнем передачи, который позволяет сглаживать данные. Чтобы использовать его, вы должны дать в качестве входного параметра функции исходный шумный сигнал (как одномерный массив), установите размер окна, то есть n ° точек, используемых для расчета посадки, и порядка используемой полиномиальной функции соответствовать сигналу.

Таблица 1 суммирует обязательные параметры, которые вам нужно выбрать, чтобы сделать ваш фильтр Savitzky-Golay работать правильно.

Синтаксис: savgol_filter ()
Параметры: X (подобный массивно) Данные для фильтрации
Длина окна (INT) Длина окна фильтра (нечетное число)
Полипорт (INT) порядок полиномиальной функции, используемой для соответствия
Возвращаемое значение Y (NDARRAY) отфильтрованные данные

Это только обязательные параметры, которые вам нужно знать, чтобы сделать работу функции; Для получения дополнительной информации посмотрите на Официальная документация Отказ

Как работает фильтр Savitzky-Golay?

Мы могли бы заинтересовать использовать фильтр, когда мы хотим сгладить наши точки данных; То есть к приближению оригинальной функции, сохраняя только важные функции и избавиться от бессмысленных колебаний. Для этого последовательные подмыселы точек оснащены полиномиальной функцией, которая сводит к минимуму ошибку подгонки.

Процедура итерация на протяжении всех точек данных, получая новую серию точек данных, устанавливающих исходный сигнал. Если вы заинтересованы в знании подробной информации о фильтре Savitzky-Golay, вы можете найти всестороннее описание здесь Отказ

Сглаживание набора данных с использованием фильтра Savitzky-Golay

Генерация шумных наборов данных

Как объяснено выше, мы используем фильтр всякий раз, когда мы заинтересованы в удалении шума и/или колебаний от сигнала. Следовательно, начнем наш пример, создавая набор данных точек, которые содержат определенное количество шума. Для этого мы используем Numpy и использовать функцию .случайный () (см. Документация ) Отказ

import numpy as np

# Generating the noisy signal 
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x) + np.cos(x) + np.random.random(100)

Применение фильтра Savitzky-Golay

Для того, чтобы применить фильтр Savitzky-Golay на наш сигнал, мы используем функцию savgol_filter () , от Scipy.signal упаковка. Эта функция принимает первый входной массив, содержащий сигнал, который мы хотим фильтровать, размер «окна», который используется на каждой итерации для сглаживания сигнала, и порядка полиномиальной функции, используемой для установки исходного набора данных.

Как мы увидим, чем больше окно, тем меньше точное приспособление и процедуры сглаживания, потому что мы принудим функцию средней большей части сигнала. В следующих строках кода мы импортируем savgol_filter () Функция и применить его к ранее определенному массиву «Y».

from scipy.signal import savgol_filter
# Savitzky-Golay filter
y_filtered = savgol_filter(y, 99, 3)

В этом первом примере мы начинаем с размера окна 99, что означает, что функция займет 99 баллов (почти все точки) исходного сигнала для вычисления среднего; По этой причине мы не ожидаем получить хорошие результаты; Также обратите внимание, что порядок полиномиальных функций, используемых в процедуре подгонки, составляет три.

Теперь мы можем использовать Матплотлиб Устроить как оригинальный сигнал, так и тот, кто фильтруется с фильтром Savitzky-Golay. Если вы хотите стать матплотлибским экспертом и мастером визуализации данных, проверьте нашу Курс на финансовой компьютерной академии науки . Это бесплатно для всех премиум-членов!

import matplotlib.pyplot as plt

# Plotting
fig = plt.figure()
ax = fig.subplots()
p = ax.plot(x, y, '-*')
p, = ax.plot(x, y_filtered, 'g')
plt.subplots_adjust(bottom=0.25)

Конечный результат отображается на рисунке 1.

Изменение размера окна отбора проб и порядок полиномиальной функции

В предыдущем разделе мы устанавливаем размер окна выборки до 99, что означает, что фильтр принимает в качестве входных данных 99 точек «одновременно» для вычисления функции фитинга. Поскольку общее количество точек в исходном сигнале составляет 100, результат не совсем точно (как вы также можете увидеть на рисунке 1). Теперь мы создадим кнопку слайзера, с которой мы сможем изменить размер окна выборки и сразу увидеть его эффекты на графике построена, чтобы лучше понять принцип работы фильтра.

Чтобы представить кнопку ползунка на сюжете, мы эксплуатируем Matplotlib.widget Библиотека и начните с определения свойств кнопки, как ее размер и положение на окне MATPLOTLIB, а также числовые значения доступны через него.

# Defining the Slider button
ax_slide = plt.axes([0.25, 0.1, 0.65, 0.03]) #xposition, yposition, width and height

# Properties of the slider
win_size = Slider(ax_slide, 'Window size', valmin=5, valmax=99, valinit=99, valstep=2)

На данный момент мы должны определить функцию, которая будет обновлять график с текущим значением, указанным слайдером. Мы называем функцию «Обновление», она получит текущее значение слайдера («win_size.val»), снова фильтруйте исходный сигнал с новым размером окна и постройте новый фильтрованный сигнал на графике. Следующие строки кода описывают процедуру.

# Updating the plot
def update(val):
    current_v = int(win_size.val)
    new_y = savgol_filter(y, current_v, 3)
    p.set_ydata(new_y)
    fig.canvas.draw() #redraw the figure

Если вы ищете более подробное описание о том, как включить ползунки и другие виджеты в Python, Посмотрите на это видео:

Если мы сейчас будем построить результирующий рисунок, мы получим вывод, отображаемый на рисунке 2.

Последнее, что нужно сделать сейчас, это указать, когда запущена функция «Обновление»; Мы хотим, чтобы это было активировано каждый раз, когда значение кнопки ползуна изменяется.

# calling the function "update" when the value of the slider is changed
win_size.on_changed(update)
plt.show()

Если мы сейчас стараемся уменьшить размер окна выборки, мы будем оценить видимое улучшение в фитинговом сигнале; Это связано с тем, что фильтр Savitzky-Golay называется несколько времен для установки более низкого количества точек одновременно, поэтому улучшение результата функции фитинга. На рисунке 3 показан результат, полученный путем установки размера окна выборки на 5 баллов.

Как видно на рисунке 3, уменьшая размер окна отбора проб, шаг фильтрации позволяет лучше следовать колебаниям сигнала; Таким образом, полученный сигнал появится менее сглаженным и более подробно.

Общие руководящие принципы для фильтрации ваших данных

Как вы видели в статье, путем настройки размера окна отбора проб, результат шага фильтрации изменяется довольно резко. В общей практике вы всегда должны попытаться сохранить порядок функций полиномиальной подгонки как можно ниже, чтобы ввести как можно меньше искажения исходного сигнала. Что касается размера окна выборки, вы должны настроить его значение, чтобы получить фильтрованный сигнал, который сохраняет всю значимую информацию, содержащуюся в оригинальном, но с меньшим количеством шума и/или флуктуаций.

Имейте в виду, что для правильной работы вашего фильтра Savitzky-Golay вы всегда должны выбрать нечетное число для размера окна, а порядок полиномиальной функции всегда должен быть числом ниже, чем размер окна.

Выводы

В этой статье мы узнали о фильтре Savitzky-Golay, который является одним из наиболее широко используемых сигнальных фильтров в Python. Мы начали с построения шумного сигнала, и затем ввели фильтр Savitzky-Golay, с которым мы смогли избавиться от шума. Используя кнопку ползунка, мы также смогли оценить вариации функции фитинга как следствие уменьшения размера окна отбора проб.

Оригинал: “https://blog.finxter.com/smoothing-your-data-with-the-savitzky-golay-filter-and-python/”