如何在Python中配合Split Pearson 7函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Python中配合Split Pearson 7函数?相关的知识,希望对你有一定的参考价值。
我有一个非对称峰,我想使用带有lmfit的拆分Pearson 7(SP7)函数进行拟合。首先,已经定义了SP7函数,然后用lmfit对其进行了重新调用,但最后出现了以下错误:ValueError:不支持varargs'* p'。为什么?
def polynomial(x, *p):
poly = Polynomial(p)
y = poly(x)
return y
def pearson7(x, *p):
x0, IM, H, m = p
y = IM / (1+4*(2**(1/m)-1)*(x-x0)**2/H**2)**m
return y
def splitpearson7(x, *p):
x0, IM, Hl, ml, Hr, mr = p
pl = [x0, IM, Hl, ml]
pr = [x0, IM, Hr, mr]
y = pearson7(x, *pl)*np.heaviside(x-x0, 0.5) + pearson7(x, *pr)*np.heaviside(x0-x, 0.5)
return y
def splitpearson7_backg(x, *p):
"""
Split PearsonVII distribution with linear background (8 parameters)
* background y = A + Bx
"""
y = splitpearson7(x, *p[0:6]) + polynomial(x, *p[6:8])
return y ```
first_params_fit=[0, np.max(y), 0.05, 0.5, 0.05, 0.5, 10, 0.3]
mod = Model(splitpearson7_backg)
pars = mod.make_params(first_params_fit)
result = mod.fit(y, pars, x=x)
print(result.fit_report()) ```
答案
ValueError: varargs '*p' is not supported.
确实。
Why?
嗯,部分是因为这是定义函数的一种可怕方法,部分是因为它破坏了lmfit.Model
的概念,以便能够为模型函数确定和名称参数。简而言之:可读性很重要。帮助阅读您的代码(包括您将来的自己)的人帮忙并编写可读的代码。
使用splitpearson7
时,该功能参数的含义和顺序丢失。顺序当然仍然很关键,但是没有任何描述。它甚至不说有多少个参数。相反,如果您使用
def splitpearson7(x, x0, IM, Hl, ml, Hr, mr):
pl = [x0, IM, Hl, ml]
pr = [x0, IM, Hr, mr]
y = pearson7(x, *pl)*np.heaviside(x-x0, 0.5) + pearson7(x, *pr)*np.heaviside(x0-x, 0.5)
return y
然后您可以使用[]创建一个[C0
lmfit.Model
并具有命名参数:
sp7_model = lmfit.Model(splitpearson7)
实际上,您的 params = sp7_model.make_params(x0=0, IM=1, Hl=2, ml=3.3, Hr=2.1, mr=5)
函数也可以使用命名参数。或者,您可以使用pearson7
中内置的版本:
lmfit
此外,通常不使用在后台添加功能的模型,而是使用复合模型的方法来构建复合模型,这是“ lmfit模型方法”]
from lmfit.lineshapes import pearson7 def splitpearson7(x, center, amplitude, sigma_left, m_left, sigma_right, m_right): left = heaviside(x-center, 0.5)*pearson7(x, amplitude, center, sigma_left, m_left) right = heaviside(center-x, 0.5)*pearson7(x, amplitude, center, sigma_right, m_right) return left+right
这样可以更轻松地更改背景模型。
以上是关于如何在Python中配合Split Pearson 7函数?的主要内容,如果未能解决你的问题,请参考以下文章
初学python,怎样用python做pearson相关系数的检验呢,求指导啊