2012-06-01 2 views
10

Я новичок в scipy и matplotlib, и я пытаюсь подгонять функции к данным. Первый пример в Scipy Cookbook работает фантастически, но когда я пытаюсь использовать его с точками, считываемыми из файла, исходные коэффициенты, которые я даю (p0 ниже), никогда не изменяются, и ковариационная матрица всегда является INF.Использование curve_fit для подбора данных

Я попытался поместить даже данные по строке, но безрезультатно. Это проблема с тем, как я импортирую данные? Если это так, есть ли лучший способ сделать это?

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() 

Спасибо!

ответ

11

Мне кажется, что проблема заключается в том, как вы импортируете свои данные. Подделка этот файл данных:

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

и используя loadtxt функцию, pylab «s для чтения:

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, чтобы назвать столбцы.

+0

Да, спасибо! Загрузили данные только с помощью loadtxt. Кажется, я пытался сделать это с трудом, но я продолжу расследование, что происходит не так. – Ironil

4

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

+0

Ничего себе, спасибо. Я собираюсь попробовать (и помнить об этом)! – Ironil

Смежные вопросы