用Python拟合指数修正高斯曲线

用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

我有一个数据集和这些数据的核密度估计。我相信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*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)