ガウス過程回帰をRで試してみる

# はじめに
Rでガウス過程回帰を行うための[kernlabライブラリ](https://cran.r-project.org/web/packages/kernlab/index.html)のgaussprを試してみたので、メモします。
基本的には上記のマニュアルに記載してあることですが、少しだけ私なりに工夫もしています。



# ガウス過程回帰の特徴
この手法での回帰は、次の3つが大きな特徴のようです。

- 非線形の柔軟な予測関数が得られること
- 過学習が起きにくいこと
- 各データ領域でどの程度の予測信頼性があるかを示すことができること

理論的な解説は、本人の理解もまだ浅いのですが、[MLPシリーズ「ガウス過程と機械学習」](http://chasen.org/~daiti-m/gpbook/)が
日本語の教科書では最も分かりやすく詳しいと思います。
また、[赤穂先生の「ガウス過程回帰の基礎」](https://www.jstage.jst.go.jp/article/isciesci/62/10/62_390/_pdf)もコンパクトにまとまった良い解説と思います。

# Rで実装
Rではkernlabを使うことで、簡単に試すことができます。
[kernlabマニュアル](https://cran.r-project.org/web/packages/kernlab/kernlab.pdf)のP14のExampleを参考に、データの密な部分と疎な部分を作り、実行してみます。
##ライブラリの読み込みとデータ作成
```R
library(kernlab)
# データ作成
x <- c(seq(-30, -20, 0.05), seq(-19, -15, 1), 
       seq(-9, -5, 0.1), seq(-2.9, 1, 0.5), 
       seq(2, 10, 2), seq(11, 14, 2), 
       seq(14.1, 20, 0.05), seq(22, 30, 1))
y <- sin(x) / x + rnorm(length(x), sd=0.05)
plot(x, y, col="blue", pch=19, ylim=c(-0.5, 1.2))
```
ライブラリを読んで、適当にデータを作っています。
生成したデータは青点にてプロットします。(図は最後に載せています)

## ガウス過程で回帰
```R
fit <- gausspr(x, y, variance.model=T)
xtest <- seq(min(x), max(x), 0.1)
lines(xtest, sin(xtest) / xtest, col="black", lty=2, lwd=2)
lines(xtest, predict(fit, xtest), col="red", lwd=2)
lines(xtest,
      predict(fit, xtest) + 2 * predict(fit, xtest, type="sdeviation"),
      col="salmon")
lines(xtest,
      predict(fit, xtest) - 2 * predict(fit,xtest,type="sdeviation"),
      col="salmon")
polygon(c(xtest, rev(xtest)),
        c(predict(fit, xtest) + 2 * predict(fit,xtest,type="sdeviation"),
          rev(predict(fit, xtest) - 2 * predict(fit,xtest,type="sdeviation"))),
        col=adjustcolor("salmon", alpha.f=0.2), border=NA)
```

次にガウス過程を適用してみます。モデル作成はgausspr関数を使います。
作成したモデルで分散や標準偏差を活用したい場合は、variance.model=Tにする必要があります。

なお、一般的にはgaussprではカーネルを指定する必要があります。
デフォルトはガウスカーネルが選択されています。
予測が目的の場合は一般的にはこれで良いようですが、
状況によっては他のカーネルの選択も検討する必要があります。
**カーネルの選択で、生成されるモデルの特徴が大きく変わるので、注意が必要に思います。**

次に、青色実線で、データを生成した関数を示しています。
また、赤色実線でガウス過程回帰で予測した関数を示しています。
さらに、2seの信頼区間も表示させました。


## プロット図
![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/b816fea9-70a8-e978-95e2-5d1248cdcb33.png)

ということで、図を生成させてみました。
データ生成した関数とデータ点が多いところと少ないところで
信頼区間の厚みが変わっていることがわかると思います。
またデータ数を適当に変えながら実行していくと、
モデルの状況の変化が分かって面白いです。

# 最後に
という感じで、ホントにkernlabのさわりを試しただけの記事ですが、
機会があれば、他のカーネルを試したり、色々な生成データを使った時に、
どうなるかなどの考察も書ければとは思っています。

# 全Rコード

```R
library(kernlab)
# データ作成
x <- c(seq(-30, -20, 0.05), seq(-19, -15, 1), 
       seq(-9, -5, 0.1), seq(-2.9, 1, 0.5), 
       seq(2, 10, 2), seq(11, 14, 2), 
       seq(14.1, 20, 0.05), seq(22, 30, 1))
y <- sin(x) / x + rnorm(length(x), sd=0.05)
plot(x, y, col="blue", pch=19, ylim=c(-0.5, 1.2))

# ガウス過程で回帰
fit <- gausspr(x, y, variance.model=T)
xtest <- seq(min(x), max(x), 0.1)
lines(xtest, sin(xtest) / xtest, col="black", lty=2, lwd=2)
lines(xtest, predict(fit, xtest), col="red", lwd=2)
lines(xtest,
      predict(fit, xtest) + 2 * predict(fit, xtest, type="sdeviation"),
      col="salmon")
lines(xtest,
      predict(fit, xtest) - 2 * predict(fit,xtest,type="sdeviation"),
      col="salmon")
polygon(c(xtest, rev(xtest)),
        c(predict(fit, xtest) + 2 * predict(fit,xtest,type="sdeviation"),
          rev(predict(fit, xtest) - 2 * predict(fit,xtest,type="sdeviation"))),
        col=adjustcolor("salmon", alpha.f=0.2), border=NA)
```



# 実行環境
macOS以外は、記事執筆時点の最新版と思います。
- macOS Mojave 10.14.6
- R version 3.6.1 (2019-07-05) -- "Action of the Toes"
- RStudio Version 1.2.5019
- kernlab 0.9-27

# 参考文献
- [kernlabライブラリ](https://cran.r-project.org/web/packages/kernlab/index.html)
- [「ガウス過程回帰の基礎」, 赤穂昭太郎, システム/制御/情報，Vol.62, No.10, 2018](https://www.jstage.jst.go.jp/article/isciesci/62/10/62_390/_pdf)
- [MLPシリーズ「ガウス過程と機械学習」](http://chasen.org/~daiti-m/gpbook/)