2012-06-01 14 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 

をし、読書のためpylabloadtxt機能を使用して:私のため

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

loadデータの根底にある問題は、float32にキャストすることですが、scipy 0.10.1の場合、curve_fitはfloat64では動作しますが、float32では機能しません(機能ではなくバグです)。あなたの例はfloat64で動作します。

+0

うわー、ありがとう。私はそれを試みるつもりです(それを念頭に置いてください)! – Ironil

関連する問題