カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf ·...

24
カーブフィッティング (回帰分析) の練習 線形最小二乗フィッティング: R, python, excel 非線形最小二乗フィッティング: mathematica 目次 1 最小二乗法 2 2 線形フィッティング (線形回帰) 3 2.1 線形フィティングの要件 ...................................... 3 2.2 線形最小二乗法の理論の概要 ................................... 4 2.3 定数項 ............................................... 5 3 直線偏光測定のモデル 5 3.1 線形モデルへの変換 ........................................ 6 3.2 特別な場合(離散フーリエ変換) ................................. 6 4 線形フィッティング 統計解析言語 R 7 4.1 R の作業ディレクトリ ....................................... 7 4.2 R の使い方 ............................................. 7 4.3 データ入力 ............................................. 9 4.4 フィッティング .......................................... 10 4.5 グラフの作成 ............................................ 11 4.6 ひとまとめにする ......................................... 11 5 線形フィッティング スクリプト言語 python 12 5.1 基本的操作法 ............................................ 12 5.2 スクリプト作成 .......................................... 13 5.3 ライブラリーの使用 ........................................ 14 5.4 計画行列作成 ............................................ 14 5.5 データ入力と読み込み ....................................... 15 5.6 フィッティング .......................................... 16 5.7 グラフの完成 ............................................ 17 1

Upload: others

Post on 07-Sep-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

カーブフィッティング (回帰分析)の練習

線形最小二乗フィッティング: R, python, excel

非線形最小二乗フィッティング: mathematica

目次

1 最小二乗法 2

2 線形フィッティング (線形回帰) 32.1 線形フィティングの要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 線形最小二乗法の理論の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.3 定数項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 直線偏光測定のモデル 53.1 線形モデルへの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 特別な場合(離散フーリエ変換) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

4 線形フィッティング – 統計解析言語 R 編 74.1 Rの作業ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.2 Rの使い方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.3 データ入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.4 フィッティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104.5 グラフの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114.6 ひとまとめにする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

5 線形フィッティング – スクリプト言語 python 編 125.1 基本的操作法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125.2 スクリプト作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135.3 ライブラリーの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.4 計画行列作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.5 データ入力と読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155.6 フィッティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165.7 グラフの完成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1

Page 2: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

5.8 解析をおこなう関数の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

6 線形フィッティング – Excel編 19

7 非線形フィッティング – mathematica編 207.1 データ入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207.2 モデルの入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217.3 フィッティングの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

付録 A Mathematicaの基礎 23A.1 起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23A.2 式の入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23A.3 単純な定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23A.4 関数定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23A.5 リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

測定可能な 2 つの量の間の関係が理論式であらわされていて,その式が未知のパラメータを含んでいる場合,いろいろな条件で得た複数の測定データから未知パラメータの値を求めることができる. これをカーブ

フィッティング (curve fitting), あるいは回帰分析 (regression analysis)という.理論式はモデル式ともいう.多くの場合,測定誤差のため,モデル式を測定データに完全に一致させることはできないので,できるだけ

多くの測定データを使ってパラメータの値を推定する. これはデータとモデルの「不一致の程度」が最小に

なるようなパラメータの値を求めるということである.「不一致の程度」としては,残差 (測定データとモデルの差)の二乗和が使われる*1.測定誤差がランダムに生じるものであるならば,残差の二乗和を最小にするよ

うなパラメータ値が最も確からしいパラメータ値であるということが言えるからである (ガウス・マルコフの定理).この考え方を最小二乗法という.

1 最小二乗法

モデル式が従属変数 yを独立変数 xの関数としてあらわすようなものであるとする.未知パラメータ aを含

めると,次のように,yは xと aの 2変数関数として書ける.

y = f (x, a) (1)

n組の測定値を (x1, y1), (x2, y2), ..., (xn, yn) とあらわす.i番目の測定値の残差を ei であらわすと,

y1 = f (x1, a) + e1y2 = f (x2, a) + e2...

yn = f (xn, a) + en

(2)

残差の二乗和を J は,

J = e12 + e22 + ...+ en2 (3)

*1 空間の 2点間の距離を座標の差の二乗和から求めるのと同じである.

2

Page 3: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

e1, ..., en をひとまとめにして n 次元列ベクトル eにする.J はこのベクトルの大きさの 2乗であり,eと eの内積でもある.

e =

e1e2...

en

, J = ‖e‖2 = e · e (4)

パラメータ aを変えれば, f (xi, a)の値が変わり,J も変化する.ただし,J = 0であるから J の値には下限

がある.未知パラメータの推定とは,aの関数である J の最小点を求めることである.

パラメータが複数あっても同じである.m個のパラメータ a1, a2, ..., am があるなら,これらをまとめて一つ

の m次元列ベクトル aとみなし,

a =

a1a2...

am

(5)

f (x, a) は f (x, a) に変えればよい.f (x, a)がどういう式であらわされるかに関係ない方法は非線形フィッティング (nonlinear fitting)という.

f (x, a)が a1, a2, ...の 1次式であらわされる場合に特化した方法は線形フィッティング,あるいは線形回帰という.特に, f (x, a)が xについても 1次式になっている場合は, f (x, a) = a1x + a2 という形になってしまう

が,この場合は直線回帰 (linear regression)という.直線回帰は計算量が少ないので手計算でもなんとかなるし,統計機能を備えた電卓や表計算ソフトのグラフ

作成機能を使えば手軽におこなえる.一般の線形フィッティングでは,連立方程式を解かなければならないの

で,その機能を備えたコンピュータープログラムを使用することが多い.非線形フィッティングには,複雑な

アルゴリズムによって大量の計算をおこなうコンピュータープログラムを使う.

後で見るように,線形フィッティングは連立1次方程式を解くことに帰着するので,答えが得られるどうか

は単純な条件で決まる.非線形フィッティングは試行錯誤によって J の最小点を探し出すので,正しい答えが

得られたかどうかを判断することが難しい場合がある.また,問題によって最適なアルゴリズムが異なるかも

しれないし,使用するアルゴリズムによって答えが異なる.そのため,未知パラメータになんらかの置き換え

をおこなうことで,線形な式にすることができるかどうかを検討するのが得策である.

2 線形フィッティング (線形回帰)

2.1 線形フィティングの要件

m個の未知パラメータに対して線形のモデル式は,

f (x) = a1g1(x) + a2g2(x) + ...+ amgm(x) (6)

3

Page 4: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

のように書ける.これは m個の関数 g1(x), g2(x), ..., gm(x) を係数とする m個の未知パラメータ a1, a2, ..., am

の線型結合である. f (x1) = a1g1(x1) + a2g2(x1) + ...+ amgm(x1)などを式 (2)に代入すると,

y1 = a1g1(x1) + a2g2(x1) + ...+ amgm(x1) + e1y2 = a1g1(x2) + a2g2(x2) + ...+ amgm(x2) + e2...

yn = a1g1(xn) + a2g2(xn) + ...+ amgm(xn) + en

(7)

g1(x1) などはモデル式の m個の関数にそれぞれ n個の測定点の値を代入して得られる m × n個の値である.

式 (7)は a1, a2, ... を未知数とする線形連立方程式とほぼ同じであるから,ベクトルと行列を使って簡潔に表

現しよう.y1, ..., yn と e1, ..., en を n次元列ベクトル,a1, ..., am を m次元列ベクトル,g1(x1), ..., gm(xn)を n行

m列の行列にする.

y =

y1...

yn

, e =

e1...

en

, a =

a1

...am

, G =

g1(x1) · · · gm(x1)...

. . ....

g1(xn) · · · gm(xn)

(8)

すると,式 (7)は次のようにまとめられる.

y = Ga + e (9)

Gは計画行列 (design matrix)と呼ばれる.その i行 j列の成分は Gi j = g j(xi)である.

残差の二乗和 (J = e · e)を最小にするという意味でこの方程式 (9)を「解く」ことができる.これが線形最小二乗法 (linear least-squares method)で,その解を最小二乗解という.ただし,未知パラメータを決めるには,未知パラメータの数 mよりも測定値の数 nが多いことが必要である.よって,Gは縦長の行列である.

2.2 線形最小二乗法の理論の概要

a の微小変化 da に対する J の変化 dJ を計算しよう.式 (9) から e = y − Ga であるから,e の変化はde = −Gdaとなる.また,J = e · eであるから,dJ = 2de · e.よって,

dJ = −2(Gda) · (y − G a) = −2da ·(G∗(y − Ga)

)となる.ただし,∗ で随伴行列をあらわす.J の極小点では aのどの向きへの微小変化に対しても J の変化は

0 であるから,G∗(y − Ga)はゼロでなければならない*2.よって,

G∗Ga = G∗y (10)

G∗Gは n × nの半正定値対称行列である*3.(10) が一意的に解けるには,G∗Gは正則でなければならないので,Gはフルランク (階数が mに等しい,単射)でなければならない.これは Gの各列が独立ということであるが,式 (8)を見ればわかるように,それには,少なくともモデル中の関数 g1(x), ..., gm(x)が独立でなけれ

ばならない.これはモデル式が冗長ではないということである. また,少なくとも m個の独立な測定点が必

要である.だから,同じ測定値をコピーして増やすのはだめ.

*2 G∗(y − Ga) = 0の左辺は m次元ベクトルで,その各成分,Gの i列目を gi として,gi · (y − Ga)となる.右辺は 0ベクトルだか

ら,この内積はすべて 0である.これは,Gの全縦ベクトルと y − Gaが垂直であることを意味する.よって,線形変換 Gの像である m次元超平面に点 yから下ろした垂線の足が Gaである.

*3 内積の性質から a · (G∗G)a = (Ga) · (Ga) = 0である (半正定値).また,(G∗G)∗ = G∗(G∗)∗ = G∗Gである (対称).

4

Page 5: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

パラメータ数 mが小さい場合は,式 (10)を直接解いて aを求めることができる.直線回帰はそういう場合にあたる. mが大きい場合にも使われるコンピュータープログラムでは,計画行列を巧妙に処理して解くよ

うになっている*4.

2.3 定数項

パラメータの 1つが定数項になっている場合は,モデル式は

h(x, a, b) = f (x, a) + b

のように書ける.ここで,定数項はパラメータ bであり,他のパラメータは a,f (x, a)は aをパラメータとする xの関数である.J =

∑ni=1

(yi − f (xi, a) − b

)2を最小にする bは容易に求められ,

b =1

n

n∑i=1

(yi − f (xi, a))

となる.そこで,平均値 (y1 + ... + yn)/n を y とし,平均値(

f (x1, a) + ... + f (xn, a))/n を f (x, a) とし,

Yi = yi − y, F(xi, a) = h(xi, a) − f (x, a)と置くと,yi = f (x, a, b) + ei は

Yi = F(xi, a) + ei

となって,未知パラメータが 1つ減る.線形モデルでは, f (x, a)は

f (x, a) = a1g1(x) + · · ·+ amgm(x)

のように計算することができる.よって,まず aを求め,その結果を使って bの値を計算すればよい.

3 直線偏光測定のモデル

偏光フィルターは,入射光の偏光の向きに対して回転させることによって光の透過率が変化するものであ

る.理想的な偏光フィルターでは,回転角度 xに対する透過率 tの関係は次の式であらわされる.

t = P cos2(x − b) + P′ (11)

b は偏光フィルターへの入射光の「最大偏光方向」の角度である.係数 P と P′ は入射光の偏光状態で決ま

る*5.実際には偏光フィルターには偏光によらない反射や吸収があるし,直接測定するのは偏光フィルターを

通過した光の強さを光センサーで何らかの量に変換したものであるが,これらの過程が線形性を有し,入射光

強度が一定である場合は,測定値 yはy = a cos2(x − b) + c (12)

となる.パラメータの aと cは入射光強度やセンサーの感度に依存するし,cはセンサーのゼロ点のずれを含

むかもしれない.しかし,b にはそのような依存性は無いと考えられる.

*4 QR分解や特異値分解が利用される.QR分解はグラム・シュミットの直交化のアイデアを行列の分解に適用するもので,直交行列 Qと上三角行列 Rによって G = QRと分解され,a = R−1Q∗yとなる.特異値分解では,行列 G は2つの直交行列 U, V と対角行列 S によって G = USV∗ と分解される.ただし Sは G∗Gのすべての固有値の平方根からなる対角行列である.S のゼロでない成分をすべて逆数に変えたものを S+ とし,G+ = VS+U∗ とする.G+ は Gの「擬似逆行列」という.Gが縦長でフルランクの場合,式 (10)の解は a = G+y.

*5 形式的に,強さ S の光を,強さ S 1 の直線偏光成分と,それに独立な強さ S 2 の成分とに分けて考えることができ,式 (11)の係数Pと P′ は,P = S 1/S,P′ = S 2/(2S ) = (1 − P)/2 とあらわせる.

5

Page 6: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

3.1 線形モデルへの変換

式 (12)は aと cについて線形であるが,bは非線形な関数 cosの中に入っているので,bについては非線形

である. そこで,パラメータの変換によって線形の式にすることができるかどうかを検討する.倍角公式と

加法定理を使って式 (12)を変形すると,

y =a cos 2b

2cos 2x +

a sin 2b2

sin 2x +a2+ c

よって,次のように,パラメータを A, B, C に置き換えれば線形になる.

y = A cos 2x + B sin 2x + C, (13)

A =a2cos 2b, B =

a2sin 2b, C =

a2+ c (14)

a = 2√

A2 + B2, b =1

2arctan(A, B), c = C −

a2

(15)

ここで,arctan(A, B)は平面のベクトル (A, B)の方位角である. プログラミング言語や数値計算パッケージ

の多くはこの関数が計算できる*6.普通の arctanを使う場合は,A > 0なら arctan(B/A), それ以外で B < 0

なら −(π/2) − arctan(A/B), それ以外なら (π/2) − arctan(A/B) とする.

3.2 特別な場合(離散フーリエ変換)

式 (13)は yを周期 πの 2つの成分と定数成分に分解した形になっているから,A, B, C は「周波数成分」で

ある.特に,独立変数 xの値が正確に全周期にわたって等間隔に取られた場合には,次の離散フーリエ変換に

よってこれらを求めることができる.

A =2

N

m∑i=1

yi cos(2xi), B =2

N

m∑i=1

yi sin(2xi), C =1

N

m∑i=1

yi (16)

xi, yi はデータ点,mはデータ点数である.xi は 2Nπ(i + h)/m の形 (N は偏光フィルターの回転数,hは任意

の定数)に書けなければならない.偏光フィルターの回転数は 1/2の整数倍ならよい.離散フーリエ変換が直

交変換であることから,この計算が最小二乗法になっていることが言える*7.また,線形最小二乗法の式 (10)にモデルを代入して計算すれば,上式が直接得られる.

一般の線形フィッティングはコンピュータープログラムで簡単にできるので,わざわざ xの取り方に制約を

付けて離散フーリエ変換で計算するメリットはあまり無い.

*6 C言語など多くの言語にある atan2 という関数は atan2(B,A) のように使用する. Y座標が先,X座標が後である.Excel や計算サイト http://keisan.casio.jp の atan2 や,Mathematica の ArcTan は X座標が先.

*7 「パーセバルの等式」が成り立つ.

6

Page 7: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

4 線形フィッティング – 統計解析言語 R 編R言語は統計解析に特化したシステムなので,データ・フィッティングは比較的楽にできる.

4.1 Rの作業ディレクトリ

Windowsではスタートメニューやタイルで Rを起動する.Linuxではメニューやデスクトップ・アイコンで起動するか,端末エミュレーターの中で Rと打って起動する.Rを終了するには,Rの中で quit()と打

つ.このとき,作業内容を保存するかどうかを答える必要がある.

ファイルの読み書きのために「作業ディレクトリ」が重要である.端末エミュレーターで Rを起動する場合は Rを起動したときの端末の現在のディレクトリが Rの作業ディレクトリになる.これは Rを起動する前にpwd コマンドで見ることができる.また,cd コマンドによって変更することもできる.しかし,Rを GUIで起動すると,作業ディレクトリがわからないかもしれない.Rでは次のコマンドで作業ディレクトリを確認することができる.

1 getwd()

これは ”getwd” という名前の関数を引数無しで呼び出す式であり,この式の評価結果が表示される.getwdの wd は”working directory”から来ている.また,dir() で作業ディレクトリにあるファイルとサブディレ

クトリのリストが得られる.サブディレクトリのみのリストは list.dirs(recursive=0) で得られる.作業

ディレクトリを変更する必要がある場合は setdir関数を使う.たとえば,現在の作業ディレクトリの中にあ

る xxxx という名前のサブディレクトリに移るには,setwd("xxxx") とすればよいし,現在のディレクトリ

の親ディレクトリに移るには,setwd("..") とすればよい.これらは現在の作業ディレクトリからの相対パ

スである.ユーザーのホームディレクトリに移るには,setwd("~") とする.Windows では,以上のような操作を GUIでもおこなうことができる.

4.2 Rの使い方

R では簡単な数値計算がすぐにできる*8.四則演算の演算子は +, -, *, / である.べき乗は ^ でも ** でも

よい.式をくくる括弧にはすべて ( ) を使う.関数呼び出しはすべての引数を括弧で囲んで関数名の後ろに

付ける.

1 (1+2)/2

2 sin(0.1)

3 tan(0.1)

複数の数値からなるデータは c という関数を使って作る.たとえば,

1 v <- c(1,3,5,4)

*8 これ以降は,4.3の「データ入力」と 4.6の「ひとまとめにする」のセクション以外は読むのを省略することもできるが,推奨はしない.

7

Page 8: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

2 v

3 v+10

4 v*10

のようにすると,4つの数値からなるデータを作って vという名前を付け,vの各要素に数値を足したりかけ

たりした結果を表示する.このようなデータは「ベクトル」と呼んでいる.たくさんの要素からなるベクトル

を簡単に作る方法もいろいろ用意されている.重要なのは等差数列である.コロン”:”を使って,たとえば

1 0:40

と書くと,0から 40までの公差 1の等差数列 (0, 1, ..., 40)ができる.次のように,このベクトルに 0.5をかけると,(0, 0.5, ..., 20)になり,さらに 10を引くと,(−10,−9.5, ..., 10)になる.

1 x <- 0:40*0.5-10

2 x

同じことは,seqという関数を使ってもできる.

1 x <- seq(-10,10,0.5)

2 x

seq はたぶん sequence から来ている*9.

数値データをプロットする関数は plotである.y = x2 のグラフを描いてみる.

1 x <- seq(-10,10)

2 y <- x^2

3 plot(x,y)

21 点しか計算していないので,表示もそれだけである.「任意の数値に対してその2乗を計算する」といった計算方法自体は「関数」である.関数を定義してそれ

に名前を付け,後でその関数を使って計算をおこなうことができる.

1 f <- function(x){x^2}

2 f(2)

3 f(10)

4 f(2)+f(10)

5 f(0:10)

関数定義のところは,

*9 関数の説明を見るには,?seq のようにすればよい.Unixでは,カーソルキーで表示をスクロールし Qで元に戻る.

8

Page 9: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

1 function(仮引数){仮引数を含んだ式}

という形式である.中括弧の中には関数の定義が入る.簡単な計算では結果をあらわす式だけでよいが,もっ

と複雑な処理の記述もできる.

関数定義を使うと,plot 関数によって曲線も描くことができるが,左端と右端を指定する必要がある.

1 plot(f, -10, 10)

これにデータ点を重ねるには,points 関数を使う.

1 x <- seq(-10,10,2)

2 points(x, f(x))

4.3 データ入力

測定データは任意のテキストエディタを使って入力して適当なファイル名で保存する.保存する場所は Rの作業ディレクトリにする.次のは練習用データである.# はコメント行を示している.

1 # レーザーの偏光  4月 1日

2 # 回転角 (度) : 透過光強度 (ボルト)

3 0 0.809

4 30 0.403

5 60 0.039

6 90 0.077

7 120 0.477

8 150 0.836

9 180 0.794

10 210 0.400

11 240 0.040

12 270 0.081

13 300 0.481

14 330 0.843

15 360 0.782

このファイルを Rで読み込む.ファイル名を xxyy.dat とすれば,

1 data = read.table("xxyy.dat")

読み込んだデータに dataという名前を付けたが,日本語のほうがよければ,生データ=read.table("xxyy.dat")

のようにしてもよい.測定データのプロットは次のようにすればすぐにできる.

9

Page 10: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

1 plot(data)

データ・プロットをよく見れば,誤った測定点が見つかる可能性がある.

1 data

で data を表示すると,1 列目に回転角,2列目に透過光強度が入っていることがわかる.data から各列のデータを取り出すには,次のように2重の大括弧を使う.

1 x = data[[1]]

2 y = data[[2]]

回転角が独立変数なので,それに x という名前を付け, 透過光強度には y という名前を付けた.

4.4 フィッティング

あらためて,データプロットを作っておく.今度は横軸とグラフ全体に名前を付けよう.

1 plot(x,y,xlab="角度 (度)",main="テストデータ")

角度の単位を度にしたので,モデル式 (13)は,

A cos((π/90)x

)+ B sin

((π/90)x

)+ C

という形になる.線形フィッティングには lm 関数を使う.

1 r <- lm( y ~ cos(x*pi/90)+sin(x*pi/90) )

lm に指定するのは,従属変数 y と~ とモデル式から未知パラメータを取ってしまったものである.名前 rを

使って計算結果を見ることができる.

lm 関数が計算したさまざまな結果全体を見るには,summary(r) とすればよいが,未知パラメータの値だ

け取り出すには次のようにする.

1 p = r$coefficients

2 p

p の各要素に対応しているモデル式の項が表示され,定数項 C がはじめに来て,次に cos の係数 A,sinの係数 Bの順になっていることがわかるので,

1 C <- p[[1]]

2 A <- p[[2]]

3 B <- p[[3]]

式 (15)を使って a, b, cの計算もやっておく.Rでは atan2 関数が使える.

10

Page 11: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

1 a <- 2*sqrt(A^2+B^2)

2 batan2(B,A)*(180/pi)

3 c <- C-a/2

4 a;b;c

4.5 グラフの作成

理論曲線を描くために,フィッティングの結果を入れて関数を定義する.(12)式に戻ろう.

1 f <- function(x) a*cos((x-b)*pi/180)^2+c

角度は度からラジアンに直した.準備ができたので,データ点と理論曲線を描く.

1 plot(f,0,360,xlab="角度 (度)",main="テストデータのフィッティング")

2 points(x,y)

3 grid()

始めの plot では少し飾りを付けた.また,grid() で目盛線を入れている.

グラフは PNG か JPEG ファイルに保存するのが簡単である.保存してから印刷したりレポートに入れたりすればよい.

1 savePlot("xxxxyyyy.png","png")

4.6 ひとまとめにする

データの読み込みからグラフの保存までを1つの関数に入れ,analyze という名前をつけよう.この関数には,データファイルの名前を引数として与えることにする.下の関数定義を PDF から R へコピー&ペーストしても動くかもしれない*10.

1 analyze <- function(datafile) {

2 data <- read.table(datafile) # データ読み込み

3 x <- data[[1]]; y <- data[[2]] # x 列, y 列

4 r = lm(y ~ cos(x*pi/90)+sin(x*pi/90)) # フィッティング

5 p <- r$coefficients # $で未知係数の値を得る

6 C <- p[[1]]; A <- p[[2]]; B <- p[[3]]

7 a <- 2*sqrt(A^2+B^2)

8 b <- 0.5*atan2(B,A)*(180/pi)

9 c <- C-a/2

*10 これが入っているファイルを入手することができた場合は,R で一度だけ source(”ファイル名”) のようにすればよい.

11

Page 12: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

10 print(c(a=a,b=b,c=c)) # 結果をまとめて表示

11 # グラフを描く

12 h <- max(y)*1.1-min(y)*0.1 # 上に 10% 余裕

13 l <- min(y)*1.1-max(y)*0.1 # 下に 10% 余裕

14 plot(function(x) a*cos((x-b)*pi/180)^2+c, 0, 360,

15 xlab=" 角度 (度)", ylab=" 強度 (V)", ylim=c(l,h),

16 main=paste(datafile, ", b=", b) )

17 points(x, y)

18 grid()

19 savePlot(paste(datafile,"png", sep="."), type="png")

20 }

これで,次のようにするだけで,パラメータ値を計算して表示し,グラフを画像ファイルに保存してくれる.

1 analyze("xxyy.dat")

R を終了するときに,”Save workspace image? [y/n/c]: ” と訊かれたら,y で答える.すると,次に同じディレクトリで Rを起動すると,前におこなった定義がそのまま使える.この情報は ”.RData” という隠しファイルに保存されている.何もかも終わったら,このファイルを消去する.

5 線形フィッティング – スクリプト言語 python 編データ解析をプログラミング言語でおこなうにはいろいろな選択肢がある.豊富な科学計算機能と素早いテ

ストができることと正確な情報が得やすいことから Python を使うことにしよう.Python のデータ処理ライブラリの 1つである pandas*11 と pylab*12を使って線形フィッティングをやってみる。Pythonの文法の理解はいらない*13。Python を実行する環境はいろいろあるが,spyder というユーザー・インタフェース を使うことにする*14 *15。

5.1 基本的操作法

spyder を起動するには,たとえば端末に次のようにタイプする.

1 spyder

あるいは,メニューから spyder を起動できるかもしれない.

*11 http://pandas.pydata.org/*12 http://docs.scipy.org/doc/*13 http://www.python.jp/doc/release/*14 spyder を準備するには,Linux ではパッケージシステムを使って spyder を導入する.Windows と Mac では,Anaconda を

web で探して導入する. 簡単.*15 spyder を使わず,15ページのデータファイルの形式を見,スクリプトファイル henkou.py をダウンロードし,19ページの脚注の最後の3行を見れば,解析だけはできる.

12

Page 13: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

spyder のウィンドウは大きく3つの枠に分かれているが,そのうち IPython consoleに式やコマンドを打ち込めば,その場で計算の実行ができる.1+2 とか 2*3 とか 12/-4 などとやってみれば,ただの電卓としての使い方がわかるが,注意すべき点が少しある.

• 1, 2, 3 は 1.0, 2.0, 3.0 とは異なる. 前者は「整数型」後者は「実数型」である. Python 2 では,整数型どうしの割り算は小数部が切り捨てられてしまう.実数の結果が必要な場合は,整数でも 2.0 とか2. のように小数点を付けて書く.

• べき乗には ^ ではなく ** を使う. ^ は違う意味に使われる. 2 × 109 のようなものは 2*10**9のよ

うに書くよりも, 2e9 のように書く方がよい.

• 行の左の空白(インデント)の量は文法上意味があり,if 文のような複合文のブロックの始まりで空白を増やし終わりで元に戻す.

• log(2.718) のように,関数呼び出しはいつも小括弧を付けて書く.

Variable explorer では変数の値を見ることができる.IPython console に a=b=0.1 と打って,

Variable explorer を見ると,a と b の値が表示されているのがわかる.また,del a, b と打てば,aと b が消去される.上向き矢印キー 〈↑〉で前のコマンドを再現し,修正してから 〈enter〉キーで再実行することができる. これは「ヒストリー機能」である.

5.2 スクリプト作成

Editorウィンドウにはプログラムなどを書いて保存することができる.まず,File メニューの New file...で新しい Editorウィンドウを開く.すでに開いている Editorウィンドウは閉じてしまってよい.Spyder では,Editorウィンドウに書いたプログラムのどの部分でも任意に実行してテストすることができる.たとえば,〈F9〉を押すと,あらかじめ選択した部分が IPython consoleで実行される.もう1つの方法は,〈Ctrl〉〈Enter〉,または Run current cellである.こちらはマークによって区切られた範囲を実行するものである.便利なので練習しておこう.Editorウィンドウ中に次のように書く ( 初めから書いてあるものは置いておく. 左端から書く. 文字列は半角のシングルクォート’かダブルクォート”で囲む).

1 #%%

2 a='たら'

3 print a

4 #%%

5 a=a+a

6 print a

#%%の行は,Editorウィンドウを「セル」という部分に区切るための記号である.今書いたものは 2つのセルに分かれている.境界は横線でわかる.上側のセルの中のどこかにカーソルを置いておき,Run メニューでRun current cell を実行する.するとそのセルの中身が IPython consoleで実行される.Run current cellは 〈Ctrl〉〈Enter〉を押してもできるし,ツールバーにもこれをおこなうボタンがある.

13

Page 14: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

上側のセルと下側のセルをいろいろな順番で実行してみてほしい.試し終わったら,この意味のないプログラ

ムは区切り記号と一緒に消してしまう.

5.3 ライブラリーの使用

Python は汎用プログラミング言語なので,原子的なもの以外の機能はプログラムモジュール (ライブラリー)として提供され,必要なモジュールを指定して使用する.数値計算や図表示のさまざまな機能を使用するには,pylab モジュールが適している.また,pandas モジュールを併用するともう少し便利になる.これらのモジュールを使用するため,Editorウィンドウに次のコードを書き,Run current cell で実行し,エラーにならないことを確認しておく*16.

1 from pylab import *

2 from pandas import *

3 #%%

ここでファイル名を付けて保存しておく.ファイル名は henkou.py のように適当でよいが,拡張子として.py を付けておく.何か書き足したときには,忘れないで保存をおこなう.なお,コマンド,関数,ファイル名などは,入力の途中で 〈tab〉キーを押せば残りが自動的に入る.また,関数名を入力した直後に 〈control〉キーと I を押すと説明が  Object inspector に表示される.関数呼び出しを括弧まで書くだけで自動的に説明があらわれるようになっている場合もある.このような入力補助機能を

利用して,記憶力を節約するのがよい.

5.4 計画行列作成

線形モデルの式 (13)を使って式 (8)の計画行列 Gを構成するには,独立変数 xの値リスト x1, x2, ..., xn が

必要である.python では,単純なリストはたとえば [1, 2, 3] のように表現する*17.しかし,このリスト

構造は一般的すぎて扱いが面倒なので,実数のベクトルや行列を効率よく扱うことができるリッチな機能を備

えた array や DataField というタイプのデータ構造を使う*18.array([1,2,3])などとすれば変換することができる.そこで,[1,2,3]*2の結果と array([1,2,3])*2の結果の違いを見てほしい.用途の違いがわかる.

xのリストを与えれば計画行列を作ってくれる関数を定義しておこう*19.Editorウィンドウに次のコードを入力する (先ほどの区切り記号の下に続けて).def ... の行は左端から書く.2行目以降には自動的に空白が入る.これらの空白を変更してはいけない.4行目で改行した後 5行目にできる空白は消しておく.括弧の種類に注意.関数名 make_g は make とアンダースコアと g である.

*16 import * はそれぞれのモジュールで定義されたすべてのものを読み込んでしまい,同じ名前のものがたまたま複数あると取り返しがつかないので,一般的には推奨されない.ここではそのようなことが起きる可能性を無視し,手軽さを優先している.

*17 これは整数 1, 2, 3 を並べてひとまとめにしたものであり,a=[1,2,3] のようにして全体にひとつの名前を付けることができる.その中のひとつずつの要素は,0 から始まる要素番号を使って,a[0], a[1] のように書き表す.a=[[1,2],[3,4,5]] のようなリストのリストは要素を a[0][0], a[1][2] のようにあらわす.

*18 array は numpy モジュールによって,DataField は pandas モジュールによって定義されている.numpy モジュールは pylabモジュールの一部である.

*19 この程度の計算は実質的に 1行のプログラムですんでしまうが,それでもわざわざ新しい関数を定義するのは,関数名を見ればどんなことをするのかわかるからである (子供の名前を見れば少なくとも親の思いはわかる.).

14

Page 15: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

1 def make_g(xx):

2 u"測定点リストから計画行列を作る関数:定数項省略"

3 rr = array(xx) * pi/90

4 return DataFrame( [ [cos(r),sin(r)] for r in rr ] )

5 #%%

カーソルをこの定義の中に入れて,Run current cell で実行する.この実行は make_g という名前の関数の

定義 (すなわちどのように計算すればいいかということの記憶)を python が行っただけである*20.

この関数の動作をテストするため,IPython console で,次のように,測定点のリストとして[0,15,30,45]を make_gに与えて実行してみる.

1 make_g([0,15,30,45])

これで 4行 ×2列の配列ができる.これは次のような計算をしたのである.各行は各測定点に対応している.cos(2 × 0°) sin(2 × 0°)cos(2 × 15°) sin(2 × 15°)cos(2 × 30°) sin(2 × 30°)cos(2 × 45°) sin(2 × 45°)

5.5 データ入力と読み込み

測定データはテキストファイルに入れておくのがよい.テキストファイルは作るのも変更するのも容易だか

らである.File メニューの New file で新しい Editorウィンドウを開き,ここに測定データを入れて保存しよう.何か書いてあるのを全部消してしまってから,次のように書き込む (これは例である).はじめの行にはx と y を列名として書く.2行目から偏光フィルターの角度と透過光強度のデータを空白で区切って書き込んでいく.各行の右側に#で注釈を入れてもよい.空行や注釈のみの行は許されないかもしれない.

1 x y #スクロース溶液 1, 5/16

2 0 0.809

3 30 0.403

4 60 0.039

5 90 0.077

6 120 0.477

7 150 0.836

8 180 0.794

9 210 0.400

*20 1行目のキーワード def は ‘define’(定義) ということで,関数定義の開始をあらわす.この行には関数名と仮パラメータを書く.関数のパラメータにどのようなデータを想定するのかを明示するような文法は無い.2行目の文字列は ‘docstring’ といい,IPython consoleで make_g ? と打ったりした時に表示される説明文である.3行目はこの関数に与えられたリストの全成分に π/90を掛けている.三角関数には円周角 (ラジアン)で角度を与えなければならない.4行目は上の結果を使って行列のすべての行を作り全体をまとめて結果としている.array や DataFrame はリストや行列データの特性を数値計算向きにするものである.未知パラメータは A, B,C と 3つあるので,計画行列は本来 3列になるが,C は定数項であるため別扱いになる.

15

Page 16: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

10 240 0.040

11 270 0.081

12 300 0.481

13 330 0.843

14 360 0.782

これを File メニューの,Save as... で保存する.ファイル名には英語アルファベットと数字が使えるが,ひ

らがなや漢字を使うこともできる.説明の都合上,今はファイル名を data10 としておこう.もし拡張子を付けるなら,テキストファイルという意味で .txt を付けるとよい.Desktopに保存しよう.ファイルに保存されているデータを計算に使うには,それを python に読み込んでやる必要があるが,まず,IPython consoleで pwd と打って作業ディレクトリを表示し,これがデータファイルの保存場所と異

なる場合は,作業ディレクトリをファイルの保存場所に変更する*21.

データファイルを読込むために, IPython consoleで次のように打つ.

1 file = 'data10'

2 data = read_table(file, sep='\s+', comment='#')

ファイル名はいろいろ変わるので,代わりに “file”のような変数を使うのがよい.sep='\s+'は,read_table関数に,データが1つ以上の空白によって区切られていることを教えるために必要なパラメータである.ま

た,comment='#' は注釈文字を指定するパラメータである.読み込んだデータには “data” という変数名が付いたので,dataと打てば中身を確認することができる.

x-yグラフを表示するには次のようにする.

1 data.plot(x='x', y='y', kind='scatter')

'scatter'とは Excel などの「散布図」と同じ意味である.測定の間違いがわかる場合があるから,グラフを表示してよく見ることは重要である.

5.6 フィッティング

線形フィッティングを pandas モジュールの ols 関数でおこなう.IPython consoleで試してみよう.

1 ols(x=make_g(data.x), y=data.y)

ols には,x= で計画行列を与え,y= で測定値リストを与える.data.xは data中の x列を意味する.data.yは y列.ols の結果は多くの数値からなるので,それらを一旦適当な変数名でまとめて保存するのがよい.そこからパラメータの推定値を取り出して A, B, C に入れ,それらの標準誤差を dA, dB, dC に入れる.

*21 Editorウィンドウのタブ (左上の出っ張り)の右クリックメニューで Set console working directory を選ぶと,作業ディレクトリがファイルの保存ディレクトリに変更される.ファイル保存場所と作業ディレクトリが一致している場合は,ファイル名

のみでファイル指定ができる.pwd は print working directory のこと.

16

Page 17: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

1 fit = ols(x=make_g(data.x), y=data.y)

2 A, B, C = fit.beta

3 dA,dB,dC = fit.std_err

ここで,A, dA, B, dB, C, dC と打てば,3つのパラメータの推定値と標準誤差がわかる.式 (15)から,元の非線形モデルのパラメータは次のようにして得られる (角度はラジアンから度に変換).

1 a = 2 * sqrt( A ** 2 + B ** 2 )

2 b = math.atan2( B, A ) * 90 / pi

3 c = C - a/2

atan2() には math. を付けなければならない.これらのパラメータの値の標準誤差は A, B, C の標準誤差から求められるが,ここでは b が大事なので b の標準誤差だけを求める.誤差の伝播則で計算すると

∆b =

√(∂b∂A

∆A

)2+

(∂b∂B

∆B

)2=

2

a2

√(B∆A)2 + (A∆B)2

となる*22.よって,b の標準誤差は次のように計算すればよい.

1 db = sqrt( (B*dA)**2 + (A*dB)**2 ) * (2/a**2) * (180/pi)

5.7 グラフの完成

決定したパラメータを使ってモデルのグラフを表示しよう.それには,fit.predict という関数 (オブジェクト fit のメソッドともいう)を使って,測定点以外での値を計算する.細かい間隔で計算しないとなめらかな曲線にならないので,1°ごとに計算する*23.

1 xfine = arange(data.x.min(), data.x.max())

2 plot(xfine, fit.predict(x=make_g(xfine)))

グラフのタイトルを入れることができるが,そこに計算結果を入れておく.

1 title('{}: a={:.4}, b={:.4}(sigma={:.2}), c={:.4}\n'

2 .format(file, a, b, db, c))

.format の前の文字列の中の中括弧の部分が file, a, b, db, および c の値に置き換えられて表示される.中括弧の中には,{:.4}のように,表示精度を入れることができる.

*22 式 (14)または式 (15)から,∂b/∂A = −2B/a2,∂b/∂A = 2A/a2.∆b,∆A,∆B は各パラメータの標準誤差.ただし,これらの式

では角度の単位はラジアンである.

*23 測定データの独立変数の最大値と最小値を data.x.min() と data.x.max() で取得し,arange 関数によって,最小値と最大値の間で間隔 1の数値列を作り,この数値列を make_g 関数に与えて細かい間隔での計画行列を組み立てる.それを fit.predictに与えると,すでに fit の中に収められている情報を使って,関数値リストが計算される.plot関数には横軸データとして xfineも与える必要がある.

17

Page 18: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

グラフに画像保存のボタンがあれば,それでファイルに保存することができるが,プログラムで保存するに

は,gcf().savefig(file+'.png') のようにやればよい.file+'.png' は,データファイルの名前に拡張

子として ‘.png’を追加したものを意味する.gcf() はいま表示している図の情報.

5.8 解析をおこなう関数の作成

データを読み込んでグラフを作るまでの手続きを analyse という名前の関数にまとめよう.この関数はデータファイル名を与えて呼び出すようにする.Editorウィンドウの make_gの定義に続いて,次のコードを入

力する.

1 def analyse(file):

2 u"file で与えられたデータを解析し結果を図ファイルに出力"

3 data = read_table(file, sep='\s+', comment='#')

4 fit = ols(x=make_g(data.x), y=data.y) #推定計算

5 A, B, C = fit.beta #推定値

6 dA,dB,dC = fit.std_err #推定値標準誤差

7 a = 2 * sqrt( A ** 2 + B ** 2 ) #振幅

8 b = math.atan2( B, A ) * 90 / pi #偏光方向

9 c = C - a/2 #最低値

10 db=sqrt( (B*dA)**2 + (A*dB)**2 )*(2/a**2)*(180/pi) #b誤差

11 data.plot(x='x', y='y', kind='scatter') #測定点プロット

12 xfine = arange(data.x.min(),data.x.max()) #1°ごとに分割

13 plot(xfine, fit.predict(x=make_g(xfine)) ) #曲線プロット

14 title('{}: a={:.4}, b={:.4}(sigma={:.2}), c={:.4}\n'

15 .format(file, a, b, db, c))

16 gcf().savefig(file+'.png') #画像ファイルへ保存

17 return {'a':a, 'b':b, 'db':db, 'c':c}

18 #%%

18

Page 19: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

return 文はキーと値の形式で結果を返している.Run current cell をしてから,IPython consoleで

1 analyse('data10')

と打って呼び出す.結果が data10.png というファイルに保存されることを確認し,うまくいったら,ここまでのプログラムを 1つのセルにまとめるため,区切り記号をすべて消すか#% に変え,このプログラムを保存

する.以後は,IPython consoleで from henkou import analyse とするだけで,analyse 関数が使えるようになる.

なお,以上の計算では単位の表示を考慮していないが,報告書では当然単位の明示が必要である.

Linux や Mac OS X では,このプログラムを独立した完全なコマンドにすることもできる.それには,プログラムの 1行目に#! /usr/bin/python

と書き (これは shebangという).最後のところに次のコードを追加して保存する.import sysif __name__ == "__main__":

for f in sys.argv[1:]:analyse(f)

最後に,このファイルに実行権を付ける (たとえばファイルのプロパティーで).端末を開いて,./henkou.py data10 data11 data12

のように打てば,複数のデータファイルの解析が一度にできる.データは任意のテキストエディタで入力することができる.

6 線形フィッティング – Excel編Excel のような表計算プログラムでは,LINEST という関数で線形フィッティングをおこなうことができる. 表を埋めたりグラフを表示するのに手間がかかるが,結果を着実に得ることができる.

次の図のように,測定値として,x と y の値を縦向きに並べる. ここでは三角関数を使うので,xはラジア

ンに直している. その右にモデル行列を入れる. ここでは「パラメータ係数」と称している.定数項はモデ

ル行列ではすべて 1であるが,表計算の場合はそれを入れる必要は無い.「フィットパラメータ」の2行下の3つのセルをセレクトして,そこに LINEST関数を入れる.

=LINEST(C3:C15,D3:E15,1)

LINEST 関数には,y の範囲とモデル行列の範囲を指定する. 定数項の計算もさせるために,3 番目のパラメータを1にする.この式を配列式として確定するため,control キーと shift キーを押しながら enter する.パラメータの推定値が表示されるが,定数項以外の順序がなぜか逆になる.

推定曲線は推定値を使って別に計算して表示しなければならない. なぜなら,測定点だけで計算しても滑

らかな線にはならないからである.図では,表のこの部分は上の方の一部だけが見えている.グラフは「散布

図」として作成する. 2系列のデータを一つのグラフに入れる方法を調べるには,とにかくいろいろ試して

みればよい.

19

Page 20: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

測定値 パラメータ係数degree x y cos sin

0.4165 130 0.524 0.2264 0.5 0.86660 1.047 0.0318 -0.5 0.86690 1.571 0.0432 -1 1E-016

120 2.094 0.2223 -0.5 -0.866150 2.618 0.4315 0.5 -0.866180 3.142 0.4371 1 -2E-016210 3.665 0.2548 0.5 0.866240 4.189 0.0408 -0.5 0.866270 4.712 0.0215 -1 4E-016300 5.236 0.2149 -0.5 -0.866330 5.76 0.4266 0.5 -0.866360 6.283 0.4128 1 -5E-016

フィット・パラメータB A C-0.11 0.1982 0.2294

degree x y0.4275

6 0.105 0.40112 0.209 0.366918 0.314 0.326824 0.419 0.282430 0.524 0.2358

0 50 100 150 200 250 300 350 4000

0.05

0.1

0.15

0.2

0.25

0.3

0.35

0.4

0.45

0.5列 C列 C

角度( degree )

透過率

(任意単位

)

A B C D E F G H I J K123456789101112131415161718192021222324252627

7 非線形フィッティング – mathematica編数学ソフトの Mathematica を使って非線形フィッティングをおこなってみよう. どういう計算をしているかがわかるようにする. 答えは一意的に求まる.

まずは Mathematica を起動して,ノートブックを表示する. 起動法や基本的な操作法は附録に書いたので,適宜参照してほしい.

7.1 データ入力

データを次のように入力する.ノートブックで,dat= とタイプし,続けて,挿入メニューの表・行列 の 新

規作成で,ダイアログを出し,「列数」を 2にして OK ボタンを押す.測定値を下のように入力する.左側は回転角度,右側は透過光強度である. 行を追加するには,入力済みデータの一番下の行で,〈control〉-〈enter〉を打つ.

  dat=

 0 0.809

30 0.403

60 0.039

90 0.077

120 0.477

150 0.836

180 0.794

210 0.400

240 0.040

270 0.081

300 0.481

330 0.843

360 0.782

;

20

Page 21: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

空白データが無いようにする. データがすべて入ったら,表の右側にセミコロンを付けて,〈shift〉-〈enter〉 を打つ. 間違えたらデータを修正してから 〈shift〉-〈enter〉 を打てばよい.dat とすると,内容を確認すること

ができる. 回転角度と透過光強度からなる複数のリストが全体としてひとつのリストにまとめられている.

Mathematica では,何か動作をさせるには 〈shift〉-〈enter〉 を打つ必要があることを忘れないこと.次に,今入力したデータをグラフ表示する.

ListPlot[dat]

50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

念のため,これから使う名前を洗浄する. 何か変なことが起こるとき,名前の洗浄をしなかったのが原因

ということは多い.

Clear[x,a,b,c]

7.2 モデルの入力

モデル関数を定義する.

f[ x_, a_, b_, c_ ] := a Cos[(Pi/180)(x-b)]∧2 + c;

モデルに適当なパラメータを入れてみて,グラフでデータと比較する.

Show[Plot[f[x,0.8,160,0], {x,0,360}], ListPlot[dat]]

50 100 150 200 250 300 350

0.2

0.4

0.6

0.8

dat の中の角度と強度を別々のリストにする.

21

Page 22: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

{X, Y}=Transpose[data];

残差の二乗和を関数にする.

J[a_, b_, c_] := Total[(Y-f[X,a,b,c])∧2]

7.3 フィッティングの実行

次のようにして,J(a, b, c)の最小点を求める. a, b, cの初期値として,上で推定した値を使う.

r = FindMinimum[J[a,b,c], {a,0.8}, {b,160}, {c,0}]

rから結果を取り出す.

s = r[[2]]

グラフを見る.

Show[Plot[f[x,a,b,c]/.s, {x,0,360}], ListPlot[dat], Frame->True]

0 50 100 150 200 250 300 350

0.0

0.2

0.4

0.6

0.8

もう一度結果を見る.

s

ファイルメニューの「保存」でノートブックを保存する.ただしこのファイルはMathematica が無いと役に立たない.グラフを右クリックし,「形式を選択してグラフィックスを保存...」でグラフを保存することができる. ファイルの種類はワープロ用なら PNGがよい.用途によっては,PDFや EPSがよいかもしれない.

22

Page 23: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

付録 A Mathematicaの基礎以下はMathematica を使う場合に最低限必要な情報である.

A.1 起動

Mathematica を起動する方法はいろいろである.メニューやアイコンから起動できればそれでよい.「端末」や「コマンドプロンプト」で Mathematicaとタイプして起動することもできるかもしれない.

起動の途中でソフトウェアライセンス条項に対する同意を求める画面が出た場合は,それを受け入れる必要

がある.

起動したら,白紙のノートブックが出れば準備完了であるが,Mathematicaのバージョンによっては,メニューかボタンを使ってノートブックを開く必要があるかもしれない.

メニューなどを日本語にするには,おそらく Editメニューの Preference で設定することができる. こ

の場合,Mathematica を起動し直す必要がある.

A.2 式の入力

ノートブックが無事に開いたとしよう. 式を打ち込んだら 〈shift〉-〈enter〉 で計算ができる. 数値の四則計算をしてみてほしい. かけ算は 3 4のようにしてもよいし,3*4のようにしてもよい. 割り算は 10/5 のよ

うにする.整数どうしの割り算では結果が分数になる場合があるが,小数点を付けた数の割り算では近似値が

求められる. たとえば,10/12 は 56 となるが,10.0/12.0 は 0.833333 のようになる. 近似値を求めるに

は,式の右側に //N を付けることもできる. たとえば,10/12//N とすればよい.

Mathematica に組み込まれている関数の名前はすべて大文字で始まることになっている. たとえば,指数関数は Exp である. 引数は中括弧 [ , ] で囲む. よって,exp(x) は Exp[x] とあらわす.正弦関数は Sin

である. 角度の単はラジアンである. 円周率 π は Pi とあらわす. よって,たとえば,角度 15 度の正弦を求めるには,Sin[15 Pi/180] とする. 近似値でよい場合は,Sin[15 Pi/180]//N,あるいは Sin[15.0

Pi/180] のようにすればよい.

A.3 単純な定義

式に名前を付けると,その後は式のかわりに名前を使うことができる. たとえば,x としても,x になるだ

けだが,x = 41/263; としたあとは,x とすれば, 41236 になるし,x//N とすれば,0.155894 と計算してくれ

る.一度使った名前を別の式に付けることもできる. この場合,前の式は忘れられる.x が不要になったら,

Clear[x] として記憶を消すのがよい.

名前は英語アルファベットやギリシャ文字を任意に組み合わせて勝手に作ることができる. 大文字と小文

字の区別がある. Mathematica にはじめからある名前は,大文字からはじまることになっている.

A.4 関数定義

f (x) = x2 − 2x − 1というような関数を作るには次のようにする (この場合も 〈shift〉-〈enter〉 を打つ).

23

Page 24: カーブフィッティング 回帰分析tanigawa/materials/opt-exp/fitting.pdf · カーブフィッティング(回帰分析)の練習 線形最小二乗フィッティング:

f[x_ ] := x^2-2x-1;

x_ という表現は「パターン」といい,「ここに何かが来る. 何が来るかわからないが,それを仮に x と呼

ぶ」という意味である. 右辺は,仮に付けられた名前 x を使って,どのような計算をするのかを指定する.

これは関数の定義である. 計算の実行は「関数呼び出し」といい,関数名と実際の計算対象を指定する.

たとえは,今定義した関数 f を使って,f[Pi] とすると,−1 − 2π + π2 となるし,f[2^(1/2)] とすると,

1 − 2√2 となる (2^(1/2) は 21/2, すなわち

√2).

A.5 リスト

複数のものをまとめてひとつにしたものを「リスト」という.ひとつにまとめたいものを中括弧に入れてあ

らわす.たとえば,{1, 1/2, Pi} は,整数 1, 有理数 12,および無理数 πからなるリストである.リストは

まとめて計算することができる. たとえば,{1, 1/2, Pi} 2 は,{2, 1, 2π}となる.

a={1, 1/2, Pi}; としてから,a とすると,リストが表示される.2番目の要素だけを見るには,a[[2]]

とする. 2重の大括弧が必要である.複数のリストからなるリストを作ることもできる.

b={{4/3, 7/3}, {Pi, 2 Pi}, {2^(1/3), 2^(1/2)}};

24