【问题标题】:fitting multivariate curve_fit in python在python中拟合多元curve_fit
【发布时间】:2014-01-13 04:40:42
【问题描述】:

我正在尝试为 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 的长度是多少? Np0 的长度吗?我在这里做错了什么?

【问题讨论】:

    标签: python scipy curve-fitting


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 的函数进行扫描的形式编写 - 装配工将处理对所有数据点调用它。您发布的代码还引用了x_3d[2,:],这导致了错误。

      【讨论】:

      • 非常感谢! (我认为M是数据点的数量,N是参数的数量。)
      • 帮助中明确说明了“ydata : N-length sequence”和“p0 : None, scalar, or M-length sequence”,所以N是数据点的个数,M是参数的个数.不过,错误消息似乎使它们倒退了:-)。如果您认为此答案有帮助,请考虑接受该答案。
      • @VolodimirKopey 我真的看不出这个回复给这个回复增加了什么——他们看起来和我很相似。
      • @chthonicdaemon 自从您上次发表评论以来,似乎 M 和 N 已经切换。现在 ydata 的长度为 M 并且 p0 可以是长度为 N 的序列。
      • @Joshua 是的,我提交了bug report and the fix。我想我应该更新这个答案。
      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2019-12-03
      • 2021-11-11
      • 2018-11-04
      • 2020-05-05
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多