其他分享
首页 > 其他分享> > 正确地为scipy的curve_fit定义矢量函数

正确地为scipy的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:操作数不能与形状(2,4)(4,2)一起广播”
转置要拟合的数据:

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()

这给我“函数调用的结果不是正确的浮点数组.”

如何解决此类问题?从数学上讲,应该确定数据是否适合模型.

解决方法:

curve_fit期望函数返回一维数组,因此应将输出展平.在这种情况下,您应该将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.]]

标签:scipy,vector,curve-fitting,python,numpy
来源: https://codeday.me/bug/20191111/2023250.html