在python中拟合多变量curve_fit

时间:2013-12-25 05:26:35

标签: python scipy curve-fitting

我正在尝试将一个简单的函数放在python中的两个独立数据数组中。我知道我需要将我的自变量的数据聚集到一个数组中,但是当我尝试进行拟合时,我传递变量的方式似乎仍然存在问题。 (之前有几篇与此相关的帖子,但它们没有多大帮助。)

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x_3d, a, b, c, d):
    return a + b*x_3d[0,:] + c*x_3d[1,:] + d*x_3d[0,:]*x_3d[1,:]

x_3d = np.array([[1,2,3],[4,5,6]])

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d[:2,:], x_3d[2,:], p0)
print ' fit coefficients:\n', fitParams

我读错了,

raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m)) 
TypeError: Improper input: N=4 must not exceed M=3

M的长度是多少? N的长度是p0吗?我在这里做错了什么?

2 个答案:

答案 0 :(得分:21)

N和M在the help中定义为函数。 N是数据点的数量,M是参数的数量。因此,您的错误基本上意味着您需要至少与参数一样多的数据点,这非常有意义。

此代码适用于我:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x, a, b, c, d):
    return a + b*x[0] + c*x[1] + d*x[0]*x[1]

x_3d = np.array([[1,2,3,4,6],[4,5,6,7,8]])

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d, x_3d[1,:], p0)
print ' fit coefficients:\n', fitParams

我收录了更多数据。我还将fitFunc改为以一种形式写入,该扫描形式只是单个x的函数 - fitter将处理所有数据点的调用。您发布的代码也引用了x_3d[2,:],这导致了错误。

答案 1 :(得分:0)

默认的curve_fit方法要求拟合函数fitFunc的参数少于数据点。我在安装一个总共需要15个参数的函数时遇到了同样的问题,而我只有13个数据点。解决方案是使用另一种方法(例如dogboxtrf)。