プログラミング言語「python」を用いてシステム開発をしよう!

pythonで最小二乗法


プログラミングコードにおいて最小二乗の回路を組むことは非常に難しい。
というよりも、非常に骨の折れる作業になるので・・・できればやりたくない。
こんな時、やっぱりpythonって便利ですよね!
だって、「これほしいなぁ〜」という願望にぴったり合致するパッケージやモジュールがたくさんありますから!
特に、理系屋にとっては最高な理数系モジュールがたくさん用意されているんです。
というわけで、今回はscipyパッケージに含まれている非線形最小二乗関数を使ってみましょう!

最適化モジュール


scipyパッケージを用いて数値の最適化(近似)を施したい場合は、サブモジュールであるoptimize(最適化)を利用します。
なかでも、非線形の最小二乗フィッティングを実行してくれるoptimize.leastsq()関数は非常に便利で、僕も研究で重宝しています。

モジュールのインポートは次のように記述しましょう。
import scipy.optimize
もしくは
from scipy.optimize import leastsq

これでモジュールのインポートは完了です。
あとは、optimize.leastsq()関数の使用法に則ってコーディングをし、計算をしてもらいましょう。

例題1:二次関数の最小二乗

まずは簡単に、二次関数で再現可能なデータ組を最小二乗フィットし、その関数形を求めてみましょう。
今回使用するデータ組はあらかじめリストとして作成しておきます(本来は実験データ等を使うのでこんな作業はいらないですが。。。)。
以下が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.

0
Posted by check it out 2014年01月21日(火) 08:02:29 返信

l9AwFe <a href="http://igorlnjxohqm.com/">igorlnjxohqm</a>, [url=http://hwhtfspsbmbw.com/]hwhtfspsbmbw[/url], [link=http://pimbwkibkoqg.com/]pimbwkibkoqg[/link], http://umbbpficsqcd.com/

0
Posted by yhbmpwt 2013年11月20日(水) 20:01:12 返信

jYpiBz <a href="http://fyosiasjjwxw.com/">fyosiasjjwxw</a>, [url=http://ofpqlzhtffbl.com/]ofpqlzhtffbl[/url], [link=http://smbtkeczifsx.com/]smbtkeczifsx[/link], http://mtuxcuonwica.com/

0
Posted by einabbkjfz 2013年11月14日(木) 09:52:14 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます