【问题标题】:python numpy/scipy curve fittingpython numpy/scipy曲线拟合
【发布时间】:2013-10-10 12:13:49
【问题描述】:

我有一些点,我正在尝试为这些点拟合曲线。我知道存在scipy.optimize.curve_fit 函数,但我不了解文档,即如何使用此函数。

我的积分:np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

谁能解释一下怎么做?

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    您首先需要将 numpy 数组分成两个单独的数组,其中包含 x 和 y 值。

    x = [1, 2, 3, 9]
    y = [1, 4, 1, 3]
    

    curve_fit 还需要一个函数来提供您想要的拟合类型。例如,线性拟合会使用类似

    的函数
    def func(x, a, b):
        return a*x + b
    

    scipy.optimize.curve_fit(func, x, y) 将返回一个包含两个数组的 numpy 数组:第一个将包含最适合您的数据的 a 和 b 的值,第二个将是最佳拟合参数的协方差。

    这是与您提供的数据进行线性拟合的示例。

    import numpy as np
    from scipy.optimize import curve_fit
    
    x = np.array([1, 2, 3, 9])
    y = np.array([1, 4, 1, 3])
    
    def fit_func(x, a, b):
        return a*x + b
    
    params = curve_fit(fit_func, x, y)
    
    [a, b] = params[0]
    

    此代码将返回 a = 0.135483870968 和 b = 1.74193548387

    这是一个包含您的点和线性拟合的图...这显然是一个糟糕的图,但您可以更改拟合函数以获得您想要的任何类型的拟合。

    【讨论】:

      【解决方案2】:

      我建议您从简单的多项式拟合开始,scipy.optimize.curve_fit 尝试将您必须知道的函数 f 拟合到一组点。

      这是使用 numpy.polyfit 和 poly1d 的简单 3 度多项式拟合,第一个执行最小二乘多项式拟合,第二个计算新点:

      import numpy as np
      import matplotlib.pyplot as plt
      
      points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
      # get x and y vectors
      x = points[:,0]
      y = points[:,1]
      
      # calculate polynomial
      z = np.polyfit(x, y, 3)
      f = np.poly1d(z)
      
      # calculate new x's and y's
      x_new = np.linspace(x[0], x[-1], 50)
      y_new = f(x_new)
      
      plt.plot(x,y,'o', x_new, y_new)
      plt.xlim([x[0]-1, x[-1] + 1 ])
      plt.show()
      

      【讨论】:

      • 这仅适用于给定的数据集。但是当我改变点时,在大多数情况下,两点之间只有曲线。为什么?
      • 问题是你的x数组没有排序,因此polyfit不能正常工作,你必须正确地重新排序两个数组:x = np.array([-1., 0., .5, 1.])和y = np.array([.9, 0., .7, 1.])
      • 对 x val 进行排序的替代方法:x_new = np.linspace(min(x), max(x), 50)
      • 在这种特定情况下,多项式拟合有点矫枉过正。数据过度拟合,至少对于 3 次多项式。只是一条水平线似乎更真实。
      • 请注意,由于 numpy 版本 1.4,文档建议使用 numpy.polynomial 而不是 numpy.polyfit
      猜你喜欢
      • 2014-09-08
      • 2017-04-21
      • 2017-04-07
      • 2018-11-20
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多