scipy 用python拟合二项分布曲线

5kgi1eie  于 2023-02-04  发布在  Python
关注(0)|答案(2)|浏览(182)

我试图将这个列表拟合为二项分布:[0、1、1、1、3、5、5、9、14、20、12、8、5、3、6、9、13、15、18、23、27、35、25、18、12、10、9、5、0]
我需要检索分布的参数,以便将其应用到需要进行的一些模拟中。我使用的是scipy:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats import binom

data = [0, 1, 1, 1, 3, 5 , 5, 9, 14, 20, 12, 8, 5, 3, 6, 9, 13, 15, 18, 23, 27, 35, 25, 18, 12, 10, 9, 5 , 0]

def fit_function(x, n, p):
    return binom.pmf(x, n, p)

num_bins = 10

params, covmat = curve_fit(fit_function, 10,  data)

但我得到了以下错误:
运行时错误追溯(最近调用最后)在4 5 #拟合中使用curve_fit----〉6个参数,cov_matrix = curve_fit(fit_function,10,数据)
~\ AppData\Local\Continuum\anaconda3\envs\py37\lib\site-packages\scipy\optimize\minpack.py在曲线拟合中(f,扩展数据,ydata,p0,sigma,绝对值sigma,有限检查,边界,方法,jac,**kwargs)746成本= np.总和(信息字典["fvec"]**2)747如果用户接口不在[1,2,3,4]中:- -〉748引发RuntimeError("未找到最佳参数:"+错误消息)749否则:750 #如果指定,将maxfev(最小二乘)重命名为max_nfev(最小二乘)。
运行时错误:未找到最佳参数:对函数的调用次数已达到maxfev = 600。
不管误差如何,我怎样才能用python把这些数据拟合成二项式曲线呢?

igetnqfo

igetnqfo1#

看来你需要增加迭代次数maxfev,试试看

params, covmat = curve_fit(fit_function, 10,  data, maxfev=2000)
rsl1atfo

rsl1atfo2#

可以使用distfit库来检索离散分布的参数。下面是一个小示例:

pip install distfit

# Generate random numbers
from scipy.stats import binom
# Set parameters for the test-case
n = 8
p = 0.5

# Generate 10000 samples of the distribution of (n, p)
X = binom(n, p).rvs(10000)
print(X)
[4 7 4 ... 2 2 6]

dfit = distfit(method='discrete')
# Search for best theoretical fit on your empirical data
dfit.fit_transform(X)

# Get the model and best fitted parameters.
print(dfit.model)

# {'distr': <scipy.stats._distn_infrastructure.rv_frozen at 0x1ff23e3beb0>,
#  'params': (8, 0.4999585504197037),
#  'name': 'binom',
#  'SSE': 7.786589839641551,
#  'chi2r': 1.1123699770916502,
#  'n': 8,
#  'p': 0.4999585504197037,
#  'CII_min_alpha': 2.0,
#  'CII_max_alpha': 6.0}

# Best fitted n=8 and p=0.4999 which is great because the input was n=8 and p=0.5
dfit.model['n']
dfit.model['p']

# The plot function
dfit.plot(chart='PDF',
      emp_properties={'linewidth': 4, 'color': 'k'},
      bar_properties={'edgecolor':'k', 'color':None},
      pdf_properties={'linewidth': 4, 'color': 'r'})

  • 免责声明:我也是这本书的作者。

相关问题