14

私は現在、2 つの時系列を比較したい小さなプロジェクトに取り組んでいます。類似度の尺度は非常に曖昧です。2 つの時系列がほぼ同じ形状である場合、それらは類似していると見なされます。

だから私は、「形状が同じであれば、2 つの時系列のピークを比較するだけです。ピークが同じ位置にある場合、時系列は確かに類似しているはずです」と考えました。

私の問題は、ピーク検出のための適切なアルゴリズムを見つけることです。私はグーグルを使用しましたが、時系列のピーク検出のための単純なアルゴリズムという論文しか思いつきませんでした。問題は、このホワイト ペーパーで説明されているアルゴリズムが非常に極端で薄いピークでうまく機能することですが、ほとんどの場合、私の時系列のピークはかなり平坦であるため、検出されません。

次の画像に示されているピークを検出するアルゴリズムを見つけたり検索したりできる場所を知っている人はいますか?

時系列

4

6 に答える 6

7

あなたは単に勾配の反転を探しているようです(正から負へ、またはその逆)。大まかなJavaアルゴリズムは(テストされていません):

List<Point> points = ... //all the points in your curve
List<Point> extremes = new ArrayList<Point> ();
double previous = null;
double previousSlope = 0;

for (Point p : points) {
    if (previous == null) { previous = p; continue; }
    double slope = p.getValue() - previous.getValue();
    if (slope * previousSlope < 0) { //look for sign changes
        extremes.add(previous);
    }
    previousSlope = slope;
    previous = p;
}

最後に、類似性を測定する良い方法は相関関係です。あなたの場合、私は%移動相関を調べます(つまり、2つのシリーズを同時に上昇または下降させたい)-これは通常、たとえば2つの資産リターン間の相関を計算する金融で行われることです:

  • 2 つのシリーズの各ポイントの移動 % を使用して 2 つの新しいシリーズを作成する
  • これらの 2 つの系列の間の相関を計算する

たとえば、返品の相関関係について詳しくは、こちらをご覧ください。要約すると、値が次の場合:

Series 1  Series 2
 100        50
 98         49
 100        52
 102        54

「返品」シリーズは次のとおりです。

Series 1  Series 2
 -2.00%     -2.00%
 +2.04%     +6.12%
 +2.00%     +3.85%

そして、これら 2 つのリターン系列の相関 (この例では 0.96) を計算して、2 つの曲線がどの程度似ているかを測定します。結果の分散を調整したい場合があります (つまり、1 つの形状の範囲が他の形状よりもはるかに広い場合)。

于 2012-09-03T15:24:06.077 に答える
6

非常に単純な局所極値検出器を使用できます。

// those are your points:
double[] f = {1, 2, 3, 4, 5, 6, 5, 4, 7, 8, 9, 3, 1, 4, 6, 8, 9, 7, 4, 1};
List<Integer> ext = new ArrayList<Integer> ();
for (int i = 0; i<f.length-2; i++) {
  if ((f[i+1]-f[i])*(f[i+2]-f[i+1]) <= 0) { // changed sign?
    ext.add(i+1);
  }
}
// now you have the indices of the extremes in your list `ext`

これは、スムーズなシリーズでうまく機能します。データに特定の変動がある場合は、最初にローパス フィルターに通す必要があります。ローパス フィルターの非常に単純な実装は、移動平均です (すべてのポイントは、最も近い k 値の平均に置き換えられます。k はウィンドウ サイズです)。

于 2012-09-03T15:50:39.490 に答える
1

統計的により健全なものが必要な場合は、2 つの系列間の相互相関を測定できます。ウィキペディア、またはこのサイトを確認できます。

于 2012-09-03T15:59:22.237 に答える