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

时间:2019-03-21 13:49:57

标签: python regression polynomial-math

我想编写一个通用函数,该函数将两个一维数组和一个整数N作为输入,并返回最适合我的数据的次数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一起存在(似乎自从我阅读通知以来就不存在),或者您还有其他功能可以做到这一点?谢谢

2 个答案:

答案 0 :(得分:2)

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

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

您仅使用ax+b,而不是使用ax。类似地,可以将方程定义为要拟合的每个多项式都通过(0,0)。

我以为以防万一,我想指出的一个问题是,您不能直接比较不同次数的多项式。与具有较少自由度的方程式相比,具有较大自由度的方程式几乎总是更适合数据。例如,如果要比较线性拟合和二次拟合,就不能只拟合直线并采用误差最小的那一种。二次拟合将几乎总是获胜。为了进行比较,必须执行某种假设检验。您必须假设低阶多项式确实是最佳拟合,并采用高阶拟合作为替代假设。有很多方法可以做到这一点。我个人比较喜欢自举。引导测试作为置信度测试,其工作原理是通过从实际数据集中随机采样(替换后)来制作一堆数据集,然后查看实际数据集的拟合度是否在随机生成的数据集的拟合度的前5%内。通过这种方式,您可以对以下事实进行校正:较高阶的方程将比较低阶的方程更适合任何随机数据集。如果您愿意,我可以发布一些代码,但是无论您如何执行,都需要一个置信度测试来比较拟合度与不同程度的多项式。

答案 1 :(得分:1)

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