2009年
11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2009-11-17 ruby-gslでfitting

_ Gaussianでfit

たくさんのデータをgaussianでfitする必要があって、どうやってやろうか考えた。グラフソフトを使って、手でするのはデータが多すぎて現実的ではない。Rはプログラムを組めるので、可能ではあるだろうが、gaussianのfitをどうするかまだ知らないので、別の方法を試みることにした。調べてみると、GSLというライブラリがあり、科学計算に用いるいろいろな道具が揃っているらしい。さらに、これがrubyからたたけるらしい。というわけで、rubyでgaussian fitをしてみた。まずは、
aptitude install libgsl-ruby
でインストール。Histogramだとfit_gaussianというmethodがあるようだが、これだとxyデータをそのまま扱えない。いろいろと探していたら、MultiFitでできることが分かった。こんな感じだ。
require "gsl"
x=[0,1,2,3,4,5,6]
y=[0,1,2,3,2,1,0]
gx=GSL::Vector[*x]
gy=GSL::Vector[*y]
guess=[gy.min,gy.max,gx.mean,2]
y0,int,x0,var=GSL::MultiFit::FdfSolver.fit(gx,gy,"gaussian",guess)[0].to_a
いろいろと分からないことが多いが、配列を返してくるので、先頭にあるパラメータを取り出して、これがGSL::Vectorなので、rubyの通常の配列に戻して、結果を得ている。いろいろなデータを試してみると、明らかにピークがあるデータはうまくいくのだが、ピークがあるか無いかわからないようなデータだと、変な値になってしまう。ピークがなさそうなら、強度が0に近い値になって欲しいのだが。あとはこの辺りをなんとかしないと。