如何使用平滑和过滤技术从一组测量中生成估计值
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 性能很重要,而且很难确定。
我对 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 性能很重要,而且很难确定。