Подтвердить что ты не робот

Использование 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()

Спасибо!

4b9b3361

Ответ 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 для обозначения столбцов.

Ответ 2

Основная проблема с вашими данными загрузки заключается в том, что вы добавили ее в float32, но в scipy 0.10.1 функция curve_fit работает с float64, но не с float32 (это ошибка, а не функция). Ваш пример работает с float64.