如何使用平滑和过滤技术从一组测量中生成估计值

How to generate Estimates from a set of measurement using Smoothing and Filtering Techniques

我对 smoothing/filtering 传感器 data/calculated 值比较陌生。

我想使用给定时间轴上的 pandas 测量数据帧生成类似于下面这条曲线的东西。

我的数据是这样的:

charge_cycle  cumulative_chargetime_Ah  calculated_res
        
1   0.002199    0.075790
2   0.003123    0.071475
3   0.007699    0.097084
4   0.012086    0.050456
5   0.016609    0.077575
... ... ...
123169  478.228427  0.110583
123170  478.236834  0.139948
123171  478.239822  0.121189
123172  478.242608  0.144464
123173  478.251933  0.115232

我想要得到的输出如下所示。蓝色嘈杂 calculated_res 之类的变量是我目前拥有的变量,它显然非常嘈杂,我需要对其进行某种形式的过滤以生成更有用的变量。 红色图,我知道我可以使用内插法生成或在其上拟合一维多项式。

但是我真的不确定如何生成估计值,这是覆盖原始数据图的蓝色粗散点图。我可以得到一些关于如何获得这个“估计值”的建议吗?

我认为它确实与过滤有关,但我不确定如何将其应用于此用例。

这看起来确实像是对测量值应用了某种过滤。 这是一个使用 SciPy.

中的 savgol_filter 的示例
import numpy as np
from scipy.signal import savgol_filter
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_context("paper", font_scale=2.5)
sns.set_style('whitegrid')
sns.set_palette("Set1")

N = 200
T = 1/200

rnd = np.random.RandomState(12345)
x = np.linspace(0.0, 2*N*T, N)
signal = np.sin(np.pi*x)
noisy_signal = signal  + rnd.normal(0, 1, N)
filtered = savgol_filter(noisy_signal, window_length=31, polyorder=1)


plt.figure(figsize=(8, 4))
sns.lineplot(x, noisy_signal, label='Noisy', lw=0.5)
sns.lineplot(x, filtered, label='Filtered', lw=2);
ax = sns.regplot(x, noisy_signal, order=3, label='Best fit', scatter_kws={'s':2})
ax.legend(loc="best");

与所有过滤和拟合方法一样,它需要对问题有一些了解,并且可能需要反复试验才能获得正确的参数。

我首先要尝试的是一些多项式拟合。看起来至少有 10 个转折点,因此要重现这些转折点,您至少需要 11 次多项式,但为什么要限制呢?我想我会尝试拟合 12、24、36.. 次多项式,看看它们看起来如何。

变得更有趣,您可能想阅读 Wiener Filter

我认为卡尔曼滤波器不是那么合适。一方面,您肯定也想进行卡尔曼平滑。平滑器(可以访问所有数据)总是胜过过滤器(按顺序获取数据)。但是卡尔曼滤波器真正的问题是你需要指定一个动态模型,即下一次的'state'如何取决于上一次的状态,这个模型对信号的拟合程度是至关重要的在确定过滤器的性能时。更麻烦的是,这个动态模型的一些参数本质上是随机的——例如,状态的不确定性在预测步骤中如何变化——这些不仅对确定 filter/smoother 性能很重要,而且很难确定。