哪个多项式回归次数显着?取决于点数或其他参数?

Which polynomial regression degree is significant ? depends of number of points or other parameters?

我正在研究数值导数的稳定性,作为我计算这些导数所采取的步骤的函数。使用具有 15 个点的导数(通过有限差分法获得),我得到以下图(每个多极子“l”对应一个参数,该参数取决于导数但无关紧要):

现在,我想将这个 15 点的导数与用 3、5 和 7 点计算的导数进行比较。为此,我刚刚绘制了相对差异(具有绝对差异):

abs(f'_15_pts - f'_3_pts)/f'_3_pts for comparison between 15 and 3 points
abs(f'_15_pts - f'_5_pts)/f'_5_pts for comparison between 15 and 5 points
abs(f'_15_pts - f'_7_pts)/f'_7_pts for comparison between 15 and 7 points

当我想用多极 l=366.42 对上述相对变化进行多项式回归时,我的问题就出现了(对于其他多极,问题仍然存在)。

例如,当我进行三次回归(3 度)时,我得到以下图:

我不知道如何解释这些结果:也许这意味着我的相对误差在 3 点和 15 点导数之间最大,在 5 和 15 之间小于 7 和 15 点之间。

然后,如果我想做 10 次多项式回归,我得到以下图:

如您所见,这与上面的三次回归完全不同。

所以我不知道多项式回归的阶数是多少,我的意思是哪个阶数与获得有效的物理结果相关:3、4、6 或者可能是 10。如果我的度数太大,结果无效,因为我有狄拉克峰和直线。

我想保持正确的多项式次数取决于插值曲线的初始点数(第一个数字为 140 个点)和其他参数。

作为结论,谁能告诉我是否有确定应用哪个多项式次数的标准?我的意思是从相对误差的角度来看最相关的次数。

如果我不做回归,我有以下难以解释的情节:

这就是为什么我想对这些数据进行插值,以更清楚地看到不同相对进化之间的差异。

PS:这里是多项式回归的代码片段:

stepForFit = np.logspace(-8.0,-1.0,10000)
coefs_3_15 = poly.polyfit(np.log10(stepNewArray), np.log10(errorRelative_3_15), 10)
ffit_3_15 = poly.polyval(np.log10(stepForFit), coefs_3_15)
coefs_5_15 = poly.polyfit(np.log10(stepNewArray), np.log10(errorRelative_5_15), 10)
ffit_5_15 = poly.polyval(np.log10(stepForFit), coefs_5_15)
coefs_7_15 = poly.polyfit(np.log10(stepNewArray), np.log10(errorRelative_7_15), 10)
ffit_7_15 = poly.polyval(np.log10(stepForFit), coefs_7_15)

# Plot interpolation curves
plt.plot(stepForFit[stepArrayId], np.power(10,ffit_3_15[stepArrayId]), colorDerPlot[0])
plt.plot(stepForFit[stepArrayId], np.power(10,ffit_5_15[stepArrayId]), colorDerPlot[1])
plt.plot(stepForFit[stepArrayId], np.power(10,ffit_7_15[stepArrayId]), colorDerPlot[2])v

更新 1: 鉴于我没有关于相对误差值的假设(或模型),我无法施加约束 apriori 关于必须 best-fit 数据的多项式度数。

但也许我有线索,因为我计算的导数是 3、5、7 和 15 点。所以我分别有 O(h^2)、O(h^4)、O(h^6) 和 O(h^14) 水平的不确定性。

例如,对于 3 点导数,我有:

等最后的导数表达式:

顺便说一句,我不明白为什么我们在表达式之间从 $O(h^4)$ 传递到 $O(h^2)$。

但主要问题是我还没有立即假设我必须应用的多项式次数。

也许,我应该测试多项式次数的范围并在每次 chi2 时计算,所以最小的 chi2 会给我正确的次数来考虑。

你怎么看这个? Numpy 或 Python 是否已经有这种具有特定功能的研究?

更新 2: 我试图确定最适合数据的 1-15 次多项式范围。我的标准是为每个度拟合一个多项式,然后计算“插值计算数据”和“实验数据”之间的 chi2。如果新的 chi2 低于以前的 chi2,我更新度数以选择进行多项式回归。

不幸的是,对于3,5和7点导数中的每一个,我总是通过“理想度”的研究得到,最大度对应于degree-interval探索的最大值。

好的,chi2 是最高级别的最小值,但这与物理结果不符。人们不要忘记低于 10^-4,Cl' 的行为是混乱的,所以我不期望将导数收敛的物理解释作为导数点数的增加。

但有趣的区域在 10^-4 以上,我的稳定性更高。

鉴于我选择最佳度数作为 chi2 函数的方法不起作用(它总是给出探索范围的最大度数),是否有另一种方法可以很好地拟合?我知道这很难,因为小步骤的混乱区域。

最后,三次回归(3 度)给出了漂亮的曲线,但我不明白为什么这只发生在 3 度而不是更高的度数。

正如有人在评论中所说,对于更高的程度,回归过度拟合:如何解决这个问题?

我不得不说,我觉得你的问题提法很混乱,所以我只能帮你做一个笼统的回答。也许下次你可以把你的大问题分成几个小问题。

首先,我假设您的问题是:微分模板中的点数有何影响,之后我何时对导数进行多项式插值?

模板中的点数通常会提高导数计算的准确性。您可以通过为数值导数中的变量填充泰勒展开式来看到这一点。条款取消后,您会留下一些高阶条款,这些条款为您提供了您所犯错误的下限。然而,潜在的假设是,您计算导数的函数(在您的情况下为 C)在您计算导数的区间上是平滑的。这意味着如果您的函数在 15 点模板上表现不佳,那么该导数基本上毫无价值。

多项式回归中多项式的通常是用户选择的自由参数,因为用户可能知道他们的序列在某种程度上表现得像多项式,但不知道多项式系数。如果你对你的数据有所了解,你可以自己设置度数。例如,如果您知道您的数据与步长呈线性相关,则可以将度数设置为 1 并进行线性回归。在这种情况下,您不想指定任何更高的次数,因为您的数据可能符合多项式,但您知道事实并非如此。以类似的方式,如果您知道您的数据在某种程度上表现得像多项式,那么您肯定不想拟合得更高。如果您真的不知道多项式的次数应该是多少,那么您应该做出有根据的猜测。一个好的策略是绘制通过数据点的多项式,同时将多项式提高一次。然后,您希望这条线位于两点之间,而不是向特定点发散。如果您有很多异常值,则存在比最小二乘法更适合的方法。

现在开始具体解决您的问题。

  • 除非您有更多关于您的数据的信息,否则无法计算最佳度数。程度是一个超参数。如果你想要一个最优的,你需要添加额外的先验信息,比如"I want the lowest degree polynomial that fits the data with an error epsilon."
  • 通过选择较低次数的多项式可以简单地修复过度拟合。如果这不能解决问题,那么最小二乘回归不适合你。您需要研究选择不同指标的回归方法,或者您需要预处理数据,或者您需要非多项式拟合(拟合特定形状的函数,然后使用 Levenberg-Marquardt 例如)。
  • 15 步导数看起来很可疑,您的数据中可能没有这种平滑度。如果您对此有充分的理由,请告诉我们,否则只需对一阶导数使用 2 个点,或者对第二个导数使用 3 或 5。
  • 带有 Landau 符号 (big-O) 的表达式没有将四阶转换为二阶。如果将两个方程相减并除以 h^2,则 O(h^4)/h^2 变为 O(h^2)