scipy 通过散布拟合样条

xytpbqjk  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(164)

我有两组数据,我想找出它们之间的相关性。虽然数据有一些分散,但它们之间的关系是显而易见的。我目前使用的是numpy polyfit(第8阶),但直线有一些“摆动”(尤其是在开始和结束时),这是不合适的。其次,我认为直线开始处的拟合不是很好(曲线应该稍微陡峭一些)。
如何通过这些数据点获得最佳拟合“样条曲线”?

我的当前代码:


# fit regression line

regressionLineOrder = 8
regressionLine = np.polyfit(data['x'], data['y'], regressionLineOrder)
p = np.poly1d(regressionLine)
a1o7rhls

a1o7rhls1#

你的数据集可能有一些问题...从你的n(x,y)点图中,它们是用直线连接起来的;如果你显示点,应该会看到点的密度沿着你的域分布,它并不像线那样均匀分布。假设你的域是[xmin,xmax],一个8阶多项式适合插值,但是它会因为高阶和点密度的奇怪分布而摆动。多项式不适合外推,一旦在你的域之外没有控制点,你可以用样条来解决这个问题,三次自然样条将控制xmin和xmax处的导数,但是要做到这一点,你应该排序你的数据集(x轴),并采取一个子样本的n点与滚动平均作为控制点的样条算法。如果问题有解析解(例如,高斯变异函数看起来像点分布),只需尝试优化参数(例如,高斯变异函数的极差和基台),以最小化域内的误差,并遵循域外的赋值。

rpppsulh

rpppsulh2#

看看@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')

相关问题