python 拟合曲线的极致_Scipy优化曲线拟合极限

正如另一个答案中所建议的,您可以使用lmfit来解决此类问题。因此,我添加了一个例子来说明如何使用它,以防有人也对这个主题感兴趣。

假设您有一个数据集,如下所示:xdata = np.array([177.,180.,183.,187.,189.,190.,196.,197.,201.,202.,203.,204.,206.,218.,225.,231.,234.,

252.,262.,266.,267.,268.,277.,286.,303.])

ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,

0.72,0.69,0.75,0.59,0.61,0.63,0.64,0.63,0.35,0.27,0.26])

您希望将模型与如下所示的数据相匹配:model = n1 + (n2 * x + n3) * 1./ (1. + np.exp(n4 * (n5 - x)))

限制条件是0.2 < n1 < 0.8

-0.3 < n2 < 0

使用lmfit(0.8.3版)可以获得以下输出:n1: 0.26564921 +/- 0.024765 (9.32%) (init= 0.2)

n2: -0.00195398 +/- 0.000311 (15.93%) (init=-0.005)

n3: 0.87261892 +/- 0.068601 (7.86%) (init= 1.0766)

n4: -1.43507072 +/- 1.223086 (85.23%) (init=-0.36379)

n5: 277.684530 +/- 3.768676 (1.36%) (init= 274)

aa7e5e74f4e33629f5afee7fbba12d1c.png

如您所见,fit很好地再现了数据,并且参数在请求的范围内。

下面是复制情节的完整代码,并附带一些注释:from lmfit import minimize, Parameters, Parameter, report_fit

import numpy as np

xdata = np.array([177.,180.,183.,187.,189.,190.,196.,197.,201.,202.,203.,204.,206.,218.,225.,231.,234.,

252.,262.,266.,267.,268.,277.,286.,303.])

ydata = np.array([0.81,0.74,0.78,0.75,0.77,0.81,0.73,0.76,0.71,0.74,0.81,0.71,0.74,0.71,

0.72,0.69,0.75,0.59,0.61,0.63,0.64,0.63,0.35,0.27,0.26])

def fit_fc(params, x, data):

n1 = params['n1'].value

n2 = params['n2'].value

n3 = params['n3'].value

n4 = params['n4'].value

n5 = params['n5'].value

model = n1 + (n2 * x + n3) * 1./ (1. + np.exp(n4 * (n5 - x)))

return model - data #that's what you want to minimize

# create a set of Parameters

# 'value' is the initial condition

# 'min' and 'max' define your boundaries

params = Parameters()

params.add('n1', value= 0.2, min=0.2, max=0.8)

params.add('n2', value= -0.005, min=-0.3, max=10**(-10))

params.add('n3', value= 1.0766, min=-1000., max=1000.)

params.add('n4', value= -0.36379, min=-1000., max=1000.)

params.add('n5', value= 274.0, min=0., max=1000.)

# do fit, here with leastsq model

result = minimize(fit_fc, params, args=(xdata, ydata))

# write error report

report_fit(params)

xplot = np.linspace(min(xdata), max(xdata), 1000)

yplot = result.values['n1'] + (result.values['n2'] * xplot + result.values['n3']) * \

1./ (1. + np.exp(result.values['n4'] * (result.values['n5'] - xplot)))

#plot results

try:

import pylab

pylab.plot(xdata, ydata, 'k+')

pylab.plot(xplot, yplot, 'r')

pylab.show()

except:

pass

编辑:

如果使用0.9.x版本,则需要相应地调整代码;请检查here哪些更改已从0.8.3更改为0.9.x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值