ガウシアンフィッティングのアルゴリズム
- c言語等を用いて実験データの解析を自動化するために、ガウシアンフィッティングのアルゴリズムを探しています。
- 現在は手作業でガウス曲線近似を行っていますが、解析プログラムを作って自動化したいと考えています。
- ガウス曲線に近い部分を検出し、フィッティングを数値計算的に行うアルゴリズムに関する情報をお知りの方はいらっしゃいませんか?
- ベストアンサー
ガウシアンフィッティングのアルゴリズム
c言語等を用いて実験データの解析を行おうと思っています。 データの形式は(x・・・時間軸、y・・・値)の列になっていて、 これをグラフにすると、パルス状の波形が連続する形になっています。 求めたい情報は、各パルス波形の山に対応する時刻の羅列 なのですが、現在ではガウス曲線近似機能のついたグラフソフトで、 一個一個手作業で求めています。 これを、解析プログラムを作って自動化しようと思っているのですが、 ガウス曲線(鋭い立ち上がりの)に近い部分を自動的に検出する方法、 また、フィッティングを数値計算的に行う方法がわかりません。 このようなアルゴリズムを考える上で参考になるようなHPや文献を ご存知の方がいらっしゃれば、教えていただきたいと思っています。
- userk
- お礼率100% (3/3)
- 数学・算数
- 回答数3
- ありがとう数6
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
パルスを探すアルゴリズムの具体的な文献はしりませんが、 たとえば、xが小さい方から順にyの値を見ていき最大値を探し yが一定値以下になったら次の最大値を探し始めるようなのでは どうでしょうか。 言葉で説明すると難しいのでコードで示すと以下のようになると 思います。(適当に書いたのでバグがあるかも。) int i; int flag_peak=0; /* 0: 谷 1: 山 */ float y_max=0; float x_peak=0; float x[1000], y[1000]; /* data */ /* ここで x と y の配列にデータをセットする。 */ for(i=0; i<1000; i++){ if( y[i]<50 ){ if( flag_peak ==1 ) printf("peak %d %d\n", x[i], y[i]); flag_peak=0; y_max=0; } if( y[i]<80 ) continue; if( y_max<y[i] ) { y_max = y[i]; x_peak = x[i]; } flag_peak=1; } ここで、パルスは上向きで最大値が常に80以上になる、 パルス間の谷は常に50以下になることを仮定しています。 この50と80の差はyのふらつきを考慮したものです。 また、データは xについてソートされているものとしています。 このパルスの位置は最大値の場所と定義していますが、 フィッティングする場合は、この値を フィッティングの初期値として 使うことになると思います。 フィッティングは、最小二乗法や 最尤推定法 (maximum likelihood method) などがあります。ふつうは最小二乗法かな? データ処理や統計処理の教科書に 載っていると思います。たぶん。 長くなってすみません。
その他の回答 (2)
- paatje
- ベストアンサー率51% (23/45)
話としては、混合モデル(Mixture model)の推定 というやつだと思いますが、 私も現在勉強中なので、アルゴリズムに関しては、 詳しく教えて差し上げられません。 「混合モデル」や「Mixture model」で 検索されてみてはいかがでしょうか? 私の読んでいる本では、EMアルゴリズムという アルゴリズム(とGibbs Samplerというアルゴリズム) を使っているようです。
お礼
alfeimさんの教えて下さった文献とともにしらべてみます。 混合モデルという言葉ははじめて聞きました。 有難う御座います。
- alfeim
- ベストアンサー率58% (114/195)
#無学なため、ガウス曲線なるものを知りませんが・・・ 鋭い立ち上がり位置を検出、というのであれば、サンプルデータを数値微分してやれば一発では? んで、アルゴリズム関連の書籍としては ・奥村晴彦『C言語による最新アルゴリズム事典』技術評論社,1991年,ISBN4-87408-414-1,2400円 がオススメ・・・というか定番ですね。 なお、ソースコードはVectorでダウンロード可能です(http://www.vector.co.jp/soft/data/prog/se002453.html)。
お礼
早速の解答、有難う御座います。 微分は試行錯誤では行ってみたのですが、 自力では上手くいきませんでした。
関連するQ&A
- gnuplotでガウス-ローレンツ混合関数フィッティング
物理学での実験データをgnuplotでガウス-ローレンツ混合関数フィッティングすることはできましたが,非対称項(x-p) -> (x-p)/[1+a*(x-p)/w], where -2≦a≦2 を取り入れるとエラー(Undefined value during function evaluation)が発生します.なぜでしょうか. ちなみにこの非対称項は 小島勇夫・福本夏生・倉橋正保;非対称ガウス―ローレンツ複合関数によるX線光電子分光スペクトルの波形解析;分析化学;Vol.35, No.10(19861005), pp. T96--T100 を参考にしました.
- 締切済み
- 物理学
- 一般べき級数近似の求め方
EXCEL上で二次元のデータに曲線をフィッティングしたいんですが、 べき級数で近似する際の計算方法をどなたかご存じでしょうか。よろしくお願いします。
- ベストアンサー
- 数学・算数
- Excelグラフの利用方法
Excel2013を使い、近似曲線を作成しました。 この近似曲線の曲線データをグラフ上にプロットしたいのですが、 その方法について、ご教示、宜しくお願い致します。
- 締切済み
- Excel(エクセル)
- ExcelでGaussian fittingをしたいのですが、どうすれば良いですか?
A1・・・A1001にx軸の値が B1・・・B1001にy軸の値が入っているとします。 このデータをグラフ化したのちに、ガウシアン関数y=a+b*exp(-(x-c)^2/d^2)に対してフィッティングを行い、それぞれの定数を算出及び、その算出されたグラフを上に乗せるということをしたいのですが、 Excel VBAを使ってどのようにすれば良いのでしょうか? また、ピークが1本ではなく2本ある場合Multipeak Gaussian fittingというものでそれぞれのピークに対してフィッティングすることもできるそうなのですが、できればその方法についても教えて頂けないでしょうか? 自分でひな形くらい作って質問したいところですが、全くどうやって作れば良いのか検討もつかないのでどなたかよろしくお願い致します。
- 締切済み
- Visual Basic
- エクセルの移動平均のグラフについて
例えば区間1~5にデータが0,1,2,1,0とそれぞれ配されている場合について教えていただきたいことがあります。 この場合「3区間の移動平均」近似グラフを表示させると「区間4」のところにピークが来る近似曲線が表示されます。 この近似曲線をデータが最大値を示す「区間3」にピークが来るように近似曲線を平行移動させる方法がありましたら教えていただきますようにお願いいたします。
- ベストアンサー
- オフィス系ソフト
- 画像処理アルゴリズムについて。
画面上に表示される数値の画像データを読み込みたいのですが、 解析方法として、保存された数値画像データから表示された数値画像データとの対比で解析する形になると思われます。 このアルゴリズムのプログラム方法でいいやり方がありましたら教えてください。 またいい説明をされているサイトがありましたら教えてください。 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- Excel近似曲線の仕組みについて
Excelグラフの近似曲線についての質問です。 業務でグラフを作成し、近似曲線を出す予定ですが、 Excelの近似曲線はどういった仕組みを使って書き込む方法がありますか? 当方は最小二乗法で書き込む方法しか存じ上げておりませんが、 それ以外にExcelグラフで近似曲線を求める方法はありますか? 業務上精度が悪いと使用できないため、もし他に近似曲線を出せる方法があれば それも教えて頂きたいです。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- Excelで近似曲線の数値をセルに反映させたい
エクセルでグラフを作って近似曲線を引いたときの間の数値をセル上に反映させたいのですが、方法はないのでしょうか。 例えば、 A B 10 0 11 12 5 13 14 15 16 15 17 18 といったような表をAをX軸、BをY軸でグラフにすると、3点のプロットのみが表示されて、それに近似曲線を入れることができると思います。 この近似曲線のデータをセルの空白の部分にプロットしていきたいのですが、方法がわかりません。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- EXCELの近似曲線について
データ処理を行うにあたり、5次の近似曲線を追加し、方程式を導出させたのですが、確認のために様々な値を方程式にいれてみたのですが、でてきた値が、グラフ上に表示されている近似曲線とはかなり違う値となってしまいました。これはなぜなんでしょう? ”近似曲線の追加”コマンドで表したグラフ上の曲線は何をあらわしているのでしょうか?これでは研究がすすみません!ご回答よろしくお願いします!!!
- ベストアンサー
- オフィス系ソフト
お礼
プログラムまで考えていただいて本当にありがとうございます! パルスのフィッテングを行った後、次のパルスへと移行するときの 考え方の参考になりそうです。