綾小路龍之介の素人思考

[perl] 最小二乗法(LSM)

パッケージを使わずに、perlで最小二乗法(LSM)してみる。この程度の最小自乗法は簡単。

LSM

最後に、下のように行列計算を行って結果を出力するんだな。

[∑y_n*x_n]=[∑x_n*x_n ∑x_n][a]
[∑y_n    ] [∑x_n     ∑1  ][b]
C:\WINDOWS\デスクトップ>perl -alne "$d=$F[2]*$F[4]-$F[0]**2;@a=(($F[4]*$F[3]-$F[0]*$F[1])/$d,($F[2]*$F[1]-$F[0]*$F[3])/$d);END{print \"@a\";}" c.dat
1.03341121358083 1.1275431582802
C:\WINDOWS\デスクトップ>

1つ目がa、2つ目がbなんだな。自信がないのでgnuplotで確かめてみるんだな。

gnuplot> fit a*x+b 'a.dat' via a,b
Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a               = 1.03341          +/- 0.01167      (1.129%)
b               = 1.12754          +/- 0.1398       (12.4%)
correlation matrix of the fit parameters:
               a      b
a               1.000
b              -0.877  1.000
gnuplot> print a
1.03341121360931
gnuplot> print b
1.12754315789153
gnuplot> plot 'a.dat',a*x+b

確かに近い値となっていることがわかるんだな。完成したのでGIFで出力しておくんだな。

gnuplot> set terminal gif
Terminal type set to 'gif'
Options are 'small size 640,480 '
gnuplot> set output 'a.gif'
gnuplot> plot 'a.dat',a*x+b
gnuplot>

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-06-05T02:41:58+09:00
  2. Modified: 2008-06-05T07:43:51+09:00
  3. Generated: 2017-01-13T23:09:39+09:00