Как сгладить сигналы статистически правильно в Python? - PullRequest
1 голос
/ 07 января 2020

Я наткнулся на проблему сглаживания данных, не претендуя на преувеличенную точность измеренных данных.

Sample of

Когда я искал простые решения, Я нашел много подходов фильтрации, которые оставляют форму данных неизменной (то есть количество точек данных не уменьшается); с моей точки зрения, это означает либо то, что данные подвергаются некоторому согласованию ( Поваренная книга Scipy: Savitzky Golay ) (что означает, что на самом деле это не исходные данные), либо статистические данные неверный (такой как «смежное усреднение» в источнике), то есть усреднение по окну точек данных для каждой точки данных, потому что он делает вид, что точность выше, чем на самом деле. Я сталкивался со случаями, когда такие сглаживающие артефакты сигнала были значительными, но это не так.

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

Incorrect smoothing

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

1 Ответ

2 голосов
/ 07 января 2020

Одним из подходов, возникающих при обработке изображений, является downscale_local_mean из пакета skimage.

import matplotlib.pyplot as plt    
from skimage.transform import downscale_local_mean
data=np.genfromtxt(r'example_smoothing_data.txt',delimiter=";")

smoothed=downscale_local_mean(data, (8, 1))

plt.figure()
plt.plot(data[:,0],data[:,1],'b-',label='Original data')
plt.plot(smoothed[:,0],smoothed[:,1],'r-',label='Smoothed data')
plt.legend()
plt.show()

enter image description here

На рисунке это может четко видно, что количество точек данных уменьшается, что в основном является еще одним окном интеграции во время измерения; уменьшение точности в направлении x в основном платит за увеличение точности в направлении y.

...