2012-06-01 24 views
10

मैं scipy और matplotlib के लिए नया हूं, और मैं डेटा पर फ़ंक्शंस फिट करने की कोशिश कर रहा हूं। Scipy Cookbook में पहला उदाहरण शानदार रूप से काम करता है, लेकिन जब मैं इसे फ़ाइल से पढ़ने वाले बिंदुओं के साथ कोशिश कर रहा हूं, तो प्रारंभिक गुणांक जो मैं देता हूं (नीचे पी 0) वास्तव में कभी भी परिवर्तित नहीं होता है, और कॉन्वर्सिस मैट्रिक्स हमेशा 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

ऐसा लगता है कि समस्या वास्तव में है कि आप अपना डेटा कैसे आयात करते हैं। इस datafile Faking:

$:~/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 का उपयोग कर सकते हैं।

+0

हाँ, धन्यवाद! लोड लोड के साथ डेटा लोड हो रहा है। ऐसा लगता है कि मैं इसे कठिन तरीके से करने की कोशिश कर रहा था, लेकिन मैं जांच कर रहा हूं कि क्या गलत हो रहा था। – Ironil

4

आपके लोड डेटा के साथ अंतर्निहित समस्या यह है कि आप इसे फ्लोट 32 पर डालते हैं, लेकिन 0.10.1 में, curve_fit फ्लोट 64 के साथ काम करता है लेकिन फ्लोट 32 नहीं (यह एक बग है, सुविधा नहीं है)। आपका उदाहरण float64 के साथ काम करता है।

+0

वाह, धन्यवाद। मैं इसे आजमा रहा हूं (और इसे ध्यान में रखो)! – Ironil