• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ガウシアンフィッティングのアルゴリズム)

ガウシアンフィッティングのアルゴリズム

このQ&Aのポイント
  • c言語等を用いて実験データの解析を自動化するために、ガウシアンフィッティングのアルゴリズムを探しています。
  • 現在は手作業でガウス曲線近似を行っていますが、解析プログラムを作って自動化したいと考えています。
  • ガウス曲線に近い部分を検出し、フィッティングを数値計算的に行うアルゴリズムに関する情報をお知りの方はいらっしゃいませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hazenoki
  • ベストアンサー率33% (21/62)
回答No.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) などがあります。ふつうは最小二乗法かな? データ処理や統計処理の教科書に 載っていると思います。たぶん。 長くなってすみません。

userk
質問者

お礼

プログラムまで考えていただいて本当にありがとうございます! パルスのフィッテングを行った後、次のパルスへと移行するときの 考え方の参考になりそうです。

その他の回答 (2)

  • paatje
  • ベストアンサー率51% (23/45)
回答No.2

話としては、混合モデル(Mixture model)の推定 というやつだと思いますが、 私も現在勉強中なので、アルゴリズムに関しては、 詳しく教えて差し上げられません。 「混合モデル」や「Mixture model」で 検索されてみてはいかがでしょうか? 私の読んでいる本では、EMアルゴリズムという アルゴリズム(とGibbs Samplerというアルゴリズム) を使っているようです。

userk
質問者

お礼

alfeimさんの教えて下さった文献とともにしらべてみます。 混合モデルという言葉ははじめて聞きました。 有難う御座います。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

#無学なため、ガウス曲線なるものを知りませんが・・・ 鋭い立ち上がり位置を検出、というのであれば、サンプルデータを数値微分してやれば一発では? んで、アルゴリズム関連の書籍としては ・奥村晴彦『C言語による最新アルゴリズム事典』技術評論社,1991年,ISBN4-87408-414-1,2400円 がオススメ・・・というか定番ですね。 なお、ソースコードはVectorでダウンロード可能です(http://www.vector.co.jp/soft/data/prog/se002453.html)。

userk
質問者

お礼

早速の解答、有難う御座います。 微分は試行錯誤では行ってみたのですが、 自力では上手くいきませんでした。