mikutaifukuの雑記帳

個人的な雑記帳。データ分析とか読んだ本の感想とか。

Fitbitの心拍数データで異常検知 〜特異スペクトル変換法による変化点検知〜

概要

前回の記事に引き続き「入門 機械学習による異常検知―Rによる実践ガイド」を参考に、自分のFitbitの心拍数データを使って7章の時系列データの異常検知をやってみました。前回は近傍法を用いましたが、今回は特異スペクトル変換法で変化点検知をやってみます。似たような記事は他にも色々あり*1、二番煎じではありますが自分なりにまとめてみます。

使用データについて

前回の記事と同様に、Fitbitの睡眠時心拍数データを使用しています。

詳細は以下を参照してください。

mikutaifuku.hatenablog.com

変化点検知とは

前回は外れ値検出でしたが、今回は変化点検知という問題になります。前回は以下の図でいうと赤◯の部分を検出することが目的でしたが、今回は青◯の部分を検出することが目的となります(多分この認識であっているはず…)。

f:id:mikutaifuku:20180207175241p:plain

特異スペクトル変換法による変化点検知

計算イメージ
  • 各時刻の観測値をそれぞれ扱うのではなく、w個の隣接した観測値をw次元のベクトルとして表します。
  • 時刻tの周りに、過去側と現在側において、k本の部分時系列データを使って、履歴行列X1とテスト行列X2を作ります。
  • 行列X1、X2に対して特異値分解を行い、上位m個の左特異ベクトルの行列を求めます。
  • 得られた行列から時刻tにおける変化度を計算します。

ここでは計算の流れを書いただけですので、詳細は書籍や上で紹介した記事を参考にしていただければと思います。ここの内容を理解するには基本的な線形代数の知識が必要です。

イメージ図(参考:「入門 機械学習による異常検知―Rによる実践ガイド」P.200)

f:id:mikutaifuku:20180207181243p:plain

具体化したイメージ図

f:id:mikutaifuku:20180207181307p:plain

図を見てわかる通り、時刻tの変化度を求める為には、t + L - 1までのデータが必要となります。したがって、よりリアルタイム性を求めるのであれば、窓幅wを小さくしたり、ラグLを小さくしたりする等、各パラメータを調整する必要があります。

結果

変化度の計算結果を以下に示します。前回の近傍法と比較して、とても綺麗に異常部位が検出されました。ただ、よく見ると変化点を若干遅れて検知していることがわかります。これはパラメータを調整することで改善できる部分もありますが、アルゴリズムの都合上限界がありそうです。  

f:id:mikutaifuku:20180207205043p:plain

計算できる範囲やリアルタイム性を考えると、一番下のw = 5, m = 2, k = 3, L = 2のパターンが良さそうです(私見)。

書籍にも書いてあるように特異スペクトル変換法は

  • 計算コストが高い
  • 確率分布からの意味づけがはっきりしない

という課題が挙げられています。ということで、これらを踏まえて次回は、同じデータに対して「自己回帰モデルによる異常検知」を実践してみようと思います。

さいごに

今回のエントリでは、Fitbitの心拍数データに対して、特異スペクトル変換法によるアプローチで変化点を検出しました。

RやPythonのプログラムも公開したいところですが、人様に見せるのが恥ずかしいレベルなので今回も諦めました。そのうち、コードを綺麗に書き直してアップしたいと思います。

今までは本を読むだけで満足していましたが、ブログにまとめることで思考が整理させれ、頭に定着しやすいような気がします。今後もサボらずに定期的に記事を書いていきたいです。

 

※ 何か間違いがございましたらご指摘ください。

mikutaifuku