gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:00:08 24 4
gpt4 key购买 nike

我正在尝试使用 scipy 的 curve_fit 拟合倾斜和偏移的高斯曲线功能,但我发现在某些条件下拟合很差,经常给我接近或恰好是一条直线。

以下代码源自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))

使用 sigma=10mu=50 更改代码中的这一行会产生 enter image description here

关于python - scipy.optimize.curve_fit 无法拟合偏移的倾斜高斯曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com