scipy.interpolate.BSpline:扩展x向量长度的经验法则有哪些?
加速度计数据平滑的
ts_length取值问题 用户现有平滑代码
import numpy as np import pandas as pd from scipy.interpolate import make_interp_spline, BSpline idx = [1,2,3,4] ts_length = 200 idx = np.array(idx,dtype=int) accel = [[-0.7437,0.1118,-0.5367], [-0.5471,0.0062,-0.6338], [-0.7437,0.1216,-0.5255], [-0.4437,0.3216,-0.3255], ] print(accel) accel = np.array(accel,dtype=float) accel_sm = np.zeros([ts_length,3]) idxnew = np.linspace(idx.min(), idx.max(), ts_length) for i in range (0,3): c = accel[:,i] spl = make_interp_spline(idx, c, k=3) c_smooth = spl(idxnew) accel_sm[:, i] = c_smooth print(accel_sm)
问题
此前随意选取ts_length=200仅为验证示例代码可行性,现想了解:相对于原idx的长度,ts_length设为多大能在实现良好平滑的同时避免生成冗余过大的数组?是否有相关经验法则?
实用经验法则与建议
基础参考区间:原数据长度的3~10倍
你用的是三次B样条插值(k=3),这类插值的特性决定了,取原数据点数量的3到10倍就足够生成足够平滑的曲线。比如你原idx长度是4,取12到40之间的数值就完全够用——超过这个范围后,曲线平滑度不会有明显提升,只会徒增数组体积和不必要的计算量。根据后续需求调整
- 若仅需观察加速度整体变化趋势,取原长度的3~5倍即可;
- 若需要保留更多细节(比如微小的加速度波动),可以提升到5~10倍;
- 一旦超过10倍,新增的点本质上都是样条曲线的重复插值,不会带来额外有效信息。
快速验证方法:可视化对比
可以先分别用3倍、5倍、10倍原长度的ts_length生成平滑数据,把原数据点和不同参数的平滑曲线画在一起对比。当增大ts_length后曲线形状没有明显变化时,当前数值就是合适的上限。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

