用Python拟合指数修正高斯曲线
我有一个数据集和这些数据的核密度估计。我相信KDE应该由一个很好的函数来描述,所以我尝试从KDE中取样,并将这些样本与该类型的函数相匹配。但是,当我尝试使用scipy.optimize.curve_fit进行拟合时,我的拟合与数据完全不匹配。我的代码是用Python拟合指数修正高斯曲线,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我有一个数据集和这些数据的核密度估计。我相信KDE应该由一个很好的函数来描述,所以我尝试从KDE中取样,并将这些样本与该类型的函数相匹配。但是,当我尝试使用scipy.optimize.curve_fit进行拟合时,我的拟合与数据完全不匹配。我的代码是 import scipy.special as sse from scipy.optimize import curve_fit def fit_func(x, l, s, m): return 0.5*l*n.exp(0.5*l*(2
import scipy.special as sse
from scipy.optimize import curve_fit
def fit_func(x, l, s, m):
return 0.5*l*n.exp(0.5*l*(2*m+l*s*s-2*x))*sse.erfc((m+l*s*s-x)/(n.sqrt(2)*s)) # exponential gaussian
popt, pcov = curve_fit(fit_func, n.linspace(0,1,100), data)
我的“数据集”(来自我的KDE采样)是
这是我真实数据的柱状图,红色的KDE,黑色的KDE-
指数修正高斯分布被定义为向左倾斜分布,因此,形状参数不会改变该倾斜的方向 这就是我尝试过的
data.reverse()
popt,pcov=(curve_fit(fit_func, n.linspace(0,1,100), data))
fitted_curve=list(fit_func(n.linspace(0,1,100),popt[0],popt[1],popt[2]))
data.reverse()
fitted_curve.reverse()
您可以通过重新定义x来更改尾部的方向:
exponnorm.pdf(x, K, mu, sigma)
可以重写为
exponnorm.pdf((x-mu)/sigma, K)
如果你想反转,使尾巴在左边,只需使用
exponnorm.pdf(-(x-mu)/sigma, K)
你看过scipy.stats.exponnorm吗?它有一个
fit
方法将分布拟合到数据集。
exponnorm.pdf(-(x-mu)/sigma, K)