我试图拟合一个二维点云(x和y坐标)。到目前为止,我在scipy的插值包中有了一些有限的成功,最显着的是
然而,很明显这是错误的包,因为我需要一条最终的曲线,在拋物線形状的点云边缘可以弯曲回来(所以不再是一维函数)。
然后,我阅读了关于
以下是情节。有人能建议一种自动化决定的方法吗?可能是在评估每个的确定系数时进行循环绘图?还是有什么内置的东西?
UnivariateSpline
,它产生了以下(次优的)拟合结果(请忽略颜色): 。然而,很明显这是错误的包,因为我需要一条最终的曲线,在拋物線形状的点云边缘可以弯曲回来(所以不再是一维函数)。
然后,我阅读了关于
interp2d
的文章,但不知道我的z
数组应该是什么。我是否忽视了更好的类别的包?
更新1:根据评论建议,我已经使用scipy.interpolate.splprep
重新制作了这个项目;我的一般设置是:
from scipy.interpolate import splprep, splev
pts = np.vstack((X.ravel(), Y.ravel)) #X and Y contain my points
(tck, u), fp, ier, msg = splprep(pts, u=None, per=0, k=3, full_output=True) #s = optional parameter (default used here)
print('Spline score:',fp) #goodness of fit flatlines after a given s value (and higher), which captures the default s-value as well
x_new, y_new = splec(u_new, tck, der=0)
plt.plot(x_new, y_new, 'k')
plt.show()
以下是情节。有人能建议一种自动化决定
更新2: 我已经在两个不同的点云上重新运行了此操作,并发现点的排序显着改变了结果。当我将点云中的点重新排序为沿抛物线的初始拟合时,我的样条曲线结果要好得多。此外,如下所示,结果仍然不太理想。
这种方法还有什么进一步的调整可以做吗?或者,有没有竞争性的方法建议我去探索?
更新 3: 实际上,将节点数设置为5可以极大地帮助:
interp2d
不是你要找的:它似乎是用于当你有一个以z=f(x,y)
形式定义的三维函数时使用的。interp1d
看起来更接近,但可能会遇到与UnivariateSpline
相同的问题,因为它是用于一对一函数y=f(x)
。你需要的结果是一个参数化函数。 - Oliscipy.interpolate.splprep
函数吗:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splprep.html#scipy.interpolate.splprep? - Olis
的这个值不能给出你想要的结果?如果没有,我建议使用硬编码的平滑值。如果你确实有这样的数据集,请在问题中包含它,并说明你要寻找什么结果。 - Olisplprep
时能够正常工作(请注意,这个问题众所周知需要很长时间来计算答案)。 - Oli