ある系列の2つの測定値が得られる場合に,この2つの測定値の関係を求める問題を考える.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
このときに,2つの系列の測定値の関係が,線形の関係にあると考える.
yを表現すると仮定する関数は基準周波数の整数倍の周波数を持つ正弦波でも良いし,より自由度の高い自由曲線を考えることもできる.
身長体重の単純な例では,
で表現されていると考えることができる.
すなわち,最小二乗法は,「測定されたxとyの系列から,ある条件を満たす係数列aを求める問題」と考えることができる.

例:一目盛が1mmの定規で長さを測定する場合は,0.1mmまで測定して,測定値が4.5mmとする.このとき真の値は,4.45mm〜4.54mmの間にあることになり,誤差の範囲は,±0.05mmとなる.

最小二乗法では残差の二乗和が最小になるように各係数を求める方式である.具体的には,残差二乗和を各係数で偏微分した式を=0とした連立方程式を立てて解く.すなわち残差二乗和Sを
として
![]()
これらをa0及びa1の連立方程式として解く.すると



aは求めるべき係数,X及びyは実験値から求まる,この2つからaを求めることが出来る.上の式のaにかかる行列を消去してy側に移せれば良い.Matlabでは,「左からの商」と呼ばれる演算子(\:日本語環境では円マーク,英語環境ではバックスラッシュ)が存在し,これを使うことによってaの値をダイレクトに求めることができる.

この計算を行うMTALABスクリプトは以下のようになる.MATLABらしいプログラムになっているので,プログラムのコメントと後ろの解説を良く読んでほしい.
注1:WWWブラウザからカットアンドペーストを行うと全角スペースが挿入されてシンタクスエラーとなることがあるので注意すること.
注2:作成した関数をセーブする際には,関数名と同じファイル名とすること!
MATLAB特有の演算子と演算結果を示しておく.本来\は,バックスラッシュ記号だがSJISのコード体系中では¥記号で表示されるので注意すること.x=[1 2 3 4]; y=[5 6 7 8];として
| *は行列の乗算 |
z1=x*y' ※x,yのままでは乗算できないのでyを転置している. |
z1=70 |
| \は行列の左除算 | z2=x\y |
z2 = 0 0 0 0 0 0 0 0 0 0 0 0 1.2500 1.5000 1.7500 2.0000 |
|
.*は,要素ごとの積.xとyの両方が配列の時は,両方が同じ大きさでなくてはならない. |
z1=x..*y |
z1 =5 12 21 32 |
|
\ は,左からの商.従ってz2は,x*z2=y の解 |
z2=x.\y |
z2 =5.0000 3.0000 2.3333 2.0000 |
|
.^は要素ごとのべき乗 |
z3=x.^y |
z3 =1 64 2187 65536 |
|
z4=x.^2 |
z4 =1 4 9 16 |
|
|
z5=2.^[x y] |
z5 =2 4 8 16 32 64 128 256 |
係数は3個になるので,3元連立方程式を解くことになる.




では,1次関数の最小二乗法のプログラムを修正して,2次関数の最小二乗法を行ってみよう.
単純に拡張しただけではグラフの出力がおかしくなるので,連続的な直線になるようにプログラムを修正せよ.ヒント:plot関数に渡す値を修正する必要がある.
