在Python中为数据拟合和

时间:2015-05-19 10:51:09

标签: python scipy curve-fitting data-fitting

鉴于拟合函数的类型是: enter image description here

我打算将这样的函数拟合到我所拥有的实验数据(x,y = f(x))。但后来我有些疑惑:

  • 如果涉及总和,如何定义拟合函数?

  • 一旦定义了函数,即def func(..) return ...,是否仍然可以使用scipy.optimize中的curve_fit?因为现在有一组参数s_i和r_i与通常的拟合案例相比较,其中一个参数的单个参数很少。

  • 最后这些案件的处理完全不同了吗?

感谢您的帮助。感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

scipy.optimize.curve_fit(或仅scipy.optimize.leastsqr)可以实现这一点。涉及总和的事实根本不重要,也没有参数数组。唯一需要注意的是curve_fit想要将fit参数作为单独的参数给出,而leastsqr给出一个向量。

这是一个解决方案:

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:]

有几点需要注意:

  • 一旦开始,我们需要1d数组XY的测量结果,1d数组R0S0作为初始猜测和{{1}这两个数组的长度。
  • 我将实际模型N的实现与提供给装配工的目标函数分开。我使用lambda函数实现的那些。当然,也可以使用普通的f函数并将它们合并为一个。
  • 模型函数def ...使用numpy的广播同时对一组参数求和(沿着最后一个轴),并且并行计算许多f(沿着最后一个轴之前的任何轴)如果有多个...... x可以提供帮助,那么拟合函数会抱怨
  • 我们使用numpy的简写.ravel()将拟合参数R和S连接成一个参数向量。
  • np.r_[R,S]将每个参数作为目标函数的不同参数提供。我们希望它们作为向量,因此我们使用curve_fit:它在一个列表中捕获所有剩余参数。
  • *params给出单个参数矢量。但是,它既不会提供leastsq,也不会将其与x进行比较。这些直接绑定到目标函数中。

答案 1 :(得分:0)

为了使用scipy.optimize.leastsq来估计多个参数,您需要将它们打包到一个数组中并将它们解压缩到您的函数中。然后,您可以随心所欲地做任何事情。例如,如果您的s_i是前3个,而您的r_i是数组p中接下来的三个参数,那么您只需设置ssum=p[:3].sum()rsum=p[3:6].sum()。但同样,您的参数未被识别(根据您的评论),因此估算毫无意义。

有关使用leastsq的示例,请参阅Cookbook的Fitting Data example