如何为 scipy 的 curve_fit 正确定义向量函数

How to properly define vector function for scipy's curve_fit

我有一个问题,在尝试曲线拟合时,python 如何计算 x 数组的 (f1(x),f2(x)) 形式的向量函数。

import numpy as np
from scipy.optimize import curve_fit

def func(x,a,b,c):
    return np.array([a*x**b+c,a*x**b+c+1])

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float)
xdata=np.array([1,2,3,4], dtype=float)
popt,pcov = curve_fit(func, xdata, ydata)

给出 "ValueError: operands could not be broadcast together with shapes (2,4) (4,2)" 转置要拟合的数据:

ydata=np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float).transpose()

给出"TypeError: Improper input: N=3 must not exceed M=2",因为现在我的函数值比参数少。好的,我知道为什么我不能适应那个。所以我需要转置函数值:

def func(x,a,b,c):
    return np.array([a*x**b+c,a*x**b+c+1]).transpose()

这给了我 "Result from function call is not a proper array of floats."

如何从这样的问题中得到解决方案?数学上应该很好判断,数据能不能拟合模型。

curve_fit 期望 func returns 一维数组,因此 output 应该是扁平的。在这种情况下,您应该输入 ydata.T.ravel()curve_fit 以获得 func(x,a,b,c) 的元素的正确顺序。

import numpy as np
from scipy.optimize import curve_fit

def func(x,a,b,c):
    output = np.array([a*(x**b)+c,a*(x**b)+c+1])
    return output.ravel()

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float)
xdata=np.array([1,2,3,4], dtype=float)
popt,pcov = curve_fit(func, xdata, ydata.T.ravel())
# print (popt)
# [ 2.,  1., -1.]

测试结果,

func(xdata,*popt).reshape(-1,len(xdata)).T
#  [[ 1.,  2.],
#   [ 3.,  4.],
#   [ 5.,  6.],
#   [ 7.,  8.]]