适应散点图拟合样条曲线

3
我有两组数据,想要找到它们之间的相关性。虽然数据有些分散,但显然存在关系。我目前使用 numpy 的 polyfit(8阶),但线条在开始和结束处有些“抖动”,这不太合适。另外,我认为拟合在线条开始处不太好(曲线应该稍微陡峭一些)。
如何通过这些数据点获得最佳的“样条”拟合?

Data scatter with polyfit

我的当前代码:
# fit regression line
regressionLineOrder = 8
regressionLine = np.polyfit(data['x'], data['y'], regressionLineOrder)
p = np.poly1d(regressionLine)

这可能更适合于交叉验证,但无论如何,这些效应对于多项式拟合是自然的。如果您想要更好的曲线,您可能需要使用更高级的回归技术;scikit-learn提供了几种算法。高斯过程可能是一个不错的选择,尽管直接使用它可能会有太多数据。 - jdehesa
2个回答

4
请参考 @MatthewDrury 的回答:为什么在多项式回归中使用正则化而不是降低次数?。他的回答非常精彩和准确。最有趣的部分出现在最后,当他开始谈论使用自然立方样条替代具有正则化的10次多项式进行回归拟合。您可以使用 scipy.interpolate.CubicSpline 的实现来获得非常相似的结果。其他样条方法的大量类都包含在 scipy.interpolate 中。
这里是一个简单的例子:
from scipy.interpolate import CubicSpline

cs = CubicSpline(data['x'], data['y'])
x_range = np.arange(x_min, x_max, some_step)
plt.plot(x_range, cs(x_range), label='Cubic Spline')

1
CubicSpline进行插值。该文章讨论了近似。您知道如何在Python中执行样条逼近吗? - Antony Hatchkins

0

你的数据集可能存在一些问题...从你的n(x,y)点的图中可以看出,它们是通过直线连接的;如果你显示点而不是直线,应该能够看到你的域中点的密度,并且由于直线不均匀分布,因此密度也不均匀。假设你的域是[xmin,xmax],8阶多项式插值是很好的选择,但由于高阶和点密度奇怪地分布,它会产生波动。多项式插值不适用于外推,因为在你的域之外没有控制点。你可以通过样条来解决这个问题,一个三次自然样条将控制xmin和xmax处的导数,但为了做到这一点,你应该对数据集进行排序(x轴),并取一个滚动平均作为样条算法的控制点的子样本。如果你的问题有一个解析解(例如高斯变异函数看起来像你的点分布),只需尝试优化参数(例如高斯变异函数的范围和 sill)以最小化域内误差并遵循渐近线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接