Kernel Density Estimation（カーネル密度推定）をAI on Browserで動かしてみた！

今回はカーネル密度推定を紹介したいと思います。
知識のない方でも何となく理解できるようにバリバリと噛み砕いてみます。

# 目次
- カーネル密度推定って？
  - Wikipediaの説明
  - 各要素を読み解く
  - 言い換えてみる
  - 定義
  - 長所、短所
  - 関連のある手法
- AI on Browserで動かしてみた
- ビジネスシーンでの活用方法
- さいごに

# カーネル密度推定って？
カーネル密度推定について見ていきましょう。
## Wikipediaの説明
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5%BA%A6%E6%8E%A8%E5%AE%9A)の冒頭には
>カーネル密度推定（カーネルみつどすいてい、英: kernel density estimation）は、統計学において、確率変数の確率密度関数を推定するノンパラメトリック手法のひとつ。

と記載されています。
統計学の一手法なんだなー、ということが分かりますね。というか、それぐらいしか分かりません。

## 各要素を読み解く
この文章を読み解くために、各要素をひとつずつ見ていきましょう。

まず、**確率変数**とは、ある変数の値を取る確率が存在する変数の事を言います。
ちょっと何を言ってるか分かりませんね。
具体的な例だと、サイコロの出る目とその確率があります。
サイコロの目は~~カイジの世界でなければ~~$\\{1,2,3,4,5,6\\}$、それぞれの出る確率は$1/6$です。
数式で表現すると、
```math
P(X) = \frac{1}{6} \quad (X=1,2,3,4,5,6)
```
サイコロが$1$の目を出す確率は
```math
P(1) = \frac{1}{6}
```
と表現できます。この$X$にあたるものが確率変数です。

次に、**確率密度関数**は、上記の確率変数$X$が連続（1,2,3のようにぶつ切りではなく1と2の間にも無数の値が存在する状態)である場合、いわゆる**連続型確率変数**において、「ある変数」を決定するための関数のことを言います。

最後に**ノンパラメトリック手法**ですが、「与えられた母集団（データの集まり）が何らかの分布に従っている」と仮定しないで統計的推測を行う方法です。
分布に従っていると仮定するパラメトリック手法と比較して汎用性が高いとされています。
更に、両方のいいとこ取りをするセミパラメトリック手法も存在します。

## 言い換えてみる
上で確認したことを用いてWikipediaの説明を言い換えてみます。
>カーネル密度推定（カーネルみつどすいてい、英: kernel density estimation）は、統計学において、『連続型確率変数において、「ある変数」を決定するための関数を推定する』、『「与えられた母集団が何らかの分布に従っている」と仮定せずに統計的推測を行う方法』のひとつ

であることが分かりますね。
なんとなくイメージはできましたか？

## 定義
数式は以下のように定義されています。（[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5%BA%A6%E6%8E%A8%E5%AE%9A#%E5%AE%9A%E7%BE%A9)より引用）
>$x$<sub>$1$</sub>, $x$<sub>$2$</sub>, ..., $x$<sub>$n$</sub> を（未知の）確率密度関数 $f$ を持つ独立同分布からの標本とする。カーネル関数 $K$、バンド幅（平滑化パラメータ）$h$のカーネル密度推定量（英: kernel density estimator）とは
>
>```math
>\hat{f}_h(x)=\frac{1}{nh}\sum_{i=1}^n K\left(\frac{x-x_i}{h}\right)
>```
>のことである。カーネル関数としては、標準的なガウス関数
>```math
>K(x) = {1 \over \sqrt{2\pi} }\,e^{-x^2/2}
>```
>（平均がゼロで分散が1）を採用することが多い。

## 長所、短所
長所として、計算が簡単ということが挙げられます。
逆に短所として、データの次元が高い場合、推定精度が悪くなるということが挙げられます。
この短所はカーネル密度推定固有ではなく「次元の呪い」というもので、AI分野ではよく目にします。
次元の高いデータに対して用いる場合は次元削減を用いてデータの次元を減らしてからの方が良いでしょう。

## 関連のある手法
ノンパラメトリック手法の仲間として、**k近傍法**などがあり、パラメトリック手法は、**最尤法**や**多重代入法**、セミパラメトリック手法には**逆確率重み付け法**や**二重頑健推定法**があります。
興味がある方は調べてみてください。

# AI on Browserで動かしてみた

今回は、以下のようなデータを与えてみます。

![KDE1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321646/074e77f2-0606-3ffe-bbfa-94bb1b66536d.png)


そして、これらの密度を推定します。その結果が下の図です。

![KDE2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321646/6e008daa-2bbf-077c-59b2-989c3c507160.png)


背景の黒い部分が推定された密度になります。色が黒いほど密度が濃いと推定したということですね。

誰でも利用でき、カーネル密度推定の他にも様々な手法を利用することができるのでぜひアクセスしてみてください！
https://ai-on-browser.github.io/?data=manual&task=DE&model=kernel_density_estimator&dimension=2

また、コードは以下にあるのでご参照下さい！
https://github.com/ai-on-browser/ai-on-browser.github.io/blob/5c5f31e2ec5a7959e492bea23483d11a10eca35e/lib/model/kernel_density_estimator.js

# ビジネスシーンでの活用方法
上で説明した特徴から、カーネル密度推定はデータの異常（外れ値）検知に用いることができます。
他にも、[GIS（地理情報システム）に適用する研究](https://www.jstage.jst.go.jp/article/journalcpij/46/3/46_3_409/_article/-char/ja)もされているようです。

# さいごに
カーネル密度推定は非常に面白い手法のため、是非ご自身の手で活用していただきたいと思います。
ビジネスシーンでは、次元の多いデータを扱う場合も多くあります。
そのため、カーネル密度推定を実施する前のデータの前処理が重要となってくることが想定されます。
次元削減をはじめとした前処理手法もAI on Browserにラインナップされているので試してみてください。