我想知道在我的时间序列中是否有一个峰值。为此,我尝试将数据点拟合为高斯曲线。它适用于我的数千个样本:
但很少有人不适合,尽管有一个明显的高峰:
(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上浏览过其他类似的问题,但没有找到解决我问题的方法。
如果有人知道一个更好的解决方案来确定时间序列中是否有峰值,我很乐意在评论中听到它。不管怎样,我想知道为什么有些曲线拟合不好。
1条答案
按热度按时间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)"。