時系列データの異なるセットを比較する方法


8

Pythonとsklearnを使用してtime#seriesの間に異常検出を実行しようとしています(ただし、他のパッケージの提案は大歓迎です!)。

10個の時系列のセットがあります。各時系列は、タイヤのトルク値(合計10タイヤ)から収集されたデータで構成されており、セットには同じ数のデータポイントが含まれていない場合があります(セットサイズが異なります)。各時系列データは、ほとんど、tire_id、タイムスタンプ、およびsig_value(信号またはセンサーからの値)です。1つの時系列のサンプルデータは次のようになります。

tire_id        timestamp        sig_value
tire_1           23:06.1            12.75
tire_1           23:07.5                0
tire_1           23:09.0            -10.5

今、私はそれらの10を持っています、そしてそれらの2は奇妙に振る舞います。これは異常検出の問題であることを理解していますが、オンラインで読んだほとんどの記事は、同じ時系列内の異常ポイントを検出しています(ある時点で、そのタイヤのトルク値が正常でない場合)。

どの2つのタイヤが異常な動作をしているのかを検出するために、クラスタリング手法、基本的にはk-meansクラスタリングを使用してみました(監視されていないため)。

k-meansクラスタリングにフィードするデータを準備するために、各時系列(各タイヤについて)について計算しました。

  1. 最大の振幅(差)を持つ隣接する極大と極小の上位3セット
  2. トルク値の平均
  3. トルク値の標準偏差

また、クラスターの数を2のみに設定したので、クラスター1または2のいずれかです。

したがって、(クラスターを割り当てた後の)最終結果は次のようになります。

        amplitude  local maxima  local minima  sig_value_std  \
tire_0     558.50        437.75       -120.75      77.538645   
tire_0     532.75        433.75        -99.00      77.538645   
tire_0     526.25        438.00        -88.25      77.538645   
tire_1     552.50       -116.50        436.00      71.125912   
tire_1     542.75        439.25       -103.50      71.125912   

        sig_value_average  cluster  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_1          11.588038        1  
tire_1          11.588038        0 

今、私はこの結果をどうするかについて質問があります...したがって、最大の振幅が3つのローカル最大/最小の上位3ペアを選択したため、各タイヤには3行のデータがあります。クラスターに割り当てられ、場合によっては1つのタイヤでも異なるクラスターに割り当てられます。また、クラスタサイズは通常2より大きいだけです。

私の質問は:

  1. 個々のデータポイントだけでなく、「時系列のセット」に関する異常検出を行う方法は?
  2. 私のアプローチは合理的/論理的ですか?もしそうなら、私は自分の結果をクリーンアップして欲しいものを手に入れることができますか?そうでない場合、改善するにはどうすればよいですか?

回答:


1

かなり興味深い質問です!

最初に、あなたの質問は標準的な用語では少し不明確だったので、私の編集を見てください。時系列のセットがあり、異常値(異常)を検出したい。

  1. あなたのアプローチはかなり明確で論理的であり、問​​題と解決策の理解を示しています。重要なのは、それを適用するために選択した方法についてです。
  2. K-meansは最良の方法ではありません。ここでは2つのクラスターの選択が非常に賢明であることを指摘しておきます。クラスターが正常/異常構造に基づいて形成されることを期待しているからです。時系列から抽出した機能が異常な動作を妨げていない場合、実際にはうまく機能しません。
  3. 私は埋め込みアルゴリズムがそうする正しい方法だと思います。おそらく、単純なPCAを適用すると、異常な時系列がどこか他の場所よりも離れて表示されます。怒鳴る私はコードを書きます。試してみて、うまくいかなかった場合は連絡してください。より洗練されたソリューションを探します(たとえば、位相空間を作成してそこにデータを表示したり、時系列の繰り返しを監視したりできます)。
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_new = pca.fit_transform(X)
plt.figure(figsize=(10,10))
plt.plot(X_new[:,0],X_new[:,1],"*")
plt.show()

ここで、Xは、各行が1つの時系列である10xN行列です。

PCAのコンポーネントをさらに選択し、異なるPCを相互にチェックすることができます。

とにかく問題はそれほど難しくなく、それがうまくいかなかった場合は別の解決策で私の答えを更新します。

お役に立てば幸いです。


こんにちはカスラ!助けてくれてありがとうございます!私はあなたの方法を試してみました、そして私はあなたの方法の1つの不足/制限に気づきました...それはあなたのアプローチが私が使用しているすべての時系列データセットが同じ数のデータポイントを持っていると仮定しているということです、そうではありませんここに...他の提案はありますか?:(
alwaysaskingquestions 2018年

それがうまくいったなら、あなたが回答に賛成票を投じる/受け入れるなら確かに。最初の段階では、時系列をクリップします。最短の時系列と同じサイズになるようにカットします。それでも問題が解決しない場合は、ここにコメントを追加してください。
Kasra Manshaei

こんにちはKasra、データを失いたくない。データをカットしないことは可能ですか?全部使いたいです。
alwaysaskingquestions 2018年

したがって、時系列の末尾を最後の値に置き換えます。試してみて、うまくいったかどうかお知らせください
Kasra Manshaei

それは基本的にデータを変更しませんか?cuzは、短いデータセットに付加価値を付けています。(私に我慢してくれて本当にありがとう!)
alwaysaskingquestions 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.