Использование Curve_fit для подгонки данных
Я новичок в 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()
Спасибо!
2 ответа
Мне кажется, что проблема действительно в том, как вы импортируете свои данные. Подделка этого файла данных:
$:~/temp$ cat data.dat
1.0 2.0
2.0 4.2
3.0 8.4
4.0 16.1
и используя pylab
"s 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 для имен столбцов.
Основная проблема с вашими данными загрузки заключается в том, что вы приводите их к float32, но в scipy 0.10.1, curve_fit работает с float64, но не с float32 (это ошибка, а не функция). Ваш пример работает с float64.