10

私はscipyとmatplotlibが初めてで、関数をデータに適合させようとしています。Scipy Cookbookの最初の例は素晴らしく機能しますが、ファイルから読み取った点で試してみると、与えた初期係数 (以下の p0) は実際には変化しないようで、共分散行列は常に INF です。

行に続くデータにも適合させようとしましたが、役に立ちませんでした。データのインポート方法に問題がありますか? もしそうなら、それを行うより良い方法はありますか?

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

ありがとう!

4

2 に答える 2

11

問題は実際にデータをインポートする方法にあるようです。このデータファイルを偽造する:

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

pylab読み取りに'sloadtxt関数を使用します。

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を使用して列に名前を付けることができます。

于 2012-06-03T19:01:40.910 に答える
5

ロード データの根本的な問題は、それを float32 にキャストすることですが、scipy 0.10.1 では、curve_fit は float64 では機能しますが、float32 では機能しません (機能ではなくバグです)。あなたの例は float64 で動作します。

于 2012-08-08T17:57:57.150 に答える