我是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()
谢谢!
答案 0 :(得分:11)
在我看来,问题确实在于如何导入数据。伪造这个数据文件:
$:~/temp$ cat data.dat
1.0 2.0
2.0 4.2
3.0 8.4
4.0 16.1
并使用pylab
的{{1}}函数进行阅读:
loadtxt
适合我。顺便说一下,您可以使用dtypes来命名列。
答案 1 :(得分:4)
你的加载数据的根本问题是你把它转换为float32,但是在scipy 0.10.1中,curve_fit适用于float64但不适用于float32(这是一个bug,而不是一个特性)。您的示例适用于float64。