2012-06-01 17 views
10

Soy nuevo en scipy y matplotlib, y he estado tratando de ajustar las funciones a los datos. El primer ejemplo en el Scipy Cookbook funciona fantásticamente, pero cuando lo intento con los puntos leídos de un archivo, los coeficientes iniciales que doy (p0 a continuación) nunca parecen cambiar realmente, y la matriz de covarianza siempre es INF.Uso de curve_fit para ajustar datos

He intentado ajustar datos uniformes siguiendo una línea, fue en vano. ¿Es un problema con la forma en que estoy importando los datos? Si es así, ¿hay una mejor manera de hacerlo?

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

Gracias!

Respuesta

11

Me parece que el problema está en la forma de importar sus datos. Falsificar este archivo de datos:

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

y el uso de la función de loadtxtpylab 's para la lectura:

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

funciona para mí. Por cierto, puede usar dtypes para nombrar las columnas.

+0

¡Sí, gracias! Cargando los datos con solo loadtxt lo hizo. Parece que estaba tratando de hacerlo de la manera difícil, pero seguiré investigando lo que estaba pasando mal. – Ironil

4

El problema subyacente con los datos de carga es que lo lanzas a float32, pero en 0.10.1 scipy, curve_fit funciona con float64 pero no float32 (es un error, no una función). Tu ejemplo funciona con float64.

+0

Guau, gracias. Voy a intentarlo (¡y tenerlo en cuenta!) – Ironil

Cuestiones relacionadas