使用python的scipy.optimize.leastsq()加权拟合四参数方程

在免疫分析中,经常要使用多点定标法,然后通过四参数拟合求得样本的信号值对应的浓度值。在很多软件上均可以求得不带权重的拟合曲线,如果需要代入权重,可以使用Origin软件求解。
但如果要使用自行设定的权重,经常需要尝试多次,才能得到较好的拟合结果,如果使用脚本,可以让求解的结果自动判定,然后根据结果选出最好的那组,比使用软件更加方便。
以下先给出加权拟合的方法,迭代筛选拟合结果的部分以后再写。

# -*- coding:utf-8 -*-

import numpy as np
from scipy.optimize import leastsq
import xlwings as xw

def f_fit(x, A1, A2, x0, p):
	return (A1 - A2) / (1 + (x / x0) ** p) + A2

def f_err(params, y, x, wt):
	return np.sqrt((y - f_fit(x, *params)) ** 2 * wt)

wb = xw.Book("CA50.xlsx")
sht = wb.sheets[0]

x = np.array(sht.range("B2:B11").value)
y = np.array(sht.range("C2:C11").value)
wt = np.array(sht.range("D2:D11").value)

outcome, ret_vel = leastsq(f_err, [1, 1, 1, 1], args = (y, x, wt), 
                   maxfev = 900000)
print(ret_vel)
outcome = np.array([outcome]).T

wb.sheets[0].range("H2").value = outcome
wb.save()

如果在f_err()与leastsq()中不传入wt,则是普通的拟合。
f_err的构建方式可以有很多种,上面选择的是回算浓度比较接近于使用Origin直接权重拟合的方法。
outcome得到的是四个参数的列表,这里采用构建二维array的方式经过转置,再写入第一个工作表的H2-H5格。竖排比较方便于查看与参与后续计算。
如果使用[1,1,1,1]作为初始值,python拟合的参数与Origin的相差很大,但代入信号值计算的浓度值差异都很小。
如果对免疫分析比较熟悉了,可以采用其他比较接近于Origin参数的初始值,则求得的参数与其相差无几。
另外,leastsq()的 maxfev尽量设置大一些,只要能在合适的时间内求得拟合结果即可。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值