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

Posted

技术标签:

【中文标题】如何使用平滑和过滤技术从一组测量中生成估计值【英文标题】:How to generate Estimates from a set of measurement using Smoothing and Filtering Techniques 【发布时间】:2021-07-15 03:42:19 【问题描述】:

我对平滑/过滤传感器数据/计算值比较陌生。

我想在给定的时间轴上使用 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

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

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

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

【问题讨论】:

【参考方案1】:

这确实看起来像是某种应用于测量值的过滤。 这是一个使用来自SciPysavgol_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");

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

【讨论】:

嗨,感谢您的回答,我尝试了 sargov 过滤器,但它没有给出我想要的结果,它仍然太吵了。是否可以使用基于卡尔曼滤波器的解决方案?我目前正在查看 FilterPy,并且真的不知道如何在不同的 Timestep 中使用它 就像我在帖子中提到的,我对这些拟合和过滤的经验是,您总是需要进行一些试验和错误。例如,在您的情况下,也许更高阶的 savgol 过滤器可能会更好?或者可能有不同的窗口大小等等。你看过this implementation of Kalman Filter吗?【参考方案2】:

我要尝试的第一件事是一些多项式拟合。看起来好像至少有 10 个转折点,所以要重现那些你至少需要 11 度多项式的转折点,但为什么要限制呢?我想我会尝试拟合 12、24、36.. 次多项式,看看它们的样子。

如果您想了解更多,您可能需要阅读Wiener Filter

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

【讨论】:

以上是关于如何使用平滑和过滤技术从一组测量中生成估计值的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift Playground 中生成 PDF

在目标c中生成组合的有效方法[重复]

如何让计算机在 Swift 中生成预定义的一组数字?

如何在 c++/java 中生成一组遵循特定分布的值?

如何从这两个数组中生成一组设定数量的数字?

如何向SQLSERVER中进行update一组随机数