【问题标题】:How to smooth signals statistically correct in Python?如何在 Python 中平滑信号统计正确?
【发布时间】:2020-01-08 01:09:50
【问题描述】:

我偶然发现了平滑数据的问题,而没有假装夸大了测量数据的准确性。

当我在寻找简单的解决方案时,我发现了很多过滤方法,它们使数据的形状保持不变(即数据点的数量没有减少);从我的角度来看,这意味着要么数据正在经历某种拟合(Scipy cookbook: Savitzky Golay)(这意味着它不是真正的原始数据),要么只是统计上不正确(例如“相邻平均" 在 Origin 中),这是对每个数据点的数据点窗口进行平均,因为它假装准确度高于实际值。我经历过这样的情况,在这种情况下,这种平滑使信号伪影显得很重要,但事实并非如此。

我创建了一个示例,在该示例中,实际特征由于平均而不减少数据点的数量而出现错误。尤其是右边的主峰显得极其加宽,如果你知道真实数据的话,但是大量的数据点使它看起来非常整齐和平滑。此外,噪声水平几乎完全被消除,但现在一些较小的特征似乎在中心上升并显示为重要数据,但正如您在原始数据中看到的那样,它们并非如此。

我现在正在寻找简单/有效的方法来减少统计上正确的噪声,这些方法不会对数据施加假设(例如选择的拟合函数等),并了解不同实现的优缺点。

【问题讨论】:

  • 附带说明:平滑不可避免地会丢失重要信息;直方图/百分位线之类的东西可以保留更多。
  • @9000:感谢您的快速响应。您能否更具体地了解直方图?我过去常常想到与单个事件相关的直方图,它有点随机发生(可能具有类似峰值的概率分布,但对于单个事件是随机的)。这个数据集是一个光谱:当然每个数据点都是由单个事件堆积创建的,但是在 x 轴的维度(类似波长)中,我看不出为什么直方图是逻辑表示(虽然我可以只需选择它作为不同的“情节风格”)。
  • @Lepakk:这正是showing percentile / quantile distributions 通常解决的问题,例如在各种监控系统中。我不知道如何直接绘制分位数(例如 Seaborn 不支持),但 pandas 提供了 a way to compute desired quantiles,然后可以独立绘制。

标签: python smoothing


【解决方案1】:

一种源自图像处理的方法是 skimage 包中的 downscale_local_mean。

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

在图中可以清楚的看到,数据点的数量减少了,基本上只是测量时的另一个积分窗口; x 方向精度的降低基本上是为 y 方向精度的提高付出的代价。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2021-12-24
    • 2019-02-14
    相关资源
    最近更新 更多