2016-11-20 11 views
0

私はカーブフィッティングをやろうとしています。私は私のYデータであると信じている測定された曲線を持っており、私はそれが私のXデータであると信じる数多くの他の曲線の加重和に適合させようとしています。Pythonのscipy curvefitでカーブフィッティングする

これを達成しようとする私の最近の試みは以下の通りですが、私はいくつかのエラーがあり、私が間違っていることを誰かが指摘できるかどうか尋ねることにしました。間違いなくどこでもエラーこの中に、うまくいけば、私が達成しようとしているものの私の説明が明確であるだろうと

import numpy as np 
import scipy.optimize 

ydata = np.array([1.0, 7.0, 4.0]) 
xdata = np.array([[0.0, 1.0],[3.5, 0.0],[1.0, 2.0]]) 

def fitfunc(xdata, *params): 
    ctx = 0.0 
    for n in np.nditer(c): 
     ctx = c[n]*xdata[:,n] + ctx 
    return ctx 

# initial guesses for fitting parameters, answer for this simple example is 2.0, 1.0 
c = np.array([0.6, 0.3]) 

# fit data using SciPy's Levenberg-Marquart method 
nlfit, nlpcov = scipy.optimize.curve_fit(fitfunc, xdata, ydata, p0=[c], sigma=None) 

print(nlfit) 

謝罪は

は、パラメータ上で事前に

+1

をあなたはカーブフィッティング問題を扱っているあなたは確かにいますか?基本的に線形代数問題である2つのベクトル 'xdata [:、0]'、 'xdata [:、1]'の線形結合として、ベクトル 'ydata'を近似しようとしているようです。 – Stelios

答えて

1
  1. fitfuncループをありがとうcですが、nは実際にはインデックスではなくcの値です。それは、例えば実行しようとしています。 ctx = c[0.6]*xdata[:,0.6] + ctx
  2. fitfuncは固定のグローバルcを使用し、それに渡されるパラメータはcurve_fitではありません。それはではなく、paramsを参照する必要があります。あなたの代わりに欲しい

def fitfunc(xdata, *params): 
    ctx = 0.0 
    for n in range(len(params)): 
     ctx = params[n]*xdata[:,n] + ctx 
    return ctx 

である私たちは、それが[ 0.3 2.1 1.2]を返しprint(fitfunc(xdata, *c))、と自分自身でそれを実行して動作することを確認することができます。

print(fitfunc(xdata, *c))*cは、cの要素をとり、単一の配列ではなく別々の引数として渡すことに注意してください。これはfitfunc(xdata, c[0], c[1])と同じです。

コメントにSteliosが述べたように、これは行列乗算xdata[:,0] * c[0] + xdata[:,1] * c[1]です。あなたはのように、おそらく高速ですnp.matmul、使用することができます。

def fitfunc(xdata, *params): 
    return np.matmul(xdata, params) 
+0

お返事ありがとうございます。私の問題のこの部分が線形であるかどうか疑問に思った。以前はExcelでソルバーを使用していましたが、誰かがPythonを学ぶべきだと確信していましたが、確かに非常に強力です。私の例はシンプルであり、実際のデータのノイズや実験的な変位のために列を上下に動かすなど、私が作ってみたいことがいくつかあります。しかし、私は一歩一歩進んで、まずこの部分を働かせることができるかどうかを見ます。もう一度ありがとう、steve。 – steve

+0

この特定のアプローチは、あなたがフィッティングしている関数が線形です - y = b1 * x1 + b2 * x2なので、常に線形になります。 [curve_fitのドキュメント](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)には、非線形関数の例があります.y = a * e ^( b * x)+ c。あなたのデータの散布図を見て、明らかな非線形性があるかどうかを確認することをお勧めします。 – David

+0

もう一度ありがとう、コードは今私がそれをしたい正確に行います。私は行列乗算を使ってより簡単なfitfuncを選択しました。提案されたことのいくつかは、線形代数を使った解法を見なければならないことを示しています。カーブフィットのアプローチではなく、そのアプローチでこのタイプの問題をどのように解決できるかについて私は読んでいます。また、私のxdataの列が、そのフィーチャーがフィットを改善する場合に、互いに相対的に上下に「スライド」することを可能にする可能性のある方法を検討します。 – steve

関連する問題