鉴于拟合函数的类型是:
我打算将这样的函数拟合到我所拥有的实验数据(x,y = f(x))。但后来我有些疑惑:
如果涉及总和,如何定义拟合函数?
一旦定义了函数,即def func(..) return ...
,是否仍然可以使用scipy.optimize中的curve_fit?因为现在有一组参数s_i和r_i与通常的拟合案例相比较,其中一个参数的单个参数很少。
最后这些案件的处理完全不同了吗?
感谢您的帮助。感谢您的帮助。
答案 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:]
有几点需要注意:
X
和Y
的测量结果,1d数组R0
和S0
作为初始猜测和{{1}这两个数组的长度。N
的实现与提供给装配工的目标函数分开。我使用lambda函数实现的那些。当然,也可以使用普通的f
函数并将它们合并为一个。def ...
使用numpy的广播同时对一组参数求和(沿着最后一个轴),并且并行计算许多f
(沿着最后一个轴之前的任何轴)如果有多个...... x
可以提供帮助,那么拟合函数会抱怨.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。