2012-06-01 15 views
10

Ich bin neu zu scipy und matplotlib, und ich habe versucht, Funktionen zu Daten anzupassen. Das erste Beispiel in der Scipy Cookbook funktioniert fantastisch, aber wenn ich es mit Punkten aus einer Datei versuche, scheinen die anfänglichen Koeffizienten I (p0 unten) sich nie wirklich zu ändern, und die Kovarianzmatrix ist immer INF.Verwendung von curve_fit, um Daten anzupassen

Ich habe versucht, sogar Daten nach einer Zeile passen, vergeblich. Ist es ein Problem mit der Art, wie ich die Daten importiere? Wenn ja, gibt es einen besseren Weg dazu?

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

Vielen Dank!

Antwort

11

Es scheint mir, dass das Problem tatsächlich darin besteht, wie Sie Ihre Daten importieren. Faking diese Daten-Datei:

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

und mit dem pylab ‚s loadtxt Funktion zum Lesen:

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

Arbeiten für mich. Übrigens können Sie dtypes verwenden, um die Spalten zu benennen.

+0

Ja, danke! Das Laden der Daten mit nur loadxtxt hat es geschafft. Es scheint, dass ich versucht habe, es auf die harte Art zu tun, aber ich werde weiter untersuchen, was falsch lief. – Ironil

4

Das zugrunde liegende Problem mit Ihren Ladedaten ist, dass Sie es in float32 umwandeln, aber in scipy 0.10.1 arbeitet curve_fit mit float64, aber nicht float32 (es ist ein Fehler, kein Feature). Ihr Beispiel funktioniert mit float64.

+0

Wow, danke. Ich werde es versuchen (und es im Kopf behalten)! – Ironil