python - 将概率分布拟合到数据并找到它的累积分布函数

标签 python numpy scipy probability

我想为我的数据拟合一个非对称概率分布,我认为指数修正的高斯分布可以很好地代表我的数据。我

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,第一个问题解决了,但 leastsq 仍然没有给我可靠的输出,我该怎么办?另外,我也想获得这个发行版的CDF

最佳答案

最小二乘法不是用于将数据拟合到给定 pdf 的方法。

您(可能)想要的是最大似然法——即最大化 p(x | a),其中 a 是分布参数,x 是数据。通常形成对数似然并假设独立性,因此 log p(x | a) = sum(log(pdf(x[i], a)), i, 1, n)。

您需要使用一个最小化函数,将 log p(x | a) 作为要最小化的函数,并将 a 作为其自由参数。

关于python - 将概率分布拟合到数据并找到它的累积分布函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24329488/

相关文章:

python - 为 python matplotlib.pyplot 等高线图指定 x 和 y 范围

python - 将 csv 文件加载到 numpy 并按名称访问列

python - 巴特沃斯滤波器 - 输出 x (-1)?

python - 用 Python 从 3D 到 2D

python - 通过 str.contains() 建立索引,然后将值插入到另一列中

Python Pandas - 即使数据帧中存在相同的列,pd.merge 上也会出现 KeyError

python - 一次从特定行和 N 行读取文件

python - 如何从数据框中删除重复项?

python - 用于改进 cython 代码的高效矩阵向量结构

python - 使用 scipy 在 Python 中进行曲线拟合