Deep SVDDに基づく外れ値検知をPyTorchで実装した

はじめに

外れ値検知の機械学習モデルの一つとして"Deep SVDD" が知られている。 今回はこれを、異常検知/外れ値検知のためのPythonパッケージPyODの仕様に沿った形で、PyTorchにより実装したということである。

外れ値検知は1クラス分類と捉えることができ、「通常」クラスか「それ以外(=外れ値、つまり異常)」という分類が行われる。 "Deep SVDD"は、外れ値検知の既存手法であるOne-Class SVM / Support Vector Data Description (SVDD) の非線形カーネルニューラルネットワークで置き換えたものである。

準備

PyODはpipでインストール可能である。

pip3 install pyod

ほか、torch, sklearn, numpy, tqdmのインストールを済ませておく。

Deep SVDDについて

概要は以下の記事を参考するのが早いだろう(落合先生のフォーマット!)。 salty-vanilla.github.io

論文は以下から読むことができる(ICML2018)。 proceedings.mlr.press

ほか、参考となる記事とスライドを掲載する。 speakerdeck.com www.skillupai.com

ICLR2021ではDeep One-Class Classificationについて深い考察に基づいた拡張が提案されている。 openreview.net

作成したクラス:DeepSVDD

【コードを表示する】 gist.github.com

なお論文著者によるオリジナルのPyTorch実装は以下から入手できる。 github.com

本記事の実装は上記オリジナル実装のsimplified versionとみなせる。

デモンストレーション

PyODから提供されている各種アルゴリズムのexample用スクリプトを参考に、簡単なデモンストレーションのnotebookを作成した。 今回作成したDeepSVDDクラスをdeep_svdd.pyとして保存した場合のnotebookである。

gist.github.com

ひとまずうまくいっているように見える。

注意点

今回の実装では、ニューラルネット部分は全結合層のみからなっている。 画像データを対象にする場合には畳み込み層やプーリング層へと実装を修正する必要がある(『DeepSVDD_net』クラスの中身)。 この記事の読者ならば修正は容易だろう。

今後の課題

  • 実際の画像データ(MNIST, CIFAR-10)を用いたオリジナル論文の追試
  • 画像データへの対応

Pythonの異常検知パッケージPyODのフォーマットに従って、カーネル密度推定に基づく異常検知を実装した

はじめに

異常検知(外れ値検知)のための便利なPythonパッケージとしてPyODが存在する。

pyod.readthedocs.io

github.com

クラシックな手法から比較的最先端の手法まで実装されており、インタフェースも使いやすいのでオススメできる。

2021年8月9日現在、PyODにカーネル密度推定(Kernel Density Estimation; KDE)ベースの異常検知が実装されていなかったので、それを実装したということである。

PyODのインストール

pipでインストール可能である。

pip3 install pyod

異常検知について

以下の記事を読むのが良いだろう。 qiita.com

カーネル密度推定について

ばんくし氏の記事が参考になるだろう。 vaaaaaanquish.hatenablog.com

作成したクラス:KDE

すでに実装済のPyODの各種アルゴリズムを参考に、KDEのクラスを作った。 KDEの実装そのものはscikit-learnのKernelDensityクラスによった。 PyODのBaseDetectorを継承している。

【コードを表示する】 gist.github.com

異常検知デモンストレーションその1

PyODから提供されている各種アルゴリズムのexample用スクリプトを参考に、簡単なデモンストレーションのnotebookを作成した。 今回作成したKDEクラスをkde.pyとして保存した場合のnotebookである。

gist.github.com

異常検知デモンストレーションその2

引き続いて3つのガウス分布からランダムにデータをサンプリングし、異常値を混ぜて正しく検出できるかを試したnotebookである。

gist.github.com

おわりに

みんなPyOD使おうぜ!

MacOSのEmacsにEPWING形式の辞書を導入する

表題に関して、こちらを参考にした。

ただ同記事はUbuntu前提だったので、Macでの導入ログを残しておく。

1. EBライブラリをダウンロードしてインストール
- http://www.mistys-internet.website/eb/
- configure, make, make install

2. eblookをダウンロードしてインストール
- http://ikazuhiro.s206.xrea.com/staticpages/index.php/eblook
- configure, make, make install

3. lookupをインストール
- http://ikazuhiro.s206.xrea.com/staticpages/index.php/lookup
- configure, make, make install
- デフォルトで /usr/local/share/emacs/site-lisp/lookup/ にインストールされる

4. lookupをロードパスの通ったところに置く
- 上記のインストール先からシンボリックリンクを貼るなりする

5. EPWING形式の辞書をダウンロードして好きな場所に置く
- WordNet EPWING https://wordnetepwing.osdn.jp/ より、
『Princeton WordNet 3.0 と日本語WordNet 1.1の統合版』をダウンロード
- 以下の設定では辞書を ~/.emacs.d/share/lookup 以下に wordnet-en-jpとして置いた

6. Emacsの設定を書く

(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-pattern "lookup" nil t)

(setq lookup-enable-splash nil)
(setq lookup-search-agents
        '(
          (ndeb "~/.emacs.d/share/lookup/wordnet-en-jp")
          )))

これで使えるようになる。関数たちは以下(キーバインドは追記予定)。

関数名 機能
lookup lookupを起動し、設定した辞書のリストを表示する
lookup-region リージョンで選択した単語を対象に辞書を引く
lookup-word カーソル近くのwordを対象に辞書を引く
lookup-exit lookupを終了する

Mac OS (Big Sur)に音声認識エンジンJuliusをインストールしたときの記録

音声認識エンジンJuliusのソースコードgithubからダウンロード

解凍後、configureを掛けてmakeする

./configure
make

すると以下のエラーに遭遇した:

src/adin/adin_mic_darwin_coreaudio.c:99:3: error: implicit declaration of
      function 'jlog' is invalid in C99
      [-Werror,-Wimplicit-function-declaration]
  jlog("Stat: adin_darwin: ----- details of stream -----\n");

これを回避するため、まずportaudioをbrew経由でインストールしておく。

brew install portaudio

そしてconfigure時に追加のオプションを指定する

./configure --with-mictype=portaudio

するとコンパイル、インストールが通る。

make
make install

EmacsからOverleafを触るための設定

Atomic Chrome for Emacsというパッケージを使う。

要するに、Chrome拡張 Atomic Chromeの力を借りて、Chrome上でのテキストエリア編集をEmacsから実現できるようにしたパッケージである。Atomic Chrome for Emacsについては作者様の記事を読むのがよい。

そして以下の設定を使う。
atomic-chrome-url-major-mode-alistが、URLとEmacs編集時のメジャーモードを紐づけるための変数である。つまりOverleafはオンラインのLaTeX編集サービスなので、"overleaf.com"をlatex-modeと関連付けるわけである。

なおOverleafで編集時、atomic-chrome-enable-auto-updatenilにしておかないとsync errorが発生する。
Emacsでの編集内容をoverleaf側に反映させる場合は、atomic-chrome-send-buffer-text(C-c C-sにバインドされている)を使う。

(require 'atomic-chrome)
(atomic-chrome-start-server)

(setq atomic-chrome-enable-auto-update nil)
(setq atomic-chrome-url-major-mode-alist
      '(("overleaf\\.com" . latex-mode)
        ("ja.overleaf\\.com" . latex-mode)))

『制御理論における数学』シリーズへのリンク

『計測と制御』誌に掲載された、『制御理論における数学』と題される一連の解説記事がある。 本記事は備忘録としてそのリンクを掲載するものである。

版元ドットコムのリンク集(理数系・理工系書籍の出版社別)

版元ドットコムという、書誌情報を検索できるWebサービスがある。
www.hanmoto.com
検索を活用することで、出版社別に書誌情報を検索することができ、特に出版予定の書籍がいち早くリストアップされるのが嬉しい。

理数系・理工系書籍の出版をメインにしている会社別に、検索結果にアクセスできるようリンクをまとめてみた。

単に岩波書店講談社で検索すると、多様な書籍がヒットするので、今回のリンクからは除外した。