如何在截距条件下拟合多项式(使用 np.polyfit 或其他)?

How to fit a polynomial (using np.polyfit or something else) under conditions on intercept?

我想编写一个通用函数,它将两个一维数组和一个整数 N 和 return 适合我的数据的 N 次最似然多项式作为输入。我希望这个多项式的截距为零。 我已经写了这个:

def calibrate_polynomial(cv, opening, N): #cv and opening are list of data, N is the degree of the desired polynome
print(np.polyfit(cv, opening, N))

我想在拦截上添加一个条件。它是否与 np.polyfit 一起存在(自从我阅读通知后似乎不存在)或者您是否有其他功能来执行此操作?谢谢

您可以使用 scipy 包中的非线性曲线拟合例程(参见 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html),并将多项式函数定义为拟合的输入函数。 curve_fit 例程允许设置边界。

这里已经存在的答案提到了 scipy.optimize.curve_fit。这也是我要建议的,但是我认为设置界限并不是做您想做的事情的最佳方法。如果您希望将 y 截距设置为零,而不是设置边界,您应该简单地明确定义您正在使用的方程式。例如,对于线性拟合:

Bpopt, Bpcov = curve_fit(lambda x,a: a*x, cv, opening, p0 = 1)

不用 ax+b,只需使用 ax。对于您想要拟合的每个多项式,可以类似地定义方程以通过 (0,0)。

为了以防万一,我觉得我应该指出的问题中没有的一件事是,您不能直接比较不同次数的多项式。具有更多自由度的方程几乎总是比具有更少自由度的方程更适合数据。例如,如果您想比较线性拟合和二次拟合,您不能只拟合直线并采用误差最低的直线。二次拟合几乎总是会赢。为了进行比较,必须进行某种假设检验。您必须假设较低次数的多项式确实是最佳拟合,并将较高次数的多项式作为您的替代假设。有很多方法可以做到这一点。我个人偏爱自举。 Bootstrapping 作为一种置信度测试,其工作原理是通过从实际数据集中随机抽样和替换来制作一堆数据集,然后查看实际数据集的拟合是否在随机生成的数据集的前 5% 中。通过这种方式,您可以纠正这样一个事实,即高阶方程比低阶方程更适合任何随机数据集。如果你需要,我可以 post 一些代码,但是,无论你如何做,你都需要一个置信度测试来比较拟合与不同次数的多项式。