【问题标题】:Use of curve_fit to fit data使用curve_fit拟合数据
【发布时间】:2012-06-07 03:32:23
【问题描述】:

我是 scipy 和 matplotlib 的新手,我一直在尝试将函数拟合到数据中。 Scipy Cookbook 中的第一个示例非常有效,但是当我尝试使用从文件中读取的点时,我给出的初始系数(下面的 p0)似乎从未真正改变,并且协方差矩阵始终为 INF。

我尝试在一行之后拟合数据,但无济于事。我导入数据的方式有问题吗?如果是这样,有没有更好的方法呢?

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy as sy

with open('data.dat') as f:
    noms = f.readline().split('\t')

    dtipus = [('x', sy.float32)] + [('y', sy.float32)]

    data = sy.loadtxt(f,delimiter='\t',dtype=dtipus)

    x = data['x']
    y = data['y']

    def func(x, a, b, c):
        return a*x**b + c

    p0 = sy.array([1,1,1])

    coeffs, matcov = curve_fit(func, x, y, p0)

    yaj = func(x, coeffs[0], coeffs[1], coeffs[2])

    print(coeffs)
    print(matcov)

    plt.plot(x,y,'x',x,yaj,'r-')
    plt.show()

谢谢!

【问题讨论】:

    标签: python python-3.x scipy curve-fitting least-squares


    【解决方案1】:

    在我看来,问题确实在于您如何导入数据。伪造这个数据文件:

    $:~/temp$ cat data.dat
    1.0  2.0
    2.0  4.2
    3.0  8.4
    4.0  16.1
    

    并使用pylab的loadtxt函数进行阅读:

    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    import scipy as sy
    import pylab as plb  
    
    data = plb.loadtxt('data.dat')  
    x = data[:,0]
    y= data[:,1]
    
    def func(x, a, b, c):
      return a*x**b + c
    
    p0 = sy.array([1,1,1])
    coeffs, matcov = curve_fit(func, x, y, p0)
    
    yaj = func(x, coeffs[0], coeffs[1], coeffs[2])
    print(coeffs)
    print(matcov)
    
    plt.plot(x,y,'x',x,yaj,'r-')
    plt.show()
    

    为我工作。顺便说一句,您可以使用dtypes 来命名列。

    【讨论】:

    • 好的,谢谢!只用 loadtxt 加载数据就可以了。看来我正试图以艰难的方式做到这一点,但我会继续调查出了什么问题。
    【解决方案2】:

    加载数据的根本问题是您将其转换为 float32,但在 scipy 0.10.1 中,curve_fit 适用于 float64 但不适用于 float32(这是一个错误,而不是一个功能)。您的示例适用于 float64。

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 2021-11-05
      • 1970-01-01
      • 2020-05-05
      • 2019-02-12
      • 1970-01-01
      • 2018-10-21
      • 2020-06-08
      • 2016-08-03
      相关资源
      最近更新 更多