3

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

绘制 15 点的导数

现在,我想将这个 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 次多项式回归,我会得到以下图:

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:鉴于我没有关于相对误差值的假设(或模型),我不能对必须最适合数据的多项式程度施加先验约束。

但也许我有一个线索,因为我计算的导数是 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 点导数中的每一个,我总是通过“理想度数”的这项研究得到,最大度数对应于所探索的度数间隔的最大值。

好的,chi2 对于最高程度来说是最小的,但这与物理结果不对应。不要忘记,在 10^-4 以下,Cl' 的行为是混乱的,所以我不期望将导数收敛的物理解释为导数点数的增加。

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

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

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

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

4

1 回答 1

1

我不得不说我发现你的问题表述非常混乱,所以我只能帮你提供一些笼统的答案。也许下次你可以把你的大问题分成几个小问题。

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

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

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

现在具体来说你的问题。

  • 除非您有有关数据的更多信息,否则无法计算最佳度数。度数是一个超参数。如果您想要一个最优值,您需要添加额外的先验信息,例如“我想要适合具有误差 epsilon 的数据的最低次数多项式”。
  • 通过选择较低次数的多项式可以简单地修复过度拟合。如果这不能解决问题,那么最小二乘回归不适合您。您需要研究一种选择不同度量的回归方法,或者您需要预处理您的数据,或者您需要一个非多项式拟合(拟合某个形状的函数,然后使用 Levenberg-Marquardt 例如)。
  • 15 步导数看起来很可疑,您的数据中可能没有这种平滑度。如果您有充分的理由,请告诉我们,否则一阶导数使用 2 分,二阶导数使用 3 或 5。
  • 带有朗道符号 (big-O) 的表达式不会将四阶转换为二阶。如果你减去这两个方程并除以h^2O(h^4)/h^2变成O(h^2)
于 2019-11-29T21:51:48.130 回答