python截面曲线拟合

python截面曲线拟合,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我有一组点来描述一个简单的表面空腔/凸起的横截面。多项式近似就足够了,但是numpy.polyfit需要一定的阶数。我考虑了几个不同程度的迭代,以选择一个平均残差最小的迭代。是否有任何现有的函数或更好的方法来获得良好的曲线?计算时间非常重要:数据集很小(约20个点),但有数千个 最初的任务是在一个非常离散的曲面上找到这个测地线-存在任何更简单的方法吗?除非我弄错了,否则您将始终得到最小的残差和允许的最大阶数。如果允许优化器选择度d,它将选择无限大的d,尽管在实践中,当d=dof时,它将停止,其中

我有一组点来描述一个简单的表面空腔/凸起的横截面。多项式近似就足够了,但是numpy.polyfit需要一定的阶数。我考虑了几个不同程度的迭代,以选择一个平均残差最小的迭代。是否有任何现有的函数或更好的方法来获得良好的曲线?计算时间非常重要:数据集很小(约20个点),但有数千个


最初的任务是在一个非常离散的曲面上找到这个测地线-存在任何更简单的方法吗?

除非我弄错了,否则您将始终得到最小的残差和允许的最大阶数。如果允许优化器选择度
d
,它将选择无限大的
d
,尽管在实践中,当
d=dof
时,它将停止,其中
dof
是拟合的自由度数(基本上是数据点的数量),在该点上,您将有零剩余

如果您对拟合的真正函数形式不感兴趣,只需要曲线,您可以使用插值,这对于您可能要做的事情类型更灵活

如果速度很重要,而且格式也不是那么重要,那就试着用一些合理的程度,看看哪个更快

在我看来,样条曲线要快得多,在我的例子中,它们给出了相同的结果(记住,样条曲线基本上只是串在一起的多项式)

包括评价:

In [35]: timeit interp.UnivariateSpline(x, a)(x)
10000 loops, best of 3: 44.9 µs per loop

In [37]: timeit poly.Polynomial(poly.polyfit(x, a, 3))(x)
1000 loops, best of 3: 470 µs per loop
为了好玩,为了说明过拟合的概念,这是一个
d>=dof的多项式:

p = poly.Polynomial(poly.polyfit(x, a, x.size-1))
plot(x, np.sin(x), '-', x, a, 'o', x, p(x), ':')

In [35]: timeit interp.UnivariateSpline(x, a)(x)
10000 loops, best of 3: 44.9 µs per loop

In [37]: timeit poly.Polynomial(poly.polyfit(x, a, 3))(x)
1000 loops, best of 3: 470 µs per loop
p = poly.Polynomial(poly.polyfit(x, a, x.size-1))
plot(x, np.sin(x), '-', x, a, 'o', x, p(x), ':')