gpt4 book ai didi

Python - 用指数函数拟合数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:56 31 4
gpt4 key购买 nike

我知道有几个关于类似主题的问题,但我找不到合适的答案。

我想用一个函数(称为 Bastenaire)拟合一些数据并获取参数值。这是代码:

import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize

def bastenaire(s, A,B, C,sd):

logNB=np.log(A)-C*(s-sd)-np.log(s-sd)

return np.exp(logNB)-B

S=np.array([659,646,634,623,613,595,580,565,551,535,515,493,473,452,432,413,394,374,355,345])
N=np.array([46963,52934,59975,65522,74241,87237,101977,116751,133665,157067,189426,233260,281321,355558,428815,522582,630257,768067,902506,1017280])


fitmb,fitmob=optimize.curve_fit(bastenaire,S,N,p0=(30000,2000000000,0.2,250))


plt.scatter(N,S)
plt.plot(bastenaire(S,*fitmb),S,label='bastenaire')
plt.legend()

plt.show()

但是,曲线拟合无法识别正确的参数,我得到:OptimizeWarning:无法估计参数的协方差。当我没有给出输入参数值时,结果相同。

Figure

有什么方法可以调整一些东西并获得结果吗?我的数据集是否应该涵盖更广泛的范围和值?

谢谢!

布洛克

最佳答案

拟合很困难,您需要使用 bounds 来限制参数空间并且(经常)检查一下您的初始值。

为了让它发挥作用,我搜索了函数具有正确外观的初始值,然后估计了一些约束:

bounds = np.array([(1e4, 1e12), (-np.inf, np.inf), (1e-20, 1e-2), (-2000., 20000)]).T
fitmb, fitmob = optimize.curve_fit(bastenaire,S, N,p0=(1e7,-100.,1e-5,250.), bounds=bounds)

返回

(array([ 1.00000000e+10,  1.03174824e+04,  7.53169772e-03, -7.32901325e+01]), array([[ 2.24128391e-06,  6.17858390e+00, -1.44693602e-07,
-5.72040842e-03],
[ 6.17858390e+00, 1.70326029e+07, -3.98881486e-01,
-1.57696515e+04],
[-1.44693602e-07, -3.98881486e-01, 1.14650323e-08,
4.68707940e-04],
[-5.72040842e-03, -1.57696515e+04, 4.68707940e-04,
1.93358414e+01]]))

关于Python - 用指数函数拟合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498626/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com