如何在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相关系数的检验呢,求指导啊

在 Python 中计算 Pearson 相关性和显着性

python实现pearson相关性检验

如何在正确视图中创建 pearson 相关矩阵

python pearson_r_confidence_interval

python 使用Pearson Correlation Heatmap绘制相关矩阵