scipy.optimize.curve_fit 无法拟合移位的倾斜高斯曲线

2023-12-11

我正在尝试使用 scipy 拟合一条倾斜且移位的高斯曲线曲线拟合函数,但我发现在某些条件下拟合效果很差,经常给我接近或完全是一条直线。

下面的代码源自curve_fit文档。提供的代码是用于测试目的的任意数据集,但很好地显示了问题。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math as math
import scipy.special as sp

#def func(x, a, b, c):
#    return a*np.exp(-b*x) + c

def func(x, sigmag, mu, alpha, c,a):
    #normal distribution
    normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
    normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
    return 2*a*normpdf*normcdf + c

x = np.linspace(0,100,100)
y = func(x, 10,30, 0,0,1)
yn = y + 0.001*np.random.normal(size=len(x))

popt, pcov = curve_fit(func, x, yn,) #p0=(9,35,0,9,1))

y_fit= func(x,popt[0],popt[1],popt[2],popt[3],popt[4])

plt.plot(x,yn)
plt.plot(x,y_fit)

当我将高斯从零移得太远时(使用mu)。我尝试给出初始值,即使是与我的原始函数相同的初始值,但它并不能解决问题。对于值为mu=10, curve_fit工作完美,但如果我使用mu>=30它不再适合数据。


给出最小化的起点通常会产生奇迹。尝试为最小化器提供一些有关最大值位置和曲线宽度的信息:

popt, pcov = curve_fit(func, x, yn, p0=(1./np.std(yn), np.argmax(yn) ,0,0,1))

Changing this single line in your code with sigma=10 and mu=50 produces enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy.optimize.curve_fit 无法拟合移位的倾斜高斯曲线 的相关文章

随机推荐