最終更新: jade_python 2013年02月26日(火) 01:09:42履歴
プログラミングコードにおいて最小二乗の回路を組むことは非常に難しい。
というよりも、非常に骨の折れる作業になるので・・・できればやりたくない。
こんな時、やっぱりpythonって便利ですよね!
だって、「これほしいなぁ〜」という願望にぴったり合致するパッケージやモジュールがたくさんありますから!
特に、理系屋にとっては最高な理数系モジュールがたくさん用意されているんです。
というわけで、今回はscipyパッケージに含まれている非線形最小二乗関数を使ってみましょう!
scipyパッケージを用いて数値の最適化(近似)を施したい場合は、サブモジュールであるoptimize(最適化)を利用します。
なかでも、非線形の最小二乗フィッティングを実行してくれるoptimize.leastsq()関数は非常に便利で、僕も研究で重宝しています。
モジュールのインポートは次のように記述しましょう。
import scipy.optimize
もしくは
from scipy.optimize import leastsq
これでモジュールのインポートは完了です。
あとは、optimize.leastsq()関数の使用法に則ってコーディングをし、計算をしてもらいましょう。
まずは簡単に、二次関数で再現可能なデータ組を最小二乗フィットし、その関数形を求めてみましょう。
今回使用するデータ組はあらかじめリストとして作成しておきます(本来は実験データ等を使うのでこんな作業はいらないですが。。。)。
以下がoptimize.leastsq()のコーディング例です。
import scipy.optimize from numpy import * #データ組を作っておく Px=[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5] Py=[24.1, 15.0, 7.9, 3.1, -0.1, -1.2, 0.05, 3.01, 8.1, 15.2, 23.98] #データリストを配列(array)型に変換する Px=array(Px) Py=array(Py) #初期値を入力する parameter0=[0.9,-0.5] def fit_func(parameter,x,y): a=parameter[0] b=parameter[1] residual=y-(a*x*x+b) return residual result=scipy.optimize.leastsq(fit_func,parameter0,args=(Px,Py)) print result[0] print 'a=', result[0][0] print 'b=', result[0][1]
上記プログラムを実行すると
[1.004888345 -1.03610722]
a = 1.004888345
b = -1.03610722
とターミナルには表示されました。
コード右にデータ点とフィッティングラインのグラフを示します。
どうやら無事にデータ点の最小二乗フィットに成功したようですね。では、簡単に大事なポイントを整理しておきます。
2行目 | from numpy import * | 配列を利用するためnumerical pythonをインポートする |
5,6行目 | Px=array(Px) | optimize.leastsqの引数(データ組)は配列形式でなければならない |
7行目 | parameter0=[0.9,-0.5] | optimize.leastsqの引数に利用し、最小二乗関数の初期値(推定値)の役割をする |
14行目 | scipy.optimize.leastsq(fit_func,parameter0,args=(Px,Py)) | 引数は(定義した関数, 初期値, args=(データ配列Px, データ配列Py))の順で渡す |
scipy.optimize.leastsq()では、引数として与えた定義関数の返り値の二乗和が最小となるように計算が施される。
scipy.optimize.leastsq()の返り値の形式はコード、及びターミナル表示で確認していただきたい。
このように、非線形の最小自乗フィッティングなんて、pythonコードを使えば楽勝ですね!
python project
このページへのコメント
e939qZ Thank you ever so for you blog.Really thank you! Really Great.
l9AwFe <a href="http://igorlnjxohqm.com/">igorlnjxohqm</a>, [url=http://hwhtfspsbmbw.com/]hwhtfspsbmbw[/url], [link=http://pimbwkibkoqg.com/]pimbwkibkoqg[/link], http://umbbpficsqcd.com/
jYpiBz <a href="http://fyosiasjjwxw.com/">fyosiasjjwxw</a>, [url=http://ofpqlzhtffbl.com/]ofpqlzhtffbl[/url], [link=http://smbtkeczifsx.com/]smbtkeczifsx[/link], http://mtuxcuonwica.com/