关于ZAKER 融媒体解决方案 合作 加入

python – scipy.optimize.curve_fit 无法适应偏移 .

CocoaChina 10-21

我试图使用 scipy 的curve_fit函数来拟合偏斜和偏移的高斯曲线 , 但我发现在某些条件下拟合非常差 , 通常使我接近或完全是直线 .

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

import numpy as npfrom scipy.optimize import curve_fitimport matplotlib.pyplot as pltimport math as mathimport scipy.special as sp#def func ( x, a, b, c ) :# return a*np.exp ( -b*x ) + cdef 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 + cx = 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 = 10 和 mu = 50 更改代码中的这一行

以上内容由"CocoaChina"上传发布 查看原文
相关标签 高斯最大值

觉得文章不错,微信扫描分享好友

扫码分享