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

不定期ML&NLP報#4

機械学習 自然言語処理 不定期ML&NLP報

最近の機械学習&自然言語処理に関する情報をまとめるコーナーです。前回はこちら。このエントリ忘れてるよというのがありましたら、たれこみフォームから教えてもらえるとうれしいです。

論文

  • [1701.07875] Wasserstein GAN
    • GANを含む生成系のタスクは難しいことが知られているが、学習時に使う距離をWasserstein距離というものを使うと学習が安定したという話

ブログ/勉強会資料

speakerdeck.com

機械学習モデルのバージョン管理をするstarchartというツールは知らなかった。解説記事もあった。

speakerdeck.com

機械学習というよりはログ基盤的な話。

www.slideshare.net

ビジネス

学会/勉強会

NIPS読み会

Kaggle Tokyo Meetup #2

全脳アーキテクチャ若手の会

AAAI2017

その他

機械学習のための連続最適化 (機械学習プロフェッショナルシリーズ)

機械学習のための連続最適化 (機械学習プロフェッショナルシリーズ)

  • 作者: 金森敬文,鈴木大慈,竹内一郎,佐藤一誠
  • 出版社/メーカー: 講談社
  • 発売日: 2016/12/07
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
関係データ学習 (機械学習プロフェッショナルシリーズ)

関係データ学習 (機械学習プロフェッショナルシリーズ)

研究開発の実験に使えるホスト名の一覧をMackerelを使って素早く取得する

Mackerel Go

最近は仕事でサーバーの監視を行なうサービス開発(Mackerelチームに所属しています)の開発をしていますが、1年ほど前までは大学の研究室や企業の研究所で自然言語処理や機械学習の研究を行なっていましたid:syou6162です。研究開発における実験をするときにMackerelをこういう使い方をすると便利かも?というのがあったので、紹介します。

研究開発の実験あるある

研究では計算機をがしがし使って実験を行なうのですが、それらの計算機は当然一人で使うわけではなく、みんなで使います。他人がガンガン実験しているホストに途中からジョブを投下するのは迷惑ですし、実験によってはメモリが大きいマシンでないと実行できないなど、実験の前にあれこれ確認すべきことがあります。前職では例えばGangliaを見ながら

  • memoryが64GB以上積んでる
  • load averageが1以下

などの条件に合うホストを探して、GXPでホストを指定し、パラメータ変えて実験をぶん回すというのをよくやっていました。

しかし、実験をやる度にGangliaで計算機の混み具合を確認して…というのは率直に言って面倒でした。条件を指定したら使えるホスト名のリストを返して欲しいです。これを行なうシェルスクリプトを書いてはいましたが、サーバーの購入や撤退などによりホスト名のリストを定期的に更新する必要があるのもよくない点でした。

Mackerelを使って楽をする

Mackerelはサービスやロールといった概念でホストをまとめて監視することができます。例えば自分が所属しているグループでホストをグルーピングしたり、深層学習用のGPUのホストをまとめてみたり、といった形です。ホストにメタデータを登録、取得することができるので、それを使うのもいいかもしれません。その上でload averageが閾値以下のホストで条件付けして一覧を取得する、といったことがMackerelだと簡単にできます。サーバーのセットアップのついでにmackerel-agentも仕込んでおくようにする(ワンライナーでインストールできます)と、ロールに所属するホストの一覧などはMackerelのapiが返してくれるので、手元に一覧を持っておく必要はなくなります。これにより、実験に使えるホストをさくっと探すといったことができるようになります。

実例(Go言語による簡単なスクリプト)

例として"My-Machine"というロールに所属しているホストの中でload averageが1以下のホスト名のみを取得するというのをやってみましょう。Mackerelではコマンドラインツールや各種言語のライブラリ(下のはほんの一部)がOSSで用意されているので、それを使うと簡単です。

今回は私が最近Goに入門中なので、Goのライブラリを使ってみます。ちなみにGoのライブラリは最近のリリースで出たグラフアノテーションに対応しています:)

さて、さっそくコードです。以下のコードをgo run find_hosts_for_experiments.goといった形で動かすと条件に合うホスト名が出てくるので、あとはこれをgxpなどに投げればよいだけです。

 package main

 import (
     "fmt"
     mkr "github.com/mackerelio/mackerel-client-go"
     "os"
 )

 func main() {
     client := mkr.NewClient("YOUR_MACKEREL_API_KEY")
     // collect host names
     hostCandididates, _ := client.FindHosts(&mkr.FindHostsParam{
         Service: "My-Machine",
     })
     var hostIDs []string
     for _, h := range hostCandididates {
         hostIDs = append(hostIDs, h.ID)
     }

     // get metric values
     metricValues, err := client.FetchLatestMetricValues(hostIDs, []string{"loadavg5"})
     if err != nil {
         os.Exit(0)
     }

     // filter hosts by loadavg5
     for _, h := range hostCandididates {
         hostID := h.ID
         loadavg5, ok := metricValues[hostID]["loadavg5"]
         if !ok {
             continue
         }
         if loadavg5.Value.(float64) < 1.0 {
             fmt.Println(h.Name)
         }
     }
 }

ロールに所属するホストの一覧を取得して、そのホストのloadavg5も取得、それらが1以下なら出力するだけという簡単なものです。Rubyでも似たようなことが簡単にできると思います。

まとめ

Mackerelはサーバーの監視や状態の通知を簡単に行なうことができるので、それ自体はもちろん便利ですが、ホストの情報を使うことで研究開発を少し便利にすることができるという例を紹介しました。

Go言語に入門する

Go

先週末、仕事で東京に行く機会があって、往復の新幹線の中でまとまった時間が取れるなと思ってGo言語に入門していました。Go言語に入門する理由は

  • 仕事で普通に使う(mackerel-agentなど)
  • 職場で評判がいい
  • 一年に一個は新しい言語を勉強しようっていうアレ

などなどです。本やtour of goを読むだけだとあまり頭に入ってこないので、複雑過ぎず簡単過ぎない例をやろうということで平均化パーセプトロンで二値分類を書きました(ファイルの読み込み、文字列操作、スライス、Mapの基本的な操作、structの使い方などがちょっと身に付く)。Perlに再入門、Scalaを勉強するときもこのネタだったので、定番になってきつつある。コードはこの辺に置いてます。

ちょっと困った箇所

失敗するかもしれない計算の戻り値の型

scalaでいうところのOption[XXX]を返したい。結論から言うと(x *XXX, err error)を返すのがよさそう(XXXはstructを想定)。計算がちゃんとできたときはreturn &x, err、失敗したときにはreturn nil, errを返すという感じ。ポインタ型だとゼロ値がnilなので、参照ではなくポインタを返すことが多いらしい。

一行が長すぎるとreadlineで失敗する

この辺。20newsをデータでやっていたら一行の入力が長すぎて失敗するときがあった。isPrefixで行末いくまで待つ、というのが解決法っぽい。

ほぼ初めての言語を新幹線のオフライン環境でやるための工夫

新幹線でなければ普通にぐぐればいいんだけど、新幹線だとぐぐれず困ることがあるだろうということで前日に準備した。

オフラインでTour of Go

Tour of Goに基本的な概念がまとまっていてよいのだが、オフラインで見れないので見れるようにする。ローカルでサーバーが立つので、それで解決。

go get golang.org/x/tour/gotour
~/go/bin/gotour

Emacs、REPL

この辺のツールがひたすら充実している。go-mode入れて、godefとかを入れておくと関数の定義元にさっと行ったり、変数の型、関数の引数/戻り値の型がさっと見れて最高だった。ensimeを動かすのに結構苦労したあの時間は何だったんだろうという簡単さ。

dashでドキュメントを見る

Tour of Goは目次はあるけど、検索ができないのでdashで引けるようにする。Emacsからサクっと引けるので最高だった。

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

不定期ML&NLP報#3

機械学習 自然言語処理 不定期ML&NLP報

最近の機械学習&自然言語処理に関する情報をまとめるコーナーです。前回はこちら。このエントリ忘れてるよというのがありましたら、たれこみフォームから教えてもらえるとうれしいです。

論文

ブログ/勉強会資料

ビジネス

ペパボのログ解析。データの収集、可視化、パス分析をやった結果をどう施策に活用していくか(離脱ユーザーへのリテンション)。

学会/勉強会

WebDB Formでの発表資料。深層学習を使った間取りの生成、物件画像の分類(玄関、居間、キッチン、トイレなどの分類)など。不動産物件のデータセットの提供もあって熱い。

NIPS2016

NL研

招待講演の酒井先生の発表資料。うーん、あまりできていないので耳が痛い...。情報アクセス評価方法論を出されたようなので、これを読んでみるとよさそう?

coling2016

第8回入力メソッドワークショップ (IM 2016)

毎年年の瀬に行なわれているIME関係の集まり。来年はきっと京都であると思うので、参加したい。

その他

機械学習のための連続最適化 (機械学習プロフェッショナルシリーズ)

機械学習のための連続最適化 (機械学習プロフェッショナルシリーズ)

  • 作者: 金森敬文,鈴木大慈,竹内一郎,佐藤一誠
  • 出版社/メーカー: 講談社
  • 発売日: 2016/12/07
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
関係データ学習 (機械学習プロフェッショナルシリーズ)

関係データ学習 (機械学習プロフェッショナルシリーズ)

異常検知本の読書メモ Part 5(密度比推定による変化検出)

機械学習 異常検知

前回に引き続き、密度比を直接推定するコーナー。時系列の変化検出や多変数の依存関係の崩れを捉える構造変化検知の手法を密度比推定で解く。

変化検知問題とカルバックライブラー密度比推定法

変化検知問題は第9節で取り扱った。ある時点tを含む前後で分布がどれくらい異なるかの異常度をはかりたいというのがやりたいことであった(分布変化検知とも呼ばれる)。

式(9.8)a^{(t)} \propto k (1 - {{\mathbf{u}}^{(t)}}^T \mathbf{q}^{(t)})では、前後それぞれ確率密度のパラメータ(uとqがそれ)を計算したが、密度比推定ではそれぞれのパラメータを推定するのではなく、KLダイバージェンスを用いて直接密度比を推定する。これは勾配法を使って簡単に解くことができ、(12.3)式

\alpha(D, D^\prime) = \frac{1}{N} \sum_{i=1}^N \log \hat{r}(\mathbf{x}_i)

のように異常度が計算できる。

KLダイバージェンスの問題点と代替のダイバージェンス

↑のKLダイバージェンスを用いた方法で問題が全て解決すればよいのだが、なかなかそうはいかない。KLダイバージェンスによる異常度は対数関数が入るため、0周辺で微小な変化が敏感に捉えられる反面、ノイズの影響を受けやすく、特にセンサーデータなどでは困ってしまう。そこで、代替となるダイバージェンスがいくつかある。

  • ピアソンダイバージェンス
    • (t-1)2という形をしており、対数関数を含まないためKLダイバージェンスよりロバストに動く
  • 相対ピアソンダイバージェンス
    • 割り算の分母が0になるときがあるので、それをなまして使おうというアイディア
    • 分母がp^\prime(\mathbf{x})だったものを\beta p(\mathbf{x}) + (1 - \beta p^\prime(\mathbf{x}))と置き換える
    • 最小二乗密度比推定と同じような形で閉じて解が得られる
    • ハイパーパラメータのβが増えているので、チューニングの手間は増える

確率分布の構造変化検知

次に、第10章でやった疎構造学習による異常検知(特に異常解析や構造変化検知)を密度比推定で解く。

疎構造学習によってDとD'でそれぞれ確率密度を推定することができるが、実は以下のような問題がある。

  • 構造変化検知をするためにDとD'でそれぞれ精度行列を求めると、本当は辺の重みが変化していない場合でもそれぞれの推定誤差により変化したと検知してしまう場合がある

これをどうにか防ぎたい。ここで、変化前後の密度比が

\frac{N(\mathbf{x} | 0, \Lambda^{-1})}{N(\mathbf{x} | 0, {\Lambda^\prime}^{-1})} \propto \exp(- \frac{1}{2} \mathbf{x}^T (\Lambda_{m, m^\prime} - \Lambda_{m, m^\prime}^\prime) \mathbf{x})

と書けること(式(12.6))に注目する。これから、正規分布による密度比推定をデータから推定することで精度行列の差が直接推定できる。規格化条件を自動的に満たすようなパラメトリックなモデルとして

r_\boldsymbol\Theta(\mathbf{x}) \propto \exp(- \frac{1}{2} \mathbf{x}^T \boldsymbol\Theta \mathbf{x})

を考える(正規化項書くの面倒なのではしょった)。このモデルを元に、pとrp'のKLダイバージェンスを考え、L1の正則化付きで最適化問題として定式化できる。その最適化問題の解き方は元論文を参照のこと。こいつを使うと誤検知を減らすことができる。

また、理論的な解析もAAAI2015でされているらしく、密度比で構造変化検出する方法に必要なサンプル数は、グラフ全体のの辺の数ではなく変化した辺の数によって決まるらしい(そんなに変化してなければサンプル数がオーダー的にはそんなにはいらないということか)。

疎密度比推定の高次拡張

ガウス型のグラフィカルモデルでは共分散相当の構造(つまり二次まで)しか見ることができないが、非線形な特徴ベクトルを使うとより高次の関係も捉えることができる。少しこみいっているが、定式化の手順はさほど変わらずシンプルにできる。

参考

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

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

入門 機械学習による異常検知―Rによる実践ガイド

入門 機械学習による異常検知―Rによる実践ガイド

異常検知本の読書メモ Part 4(密度比推定による異常検知)

機械学習 異常検知

前回扱った内容を密度比推定により直接的にかっこよく解く。

やりたいこと

  • 正常であると分かっているデータを元に異常が含まれるかもしれないデータの中から異常な標本を見つけ出す
    • 個々に外れ値検出するのではなく、テストデータ全体の確率分布も考える
    • 全体を考えることでノイズを減らせるのではないか、という期待がある

やる方法としては、密度比を基底関数の線形モデルで表わし、KLダイバージェンスなり、最小二乗の考え方で目的関数に落とし込んで線形モデルのパラメータを求める、というもの。割とシンプル。

密度比による外れ値検出問題の定式化

正常なデータ集合Dと異常標本が混入しているかもしれないデータ集合D^\primeが与えられているとする。ネイマンピアソン決定則によると\mathbf{x} \in D^\primeに対する異常さの度合いと表わす尺度として、a(\mathbf{x}) = - \log r(\mathbf{x})を自然に考えることができる(ただし、r(\mathbf{x}) = \frac{p(\mathbf{x})}{p^\prime(\mathbf{x})}で、p^\prime(\mathbf{x})はテストデータが従う確率密度)。

密度比のふるまいについてまとめる。D^\primeにおいて、異常標本の割合を\alphaとすると、連続性など適切な条件を満たせばp^\prime(\mathbf{x}) = (1 - \alpha)p(\mathbf{x}) + \alpha \tilde{p}(\mathbf{x})のような形を仮定できる(\tilde{p}(\mathbf{x})はpとp^\primeの差に対応する規格化条件を満たす関数)。これを使うと密度比は

r(\mathbf{x}) = \frac{p(\mathbf{x})}{(1 - \alpha)p(\mathbf{x}) + \alpha \tilde{p}(\mathbf{x})} = \frac{1}{(1 - \alpha) + \alpha \frac{\tilde{p}(\mathbf{x})}{p(\mathbf{x})}}

と表現できる。

  • 正常なxに対しては\frac{\tilde{p}(\mathbf{x})}{p(\mathbf{x})}が1より小さい値を取る
  • 異常なxに対しては\frac{\tilde{p}(\mathbf{x})}{p(\mathbf{x})}は1より大きな値を取る

↑より、以下のことが分かる。

  • 正常なxに対しては密度比r(\mathbf{x})が大きな値を取る
  • 異常なxに対しては密度比r(\mathbf{x})が小さな値を取る

また、密度比は 0 \leq r(\mathbf{x}) \leq \frac{1}{1 - \alpha}なので、\mathbf{x}^\primeに対する異常度は\log (1 - \alpha) \leq a(\mathbf{x}^\prime) \lt \inftyを満たす。実用上、異常標本の割合は1より圧倒的に小さいので、左辺は- \alphaで近似でき(0周辺でテイラー展開)、これが異常度の近似的な下限となる。これより、異常度が\alphaのオーダーより非常に小さい場合は異常が疑われる、ということになる。

ここで問題になることが1つあって、p(\mathbf{x})p^\prime(\mathbf{x})の推定には誤差が必ず含まれ、割り算によってその誤差が増幅されてしまうということ。今回欲しいのは異常度a(\mathbf{x}) = - \log r(\mathbf{x})であるから、個々の分布が分からなくても密度比が分かればそれでよい。バプニックの原理から密度比を直接的に求めていくことを考えよう。

カルバックライブラー密度比推定法

密度比を表わすモデルとして線形モデル

r_{\boldsymbol\theta}(\mathbf{x}) = \sum_{j=1}^b \theta_j \phi_j(\mathbf{x}) = {\boldsymbol\theta}^T \boldsymbol\phi(\mathbf{x})

を仮定する。ただし、\boldsymbol\phi(\mathbf{x})はb次元の非負値を取る基底関数、\boldsymbol\thetaはb次元のパラメータである。このような仮定を入れると、密度比推定はパラメータ\boldsymbol\thetaの推定問題に落ちる。あとは、その目的関数を決めてやればよいが、以下のような基準を考えることができる。

  • パラメータ\boldsymbol\thetar_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x})p(\mathbf{x})にできるだけ近くなるように
  • r_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x})は非負値で規格化条件を満たす

これらを満たす基準として、非負関数fとgの情報理論的な距離を測る一般化カルバックライブラーダイバージェンス

\mbox{gKL}(f||g) = \int f(\mathbf{x}) \log \frac{f(\mathbf{x})}{g(\mathbf{x})} d \mathbf{x} - (\int f(\mathbf{x}) - g(\mathbf{x}) d \mathbf{x})

を考える(これの気持ちはよく分からない...)。fとgにp(\mathbf{x})r_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x})を代入すると

\mbox{gKL}(p||r_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x})) = \int p(\mathbf{x}) \log \frac{p(\mathbf{x})}{r_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x})} d \mathbf{x} - 1 + \int r_{\boldsymbol\theta}(\mathbf{x}) p^\prime(\mathbf{x}) d \mathbf{x}

となる。上の式の期待値を経験分布で近似して、定数項を無視すると、以下の目的関数の最小化を考えればよいことになる。

J(\boldsymbol\theta) = - \frac{1}{|D|} \sum_{x \in D} \log r_{\boldsymbol\theta}(\mathbf{x}) + \frac{1}{|D^\prime|} \sum_{x \in D^\prime} r_{\boldsymbol\theta}(\mathbf{x})

第一項は異常度の期待値なので、異常度の期待値を最小化したいということを表わしていて、第二項は規格化条件を表わしている。

なお、本では一般化カルバックライブラーダイバージェンスの最小化で定式化されているが、元の論文ではカルバックライブラーダイバージェンスに正規化項等を陽に制約に加えた最適化問題を解いているので、理解する分には制約付きのカルバックライブラーダイバージェンスの最小化と思って普通に問題ない。

パラメータの最適化

J(\boldsymbol\theta)の最小化は凸最適化問題なので、勾配法などで求めることができる。基底関数は例えばRBFカーネルを使うことができる。RBFカーネルのバンド幅は交差検定によって求めることができる。

最小二乗密度比推定法

カルバックライブラー密度比推定法では目的関数を一般化カルバックライブラーダイバージェンスに置いたが、他の目的関数を置くことももちろんできる。ここでは最小二乗の考え方でやっていて、正則化項を付け加えても閉じた形でパラメータを求めることができる。閉じた形で表わせる分計算としては楽だが、KLダイバージェンスを最小化した場合で得られた解との性質の違いは後で抑えておきたい。

参考

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

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

入門 機械学習による異常検知―Rによる実践ガイド

入門 機械学習による異常検知―Rによる実践ガイド

異常検知本の読書メモ Part 3(疎構造学習による異常検知)

機械学習 異常検知

前回の復習

前回のChaper 9では「単一の」「時系列データ」に対し、部分空間法を使った変化検出法を見た。

概要はこんな感じであった。

  • 小さいwindow幅でデータを切って、ベクトルデータにする
  • 過去側と現在側の2つに領域に分割
  • 時刻tにおける過去側と現在側の確率分布の相違度を計算するためにKLダイバージェンス
    • 確率分布としてフォンミーゼスフィッシャー分布を採用
  • 小さいwindow幅で切られたデータはノイズが多いので、そのままでは役に立たない
  • ノイズを減らして特徴的なベクトルを得るために特異値分解を使う

多変量の変数間の依存関係の崩れを検知 => 対マルコフネットワーク

Chaper 10ではデータの時系列的な関係は無視するが、「多変量の変数間の依存関係の崩れ」を検知することを目標とする。変数間の関係は対マルコフネットワーク(pairwise Markov network)を使って捉える。pairwiseなので3変数以上の相関は考えない。対マルコフネットワークで依存関係を表わすので、変数間に関係があればネットワークにエッジがあり、関係なければエッジがない。

直接相関と間接相関の区別

変数間の関係を表わす際に重要なことは直接相関と間接相関の区別である。これを区別しないと、教会の数と殺人事件には関係があるということになってしまう(間接相関)。都市の人口といった仲介している変数があるので、それらを条件付けた上で関係があるかを考えなければならない(直接相関)。

間接相関では他の変数からも来る間接的な依存関係表現する。周辺化の操作をする。

p(x_1, x_2) = \int \cdots \int p(\mathbf{x}) d x_3 \cdots d x_M

直接相関では、他の変数を条件付けた2つの変数間の関係のみを切り出して表現する。

p(x_1, x_2 | x_3, \cdots, x_M) = \frac{p(\mathbf{x})}{p(x_3, \cdots, x_M)}

正規分布に基づく対マルコフネットワーク

対マルコフネットワークを考える際も直接相関を考えたいが、上で見たように条件付き分布をよく考えることになる。モデル化するなら、条件付き分布が簡単になる分布を選びたい。正規分布は他の変数条件付けた残りの変数も正規分布になるというよい性質があるので、正規分布を使ってマルコフネットワークをモデル化する。

ラプラス分布によるsparse化

変数間のエッジが多いと解釈がむずかしいので、ネットワークはなるべく疎(sparse)になっていたほうがうれしい。疎なネットワークにするために精度行列の事前分布としてラプラス分布を採用する。ラプラス分布を採用した上で、MAP推定でパラメータを求める。実際の手順は少し込みいっているが、基本的にはブロッック座標降下法(block coordinate descent)でいける(1つの変数に着目し、それ以外の変数を固定して最適化を繰り返す)。

疎構造学習に基づく異常度の計算

疎構造学習を使って異常を見つけることを考えた場合、以下の2つの問題設定が考えられる。

外れ値解析の場合

正常時のデータ(D)を使って確率分布p(x|D)が得られたとする。新しくデータx^\primeが手に入ったときに、x^\primeの各変数の異常度は

a_i(\mathbf{x}) = - \log p(x_i^\prime | \mathbf{x}_{-i}^\prime, D) = \frac{1}{2} \log{\frac{2 \pi}{\Lambda_{i,i}}} + \frac{1}{2 \Lambda_{i,i}} (\sum_{j=1}^M \Lambda_{i,j} x_j^\prime)^2

として書ける。どのデータが異常だった(外れ値検出)というだけでなく、どの変数の振舞いがおかしいかまでやるという意味で外れ値解析と本書では呼ばれている。

異常解析の場合

↑の外れ値解析の場合とは異なり、正常なデータ集合Dとテストのデータ集合D^\primeが得られたとする。DとD^\primeの間でどの変数にどれくらい食い違いがあるかを考えたい、というのが異常解析の問題設定である。ここまでの議論を考えると、変数毎に確率密度比の期待値を考えて

a_i = \int \int \log{\frac{p(x_i^\prime | \mathbf{x}_{-i}^\prime, D)}{p(x_i^\prime | \mathbf{x}_{-i}^\prime, D^\prime)}} p(\mathbf{x}_{-i}^\prime | D) p(x_i^\prime | \mathbf{x}_{-i}^\prime, D)  d x_i^\prime d \mathbf{x}_{-i}^\prime

と定義できる。p(\mathbf{x}_{-i}^\prime | D)p(x_i^\prime | \mathbf{x}_{-i}^\prime, D)のカルバックライブラーダイバージェンスを考えたものともいえる。計算を頑張ると、これも簡単な形で計算できるようになる。

Chaper11以降では確率密度を構成する各要素を陽には考えず、密度比を直接求めるアプローチが紹介されている。

参考

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

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

入門 機械学習による異常検知―Rによる実践ガイド

入門 機械学習による異常検知―Rによる実践ガイド