如何为scipy的curve_fit

时间:2016-12-23 19:10:21

标签: python numpy vector scipy curve-fitting

我有一个问题,即当尝试曲线拟合时,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:操作数不能与形状(2,4)(4,2)和#34;一起广播。 转置要拟合的数据:

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

给出" TypeError:输入不正确:N = 3不得超过M = 2",因为现在我的函数值少于参数。好的,我知道为什么我不能做到这一点。所以我需要转置函数值:

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

这给了我"函数调用的结果不是一个正确的浮点数。"

如何从这样的问题中获得解决方案?在数学上,如果数据适合模型,则应该很好地确定。

1 个答案:

答案 0 :(得分:3)

curve_fit期望func返回1D数组,因此output应该是flattend。在这种情况下,您应该将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.]]