2

sin(x) などの関数の xy 値と範囲を含むデータセットがあるとします。このデータセットの曲線 (sin 関数の山と谷) を検出するにはどうすればよいですか?

4

5 に答える 5

2

十分なサイズの座標のセットが(x,y)あれば、任意の種類の関数、正弦関数、高次(または低)次数の多項式、線形、指数、スプラインなど、あらゆるものを適合させることができます。うまくフィットさせるのは難しい部分です。

データを見つけるために出発する前に、データがどのような関数に適合すべきかを実際に理解しておく必要があります。たとえば、データが安定した振幅で一定のサイクルを持っていると思われる循環プロセスからのものである場合は、単一の正弦関数をそれに適合させてみてください。(これがあなたのやりたいことなら、@ duyffmoのアドバイスに従ってください。)

コメントの1つで、データがランダムであることをほのめかしています。その場合は、曲線をそれに合わせるために時間を無駄にしないでください。この用語の適切な定義の1つrandomは、真にランダムな一連のデータを生成できる関数がないことです。「振幅と位相がランダムに変化する一種の正弦波」のようなものを意味する場合、適合度の測定値は、モデル(つまり選択した関数)とデータの違いを定量化します。プロセスにフィードします。

于 2012-08-01T10:12:34.647 に答える
1

ブルートフォースアプローチを試し、検索アルゴリズムを使用して最小値と最大値を見つけることができます。

別のオプションは、最小二乗多項式をデータに当てはめ、導関数による近似から極大値と極小値を見つけることです。ただし、近似が非常に適切でない限り、これは少し危険です。

データが非常に振動している場合は、スプラインを使用して近似を試すことができます。

データを見ないとなんとも言えません。データにノイズが多い場合、微分法はノイズに非常に敏感であるため、有限差分アプローチを使用して導関数を計算することは危険です。

最小二乗スプライン近似を使用すると、最も柔軟性が得られると思います。これにより、非常に幅広いデータ入力を処理できます。数値線形代数ライブラリを入手できない限り、世界で最も簡単に実装できるものではありませんが、最良の結果が得られる可能性があります。

于 2012-08-01T07:08:22.633 に答える
1

(x, y) データがあり、三角関数が必要であることが確実な場合は、高速フーリエ変換を実行することをお勧めします。データに存在するすべての周波数を取得します。どれが最大のマグニチュードを持ち、シグナルを支配しているのかを確認できます。フィルタリングして、興味のない周波数を削除できます。参考になる文献やソフトウェアがたくさんあります。必要に応じて、CUDA と GPU を使用することもできます。組み込みの FFT パッケージがあります。

于 2012-08-01T08:52:28.940 に答える
0

昨日見つけた解決策: データに対してスライディング ウィンドウ (データセット サイズの 5 分の 1 を使用) を使用し、極小値と極大値に投票します。曲線の中心。さらに処理するために、このデータを取得したら、ポイントをしきい値処理していくつかの強力なポイントに減らし、多項式回帰 (3 度まで) を実行し、a 値 (ax^2+bx+c) を取得します。曲線のサイズを決定します (曲線が平坦すぎる場合は、異常のある直線と見なしてください)。

問題を正確に説明していない可能性があることを付け加えたいと思います.sin(x)と述べたとき、曲線を生成する例を使用していました.私のデータは決して三角関数(または任意の関数)に従いません.曲線はランダムな場所にあり、回帰が不正確になります。

これは完璧な解決策ではないかもしれませんが、うまくいきます。

于 2012-08-02T03:33:26.470 に答える
0

モデリングしている関数について何も知らず、転換点を見つけたいだけの場合は、曲線を微分して、これがゼロを横切る場所を見つけることができます。

離散データセットの導関数を近似する 1 つの方法は、(y2-y1)/(x2-x1)隣接する点の各ペアを取得することです。データ ポイントをループして、これが正の値から負の値に、またはその逆に変化する場所を記録できます。

于 2012-08-01T07:03:53.110 に答える