【Python/NumPy】特異スペクトル変換法で時系列データの異常検出

Python/NumPyで特異スペクトル変換法を実装し、時系列データの異常部位を検出する方法について紹介します。

特異スペクトル変換法による時系列データの異常検知

特異スペクトル変換法では、時系列データの変化点を検出する手法の1つです。アルゴリズムの流れは以下のとおりです。

① ある時点$t$を起点とし、その前の$w$時点分のデータ(部分時系列データ)を1時点ずつ前にずらす。
② それを$k$個だけ束ねた($X_i$)と、そこからL時点分後ろにずらして同様に$k$個だけ集めたもの($X_{i+1}$)を比較する。($X_i$は、1行につき窓幅$w$時点分のデータが並び、さらにそれを$k$行分束ねるため、$k\times w$の行列となる)
③ $X_i$と$X_{i+1}$が類似していれば、t時点は変化点でない、逆に大きく異なっていれば変化点であると判別する。類似度の計算には特異値分解を用いる。

$$ \alpha(t) = 1- ||U_m^{(t)T}Q_m^{(t)T}||_2^2 $$

サンプルコード① NumPyによる実装例


実行結果

今回は心電図データセット(http://www.cs.ucr.edu/~eamonn/discords/)を使っています。異常を含む区間で異常度が高くなりました。

関連ページ

【Scikit-learn超入門】使い方とサンプルコードを解説
Pythonライブラリ「Scikit-learn」で機械学習を行う方法を解説します。
この記事を書いた人
西住技研

Python使用歴10年以上。研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
NumPy

コメント