我想在我的数据中拟合非对称概率分布,我认为指数修正的高斯分布可以很好地代表我的数据。我
m=array([ 16.25, 16.75, 17.25, 17.75, 18.25, 18.75, 19.25, 19.75,
20.25, 20.75, 21.25, 21.75, 22.25, 22.75, 23.25, 23.75,
24.25, 24.75, 25.25, 25.75, 26.25, 26.75, 27.25, 27.75,
28.25, 28.75, 29.25, 29.75, 30.25, 30.75])
pdf=array([ 0.00000000e+00, 2.40818784e-04, 1.38470801e-03,
1.62552679e-03, 3.07043949e-03, 3.37146297e-03,
5.47862733e-03, 8.36845274e-03, 1.61348585e-02,
1.92052980e-02, 2.79951836e-02, 3.97953040e-02,
4.95484648e-02, 7.09211318e-02, 9.50030102e-02,
1.40878989e-01, 1.90186635e-01, 2.42022878e-01,
2.77302830e-01, 2.69054786e-01, 2.40397351e-01,
1.74593618e-01, 9.16917520e-02, 2.41420831e-02,
7.22456352e-03, 3.01023480e-04, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 6.02046960e-05])
我想使用scipy.optimize库,同时可以控制拟合的好坏,并通过改变输入参数的初始条件来查看它以改善卡方。我写了以下代码:
import scipy.special as sse
from math import *
import numpy as np
import scipy.optimize
#defines the PDF of an exponentially modified Gaussian distribution
fitfunc =lambda p,x: 0.5*p[2]*np.exp(0.5*p[2]*(2*p[0]+p[2]*p[1]*p[1]-2*x))*sse.erfc((p[0]+p[2]*p[1]*p[1]-x)/(np.sqrt(2)*p[1]))
"""Deviations of data from fitted curve"""
errfunc = lambda p, x, y: fitfunc(p, x) - y
#initial values
p0=[24,1,1]
p1, success = scipy.optimize.leastsq(errfunc, p0, args=(pdf, m), maxfev=10000)
更新:我刚刚选择了numpy.exp
并解决了第一个问题但仍然是最小的并没有给我可靠的输出,我该怎么办?另外,我也希望获得此发行版的 CDF 。
答案 0 :(得分:4)
最小二乘方法不是用于将数据拟合到给定pdf的方法。
你(可能)想要的是最大似然法 - 即最大化p(x | a),其中a是分布的参数,x是数据。通常,一个形成对数似然并假设独立,因此log p(x | a)= sum(log(pdf(x [i],a)),i,1,n)。
您需要使用最小化函数,将log p(x | a)作为要最小化的函数,并将a作为其自由参数。