読者です 読者をやめる 読者になる 読者になる

異常検知本の読書メモ Part 2(方向データの異常検知と部分空間法による変化検出)

方向データの異常検知

方向データの異常検知は前回スキップしていたところ。部分空間法による変化検出をするときに方向データに関する知識が必要になったので、戻ってきた。

方向データを扱う際にキーになる分布はフォンミーゼスフィッシャー分布。こんな分布知らんがなと思ったんだけど、実はPRMLの2章にこっそり出てきている。方向データとか球面上の確率分布と言われてもよく分からなかったので、少し調べた。説明としては以下のサイトの説明が一番しっくりきた。

データに対して特徴量を正規化(ノルムが1になるようにする)すると、データは単位円上のどこか一点に対応する。よく出てきそうな特徴量は似たようなところに固まる。そうすると単位円上のよく出てくるところは確率密度が高くなるので、棒が高くなる(wikipediaの図)。フォンミーゼスフィッシャー分布は感覚的にはガウス分布と似ていて、平均と分散相当のパラメータ(平均方向と集中度)を持っている。平均方向が単位円上の分布でどこが高くなっているかを表わしていて、集中度は平均方向からどれくらい離れうるかを記述するパラメータである。

これをどうやって数式で表現するか。フォンミーゼスフィッシャー分布はベッセル関数が入っているので、異常に難しく見えるが正規化項をCを置くと理解しやすくなる。フォンミーゼスフィッシャー分布の確率密度関数はf(\mathbf{x}) = C \exp{(k {\mu}^T \mathbf{x})}である。ここで、\mathbf{x}はノルムが1のd次元ベクトル、\muはノルムが1の平均方向のパラメータ、kは集中度を表わすスカラーのパラメータである。\mu\mathbf{x}を考えるので、これらが同じ方向を向いていると値が大きくなる(確率密度が高い)。また、kが大きいとピーキーな分布になるということを表わしている。

本に書いてあるパラメータの推定方法は最尤推定*1。ノルムが1の制約も入れてラグランジュの未定乗数法で解くと平均方向のパラメータについては学習データの平均を正規化したものになる。集中度パラメータkについてはclosed-formで解くことができないので、解きたければ勾配法とかで頑張ることになる。本の中では異常検知と合わせてkもどうにかする方法が書いてある。

最尤推定ができてパラメータが得られたら、方向データに関する異常度を決めたい。a(\mathbf{x}^{\prime}) = 1 - \hat{\mu}^T \mathbf{x}^{\prime}となる。また、異常度に基づく警報を出すためには異常度の確率分布がどのようなものになっているかを計算する必要がある。詳細は終わないが、計算していくとこの確率分布は近似的にカイ二乗分布であることが分かる。

部分空間法による変化検出

これまでの章はpoint-wiseにデータが異常かどうかを判断していたが、ここからはpoint-wiseではなく時系列でデータを見て異常かどうかを判断する。本では累積和法と近傍法について書いてあるが、データに対する事前知識や自己一致をしないようにする工夫が必要なので、省略する。スライド窓でずらして新しくデータを作るというアイディアだけあれば十分。

部分空間法では過去側と現在側の2つに領域を分割し、それぞれに対し確率分布を考える(後述)。ある時刻tにおいて、過去側と現在側の確率分布の相違度を計算して、それを変化度としよう、というのが部分空間法の主な考え方。

時刻tにおける過去側と現在側の確率分布の相違度を計算するためにKLダイバージェンス(尤度比の対数の期待値)を使う。KLダイバージェンスを計算するためには密度比が必要である。カーネル密度推定などの方法もあるが、ここではフォンミーゼスフィッシャー分布を使う。時系列データはそのまま使うとノイズが多いので、ノイズを抑えつつ典型的な波形を表わす何かが得られる(後述)として、その確率変数をzで表わす。zに対し、過去側と現在側の確率分布を考え、方向ベクトルは最尤推定したもの、集中度パラメータは同じと仮定するとKLダイバージェンスは綺麗な形で出てくる。

a^{(t)} \propto k (1 - {{\mathbf{u}}^{(t)}}^T \mathbf{q}^{(t)})

過去と現在の部分集合の特徴のパラーンが同じ場合は異常度0になり、直行しているときに最大となる。

今回はデータの典型的な波形を確率変数ベクトルzで表わしたが、実用的には特徴的なパターンは複数本あったほうが現実を反映できる。さて、問題は時系列特有のノイズを抑えつつ、データの典型的な波形を表わすベクトルを複数個どうやって得るかということになる。答えから行くと特異値分解(SVD; Singular Value Decomposition)をすればよいということになるが、本では「特徴的なパターンはデータの線形和で書き表わせるとして、(一番人気度を高める方向に)その係数を求める問題を考えると、特異値分解に辿り着く」ということが丁寧に書いてある。私としては雑に「元のデータからノイズを減らして複数個ベクトルを得たいんだから特異値分解使うよ」と言ってくれてもよかったかなという気分ではある。大雑把な人間なので...。

特異値分解で複数個の特徴的なベクトルが得られたら、式(9.9)を行列のノルムを使って自然な拡張として書き表わすことができる。これまでに説明した方法のことを特異スペクトル変換という。特異スペクトル変換を使うと、時系列データに対して変化点の検出をすることができる。

本の中では特異スペクトル変換はそのまま使うと特異値分解が重すぎて辛いので楽できる方法が紹介されているが、概要が知りたかったので、この辺で終わります。

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

*1:ベイズだとどういう事前分布を置くのかな