编程语言
首页 > 编程语言> > 用Python拟合总和

用Python拟合总和

作者:互联网

假设拟合函数的类型为:

我打算将这种函数适合我拥有的实验数据(x,y = f(x)).但是后来我有些怀疑:

>当涉及总和时,如何定义拟合函数?
>一旦定义了函数,即def func(..)return …仍然可以使用scipy.optimize中的curve_fit吗?因为现在与通常的拟合情况相比,其中涉及一组参数s_i和r_i,其中单个参数很少.
>最后,这种情况是否完全不同?

在这里感觉有点迷路,感谢您的帮助.

解决方法:

这非常接近scipy.optimize.curve_fit(或只是scipy.optimize.leastsqr).涉及总和的事实根本没有关系,也没有参数数组.唯一需要注意的是,curve_fit希望为您的fit函数提供参数作为单独的参数,而minimumsqr给出单个向量.

这是一个解决方案:

import numpy as np
from scipy.optimize import curve_fit, leastsq

def f(x,r,s):
    """ The fit function, applied to every x_k for the vectors r_i and s_i. """
    x = x[...,np.newaxis]  # add an axis for the summation
    # by virtue of numpy's fantastic broadcasting rules,
    # the following will be evaluated for every combination of k and i.
    x2s2 = (x*s)**2
    return np.sum(r * x2s2 / (1 + x2s2), axis=-1)

# fit using curve_fit
popt,pcov = curve_fit(
    lambda x,*params: f(x,params[:N],params[N:]),
    X,Y,
    np.r_[R0,S0],
)
R = popt[:N]
S = popt[N:]

# fit using leastsq
popt,ier = leastsq(
    lambda params: f(X,params[:N],params[N:]) - Y,
    np.r_[R0,S0],
)
R = popt[:N]
S = popt[N:]

注意事项:

>开始时,我们需要一维测量的X和Y数组以适合初始猜测的一维数组R0和S0,以及这两个数组的长度Nthe.
>我将实际模型f的实现与提供给钳工的目标函数分开.我使用lambda函数实现的代码.当然,也可以具有普通的def …函数并将它们组合为一个.
>模型函数f使用numpy的广播同时对一组参数(沿最后一个轴)求和,并并行计算许多x(沿最后一个轴之前的任何轴,尽管如果两个以上的拟合函数都会抱怨多个) …. ravel()在那里提供帮助)
>我们使用numpy的速记np.r_ [R,S]将拟合参数R和S连接到单个参数向量中.
> curve_fit将每个单个参数作为不同的参数提供给目标函数.我们希望将它们作为向量,因此我们使用* params:它在单个列表中捕获所有剩余参数.
> minimumsq给出单个参数向量.但是,它既不提供x,也不将其与y进行比较.这些直接绑定到目标函数中.

标签:scipy,curve-fitting,data-fitting,python
来源: https://codeday.me/bug/20191120/2042913.html