私は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()
ありがとう!
問題は確かにデータのインポート方法にあるように思われます。このデータファイルの偽造:
$:~/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 を使用して列に名前を付けることができます。
ロードデータの根本的な問題は、float32にキャストすることですが、scipy 0.10.1では、curve_fitはfloat64で機能しますが、float32では機能しません(これはバグであり、機能ではありません)。あなたの例はfloat64で動作します。