scipy curve_fit未找到最佳拟合

bxfogqkk  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(175)

我想知道在我的时间序列中是否有一个峰值。为此,我尝试将数据点拟合为高斯曲线。它适用于我的数千个样本:

但很少有人不适合,尽管有一个明显的高峰:

(see最高点在0.03左右的非常低的峰值)
代码如下:

def gauss(x, a, x0, sigma):
    return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))

param, covariance = curve_fit(gauss, x, y)

我注意到y值的大小在拟合中起作用,因此我将数据重新缩放为<0,100>区间。这有助于解决所有案件,但并没有解决所有案件。我还能做些什么来改进试衣吗?不同的初始化?更小的优化步骤?
以下是有关数据的一些事实:

  • 每个样本有3-20个数据点。
  • 峰(如果有)的最高点必须在跨度内。
  • x轴为0至20
  • y轴为0至100

我在stackoverflow上浏览过其他类似的问题,但没有找到解决我问题的方法。
如果有人知道一个更好的解决方案来确定时间序列中是否有峰值,我很乐意在评论中听到它。不管怎样,我想知道为什么有些曲线拟合不好。

zqry0prt

zqry0prt1#

非线性回归涉及从参数的初始“猜测”值开始的迭代演算。
当“猜测”值与未知的正确值相差太远时,可能会出现问题。
为了避免困难,可以使用不需要初始值的非迭代方法。
该非常规方法如下所示:

数值示例:

该方法的一般原理解释如下:https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales
注:由于问题中没有给出原始数据,因此上述结果并不准确。点的坐标是在第二个OP的图上测量的,这不是准确的测量。
我建议OP尝试将上述结果作为参数的初始值,开始他的软件的迭代过程,看看微积分的麻烦是否消失。注意使用的不同符号:his“a”= my“B”; his“x0”= my“c”; his“sigma”= my“1/sqrt(2p)"。

相关问题