我正在研究数值导数的稳定性,这是我计算这些导数所采取的步骤的函数。对于具有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:鉴于我没有相对误差值的假设(或模型),因此我不能对必须最适合数据的多项式的程度进行先验约束。
但是也许我有一个线索,因为我计算出的导数是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度而不发生于更高的度数。
正如某人在评论中所说,对于更高的程度,回归是过拟合的:如何解决这个问题?
问候
最佳答案
我不得不说,我发现您的问题表达非常混乱,所以我只能为您提供一些一般性的答案。也许您下次可以将自己的大问题分成几个较小的问题。
首先,我假设您的问题是:当我随后对导数进行多项式插值时,微分模具中的点数如何重要?
模具中的点数通常会提高导数的计算精度。您可以通过为数值导数中的变量填写泰勒展开式来看到。术语取消后,您将获得一些较高阶的术语,从而使您可以降低所犯错误的范围。但是,基本假设是,计算导数的函数(在您的情况下为C)在计算导数的间隔上是平滑的。这意味着,如果您的功能在15点模具上的表现不佳,则该导数本质上是毫无价值的。
多项式回归中多项式的顺序通常是用户选择的自由参数,因为用户可能知道其级数在一定程度上表现得像多项式,但是却不知道多项式系数。如果您对数据有所了解,则可以自己设置程度。例如,如果您知道数据与步长线性相关,则可以将次数设置为1,然后进行线性回归。在这种情况下,您不想指定更高的次数,因为您的数据很可能适合多项式,但您知道并非如此。以类似的方式,如果您知道数据在某种程度上表现为多项式,那么您当然不希望适合更高的值。如果您真的不知道多项式应该是多少度,那么您应该进行有根据的猜测。一个好的策略是绘制经过数据点的多项式,一次将多项式上调一次。然后,您希望线在点之间移动,而不是向特定点发散。如果您有许多离群值,则存在比最小二乘法更适合的方法。
现在具体解决您的问题。
除非您具有有关数据的更多信息,否则无法计算最佳度。度是一个超参数。如果您想要一个最佳选择,则需要添加其他先验信息,例如“我想要具有误差epsilon的数据的最低次多项式”。
通过选择较低次多项式可以简单地解决过度拟合问题。如果那不能解决问题,那么最小二乘回归不适合您。您需要研究选择不同度量标准的回归方法,或者需要预处理数据,或者需要非多项式拟合(拟合特定形状的函数,然后使用Levenberg-Marquardt)。
15步导数看起来非常可疑,您的数据中可能没有这种平滑度。如果您有充分的理由,请告诉我们,否则只需对一阶导数使用2点,对第二阶导数使用3或5。
具有Landau符号(big-O)的表达式不会将四阶转换为第二阶。如果将两个方程式相减并除以h^2
,则O(h^4)/h^2
变为O(h^2)
。
关于python - 哪个多项式回归度显着?取决于点数或其他参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58985370/