kalmangrad:自动化平滑处理带噪数据的N阶导数
kalmangrad是一个Python包,用于计算非均匀采样时间序列数据的自动化平滑N阶导数。该方法利用贝叶斯滤波技术来计算任意指定阶数的导数,为对噪声敏感的传统数值微分方法提供了一种鲁棒的替代方案。该包基于bayesfilter包构建。
核心特性
- 高阶导数估计:可计算直至任意指定阶数的导数。
- 抗噪声性:采用贝叶斯滤波以减轻数据中噪声的影响。
- 灵活的时间步长:能够处理非均匀采样数据,并自动调整时间步。
- 易于集成:简单的API设计,便于集成到现有项目中。
- 依赖少:仅需NumPy和
BayesFilter包(后者本身也仅需NumPy)。
安装
可通过PyPI或从源码安装:
pip install kalmangrad
# 或
git clone git@github.com:hugohadfield/kalmangrad.git
cd kalmangrad
pip install .
主要用法
核心函数是grad,用于估计输入数据y(采样于时间点t)的导数。
def grad(y: np.ndarray, t: np.ndarray, n: int = 1, delta_t=None, obs_noise_std=1e-2, online: bool = False, final_cov: float = 1e-4) -> Tuple[List[Gaussian], np.ndarray]:
"""
使用贝叶斯滤波/平滑估计输入数据y直至n阶的导数。
参数:
- y: 观测数据数组。
- t: 对应于y的时间点。
- n: 最高导数阶数(默认为1)。
- delta_t: 贝叶斯滤波器的时间步长。若为None,则自动确定。
- obs_noise_std: 观测噪声的标准差(默认1e-2)。
- online: 标志位,指示以在线(仅使用当前及之前数据)或离线(默认,使用全部数据)方式运行滤波器。
- final_cov: 过程噪声矩阵对角线上的最终协方差。
返回:
- smoother_states: 包含每个导数均值和协方差估计的高斯状态列表。
- filter_times: 与估计值对应的时间点。
"""
示例说明
该包提供了使用示例,演示如何对带噪声的正弦波数据估计一阶和二阶导数,并将结果与真实值及np.gradient的计算结果进行对比。这直观地展示了其在噪声环境下获得平滑导数估计的能力。
内部函数概述
transition_func(y, delta_t, n):计算时间t + delta_t的新状态向量。
transition_matrix(delta_t, n):返回状态转移矩阵A。
observation_func(state):从状态向量中提取观测值(仅观测第一个元素,即位置)。
jac_observation_func(state):计算观测函数关于状态向量的雅可比矩阵。
依赖与许可
- 依赖:Python 3.x, NumPy, Matplotlib(用于示例绘图), BayesFilter。
- 许可:MIT许可证。
- 免责声明:代码按原样提供,无任何保证,请在具体使用场景中自行测试和验证。