web-dev-qa-db-ja.com

2つの曲線の特徴を比較する方法は?

2つの曲線を比較する必要がありますf(x) and g(x)。それらは同じxの範囲にあります(たとえば-30から30)。f(x)いくつかの鋭い山または滑らかな山と谷があるかもしれません。g(x)は同じ山と谷があるかもしれません。そうなら、これらの特徴がどれほどよく一致するかを目視検査なしで測定したいですこの問題を次の方法で解決しようとしました。

  1. 各データポイントを関数の総面積で除算して、両方の関数を正規化します。これで、正規化された関数の面積は1.0になります
  2. 各xでf(x) and g(x)から最小値を取得します。これにより、基本的にf(x)およびg(x)。
  3. ステップ2の結果の関数を統合すると、1.0からオーバーラップする合計面積が得られます。

ただし、山と谷が一致するかどうかはわかりません。これが実行できるかどうかはわかりませんが、誰かが方法を知っている場合は、あなたの助けに感謝します。

==編集==明確にするために、画像を含めました。

Sample curves

2つの曲線(黒と青)の違いは同じではない場合がありますが、補完的な形状になります。

背景:関数は、化合物の原子軌道の投影状態密度(PDOS)です。したがって、s、p、d軌道の状態があります。材料にs-p、p-d、またはd-dハイブリダイゼーション(軌道混合)があるかどうかを確認したい。私が持っている唯一のデータはPDOSです。 s軌道のPDOS(関数f(x))には、p軌道のPDOS(関数g(x))すると、その材料にはsp混合があります。

11
laalee

これは、分析化学、物理学、分光法などにおいて一般的で、しばしば困難な問題です。使用されるアプローチは、単純なRMSD比較から非常に高度な方法までさまざまです。目視検査でタスクを実行するのが容易でない場合(人間は機能認識のために精巧に開発されています)、計算で行うのは難しいでしょう。

1つのアプローチは、「ベースライン」を削除して、ピークまたは谷の特徴がある場合を除いて関数がゼロ値になるようにすることです。これは、低次の多項式を使用したカーブフィッティングで行うのが最適です。より良いのは、ベースラインがどのように見えるべきかを示す、より適切な原理モデルです。ピークが非常に鋭い場合は、関数を平滑化し、平滑化された関数を元の関数から差し引くことができます。

ベースラインを削除した後、残差を正規化して生成したり、RMSD(単純なアプローチ)を実行したり、求める特徴にガウス(または適切なモデル)を当てはめてピーク/バレーの特徴を検出したりできます。ピークに合わせることができれば、ピークの位置と半値幅を比較できます。

Pythonを知っている場合は、SciPyをご覧ください。幸運を。

4

これは「頭の上の」だけなので、問題を完全に誤解している可能性がありますが、関数に root-mean-square distance (RMSD)を適用できます。ピークと谷だけに関心がある場合は、それらのピークと谷の周りの領域に適用します(つまり、いずれかの関数の導関数がゼロである一部のx +/-イプシロンの場合)。その範囲のRMSDがゼロに近い場合は、適切に一致していると思います。

3
dbc60

私がそれを理解していないと、あなたが探している情報は関数の「tableau des Variations」によって伝えられます—これの英語名がわからないのは非常に残念です!

このテーブルは微分可能関数fに関連付けられており、f 'の根を見つけてそれを作成し、それぞれについてf'の符号を決定しますこれらのゼロの間隔。

したがって、f 'g'のゼロが多少一致し、これらの関数の符号が一致する場合、これらは同様のプロファイルになります。

私がプログラムしようとする最初のことは次のようになります:

  1. 小さいεを選択します
  2. 関数が定義されている区間に、ランダムに多数の[〜#〜] n [〜#〜]点を描画しますx [i].

  3. 各ノードについて、差F [i] = f(x [i] +ε)-f(x [i]-ε)およびG [i] = g( x [i] +ε)-g(x [i]-ε)

  4. 各ノードの場合、F [i]およびG [i]はどちらもε² ORよりも小さい両方とも同じ符号を持っています。2つの関数はほぼ同じプロファイルを持っていると結論付けます。

うまくいきますか?

ブルートフォース:この値をステップとして最小のゼロ以外の浮動小数点値を見つけ、ドメイン全体を調べて、値が等しいかどうかを確認しますか?

==編集==

うーん...「同じ形状」がg(x)= c * f(x)を意味する場合、このソリューションは修正する必要があります-計算するドメインの各要素に対してf(x)/g(x)で、各ポイントの結果が同じかどうかを確認します(もちろん、g(x) == 0の場合、f(x) == 0、あなたは分割しようとしていません)。

「同じ形状」が「局所最適と屈曲点が同じ」を意味する場合...さて、f(x)とg(x)(ドメイン要素のセットとして)、それらのセットが等しいかどうかを確認します。

3番目のオプション:f(x) = g(x)+ c。ドメインの各要素に同じ差f(x)-g(x)があるかどうかを確認します。これは、最初のケースですが、除算の代わりに違いがあります。

==まだ別の編集==

さて...上記の編集からの2番目のアプローチが役に立つかもしれません。また、最初の微分記号の記号と比較してマージすることもできます(シンボリックではありませんが、df(x)= f(x)-f(x-step))。両方の関数がドメイン全体で微分の同じ符号を持っている場合は、念のためにオプティマとベンディングポイントを確認してください。この条件は、必要なことを行うのに十分なはずです。

1
Filip Malczak

これらの機能が目視検査なしでどの程度一致するか。

おそらく最も簡単な方法は ピアソンの相関係数 を計算することです。つまり、f(x) Xとして、g(x) Yとして使用します。効果的に「プロットg(x) f(x)の関数として、それがどれだけ直線を形成しているかを確認してください。 ".

相関係数は計算が簡単なため人気があり、手を振るだけで正当化されることがよくあります。いくつかの用途では初期近似としては良いかもしれませんが、万能薬ではありません。

実際のアプリケーションでより良い結果を得るには、データで何が起こっているか、つまりデータを生成するプロセスを理解する必要があります。多くの場合、ある種の背景があり、興味深い機能はその背景の上に乗っています。データ全体をブラックボックスに入れると、バックグラウンドの大部分が比較される可能性があります。ブラックボックスでは、データのどの部分が興味深い部分であるかがわかりません。したがって、より良い結果を得るには、背景を何らかの方法で削除してから、残っているものを比較することをお勧めします。ラインまたはカーブまたは平均をフィッティングし、それらを減算または除算し、ローパス、バンドパス、またはハイパスフィルタリングを行い、非線形関数を介してデータをフィードします。名前を付けます。

正解は1つではありません。メソッドを試すだけで、さまざまな結果が得られます。しかし、一部の結果は一部のよくない結果よりも優れています。理論的な推論は正しい方向から始めるのに役立ちますが、パラメーターを設定してメソッドを微調整する方法は、最終的にはそれらを試して実際の結果を比較することによってのみ見つけることができます。

1
Joonas Pulakka