Skip to content

Instantly share code, notes, and snippets.

@shotahorii
Last active March 22, 2019 01:22
Show Gist options
  • Save shotahorii/c80e0ec3ea1ccffb408b7595226f5070 to your computer and use it in GitHub Desktop.
Save shotahorii/c80e0ec3ea1ccffb408b7595226f5070 to your computer and use it in GitHub Desktop.
Curve fitting with Bayesian inference
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Curve fitting with Bayesian inference\n",
"- [PRML 第1章の「ベイズ推定によるパラメータフィッティング」の解説(その1)](http://enakai00.hatenablog.com/entry/2015/04/08/181522)\n",
"- [PRML 第1章の「ベイズ推定によるパラメータフィッティング」の解説(その2)](http://enakai00.hatenablog.com/entry/2015/04/10/105651)\n",
"- [PRML第1章 ベイズ曲線フィッティング Python実装](https://qiita.com/ctgk/items/555802600638f41b40c5)\n",
"- [初心に帰ってベイズ線形多項式回帰(1)::8/5](https://fgjiutx.hatenablog.com/entry/2018/08/05/215014)\n",
"- [3.3. ベイズ線形回帰](http://telltale.hatenablog.com/entry/2016/07/30/164804)\n",
"- [pythonでベイズ線形回帰実装](https://qiita.com/ta-ka/items/8ee3cb7ecb17e58f4f78)\n",
"- [PRML演習問題 全問解答 演習問題 3.7](http://prml.yutorihiro.com/chapter-3/3-7/)\n",
"- [PRML 第3章 演習 3.1-3.10](http://directorscut82.github.io/osaka_prml_reading/ex_03_01-10.html#sec-1-10)\n",
"- PRML 3.1. (p138-), 3.3. (p152-), 2.3.3. (p93)\n",
"\n",
"[ここ](https://gist.github.com/shotahorii/9857d4cfe1ddd834d13bc2f485bd0ca4)でベイズ推定について書いた。この記事では、そのベイズ推定を用いて曲線フィッティングを行ってみる。 \n",
"\n",
"[注意] \n",
"ベイズ推定での曲線フィッティング(ベイズ線形回帰)ではPRMLに基づく参考サイトが多いので、ここでは記号の表記をPRMLに準ずることにする。具体的には、例えば[ここ](https://gist.github.com/shotahorii/9857d4cfe1ddd834d13bc2f485bd0ca4)では記号βを分散を示す記号として使っていたが、この記事ではβを精度(=分散の逆数)として扱う。つまりこの記事では分散はβ<sup>-1</sup>と表される。\n",
" \n",
"さて、この記事では、真のモデルに正規分布のノイズが乗ったデータを仮定してベイズ推定で多項式フィッティングしていく。\n",
"PRMLに準じた表記方法については[ここ](https://gist.github.com/shotahorii/dfafe7b2f637de31f07a3c7636181f8b)参照。"
]
},
{
"cell_type": "code",
"execution_count": 282,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"text/latex": [
"具体的な計算に入っていく前に、ベイズ推定による曲線フィッティングとはそもそも何なのか、ということについて簡単に説明する。\n",
"<br>\n",
"注意点として、以下の説明は全て、誤差が正規分布に従うとした回帰分析を前提としている。\n",
"<br><br>\n",
"まず最尤推定による曲線フィッティング、MAP推定による曲線フィッティングとの最大の違いは、唯一の推定値を算出しないことである。\n",
"\n",
"最尤推定では、パラメータ$${\\bf w}$$(回帰式の偏回帰係数)を最尤法によって推定した。ある入力$${\\bf x}_0$$に対する予測値$$t_{predict}$$\n",
"(以降簡略化のため$$t_0$$と表記)は、単に推定された$${\\bf w}$$を\n",
"用いた回帰式に入力$${\\bf x}_0$$を代入して計算すればよいだけであった。すなわち$$t_0={\\bf w}^T\\phi({\\bf x}_0)$$である。\n",
"<br><br>\n",
"もう少し正確に書くと、誤差に平均0,分散$$\\beta^{-1}$$の正規分布を仮定していると考えると、一意に決まる推定パラメータ群$${\\bf w}$$\n",
"が与えられたとき、ある入力$${\\bf x}_0$$に対して予測値$$t_0$$が得られる確率は以下のように表される。\n",
"<br><br>\n",
"$$p(t_0|{\\bf w})=\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}_0),\\beta^{-1})$$\n",
"<br><br>\n",
"この期待値をとって上記の式 $$t_0={\\bf w}^T\\phi({\\bf x}_0)$$ となる。\n",
"<br><br>\n",
"\n",
"MAP推定では、$${\\bf w}$$の事前分布を考慮して事後確率を最大化する値を推定するが、\n",
"ある特定のパラメータをただ一つの解として算出するという点、そして入力$${\\bf x}_0$$に対する予測値$$t_0$$\n",
"が得られる確率が$$\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}_0),\\beta^{-1})$$\n",
"となり、$$t_0={\\bf w}^T\\phi({\\bf x}_0)$$で一意に予測値が算出されるという点においては最尤推定と同様である。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"具体的な計算に入っていく前に、ベイズ推定による曲線フィッティングとはそもそも何なのか、ということについて簡単に説明する。\n",
"<br>\n",
"注意点として、以下の説明は全て、誤差が正規分布に従うとした回帰分析を前提としている。\n",
"<br><br>\n",
"まず最尤推定による曲線フィッティング、MAP推定による曲線フィッティングとの最大の違いは、唯一の推定値を算出しないことである。\n",
"\n",
"最尤推定では、パラメータ$${\\bf w}$$(回帰式の偏回帰係数)を最尤法によって推定した。ある入力$${\\bf x}_0$$に対する予測値$$t_{predict}$$\n",
"(以降簡略化のため$$t_0$$と表記)は、単に推定された$${\\bf w}$$を\n",
"用いた回帰式に入力$${\\bf x}_0$$を代入して計算すればよいだけであった。すなわち$$t_0={\\bf w}^T\\phi({\\bf x}_0)$$である。\n",
"<br><br>\n",
"もう少し正確に書くと、誤差に平均0,分散$$\\beta^{-1}$$の正規分布を仮定していると考えると、一意に決まる推定パラメータ群$${\\bf w}$$\n",
"が与えられたとき、ある入力$${\\bf x}_0$$に対して予測値$$t_0$$が得られる確率は以下のように表される。\n",
"<br><br>\n",
"$$p(t_0|{\\bf w})=\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}_0),\\beta^{-1})$$\n",
"<br><br>\n",
"この期待値をとって上記の式 $$t_0={\\bf w}^T\\phi({\\bf x}_0)$$ となる。\n",
"<br><br>\n",
"\n",
"MAP推定では、$${\\bf w}$$の事前分布を考慮して事後確率を最大化する値を推定するが、\n",
"ある特定のパラメータをただ一つの解として算出するという点、そして入力$${\\bf x}_0$$に対する予測値$$t_0$$\n",
"が得られる確率が$$\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}_0),\\beta^{-1})$$\n",
"となり、$$t_0={\\bf w}^T\\phi({\\bf x}_0)$$で一意に予測値が算出されるという点においては最尤推定と同様である。"
]
},
{
"cell_type": "code",
"execution_count": 283,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"一方、ベイズ推定では$${\\bf w}$$のはただひとつの値としては算出されず、確率分布として出される。\n",
"<br><br>\n",
"これはすなわち、$$p(t_0|{\\bf w})$$を全ての$${\\bf w}$$について計算しなければならないということである。\n",
"<br><br>\n",
"ここで、$${\\bf w}$$の値それぞれが得られる確率は一様ではないことを考える必要がある。$${\\bf w}$$\n",
"は、与えられたデータ$${\\bf X}$$と$${\\bf t}$$によって決まる確率分布$$p({\\bf w}|{\\bf t})$$である。\n",
"($${\\bf X}$$については条件となることが自明であるため条件つき確率の表記に入れていない点に注意。)\n",
"<br><br>\n",
"つまり、あるデータセット$${\\bf X},{\\bf t}$$が与えられた時、全ての$${\\bf w}$$についての$$p(t_0|{\\bf w})$$\n",
"を計算するということはすなわち、{$${\\bf X},{\\bf t}$$からそれぞれの$${\\bf w}$$が得られる確率\n",
"$$p({\\bf w}|{\\bf t})$$} × {その$${\\bf w}$$から$$t_0$$が得られる確率$$p(t_0|{\\bf w})$$}\n",
"を$${\\bf w}$$について積分する、ということになる。\n",
"<br><br>\n",
"つまり以下である。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"この確率(のちに説明していくがこれは正規分布になる)の期待値がベイズ推定の推定値となる。\n",
"また、分散も推定されるので、各点においてどの程度推定値にばらつきを想定しているかを評価することができる。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"一方、ベイズ推定では$${\\bf w}$$のはただひとつの値としては算出されず、確率分布として出される。\n",
"<br><br>\n",
"これはすなわち、$$p(t_0|{\\bf w})$$を全ての$${\\bf w}$$について計算しなければならないということである。\n",
"<br><br>\n",
"ここで、$${\\bf w}$$の値それぞれが得られる確率は一様ではないことを考える必要がある。$${\\bf w}$$\n",
"は、与えられたデータ$${\\bf X}$$と$${\\bf t}$$によって決まる確率分布$$p({\\bf w}|{\\bf t})$$である。\n",
"($${\\bf X}$$については条件となることが自明であるため条件つき確率の表記に入れていない点に注意。)\n",
"<br><br>\n",
"つまり、あるデータセット$${\\bf X},{\\bf t}$$が与えられた時、全ての$${\\bf w}$$についての$$p(t_0|{\\bf w})$$\n",
"を計算するということはすなわち、{$${\\bf X},{\\bf t}$$からそれぞれの$${\\bf w}$$が得られる確率\n",
"$$p({\\bf w}|{\\bf t})$$} × {その$${\\bf w}$$から$$t_0$$が得られる確率$$p(t_0|{\\bf w})$$}\n",
"を$${\\bf w}$$について積分する、ということになる。\n",
"<br><br>\n",
"つまり以下である。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"この確率(のちに説明していくがこれは正規分布になる)の期待値がベイズ推定の推定値となる。\n",
"また、分散も推定されるので、各点においてどの程度推定値にばらつきを想定しているかを評価することができる。"
]
},
{
"cell_type": "code",
"execution_count": 284,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"では、具体的にデータセット$${\\bf X},{\\bf t}$$から$$p(t_0|{\\bf t})$$を算出する方法を見ていく。\n",
"<br><br>\n",
"\n",
"観測データは真のモデルに正規分布のノイズが乗ったものであると仮定した。\n",
"つまりある観測点と重み$${\\bf x},{\\bf w}$$が与えられた時、観測値$$t$$は以下のように表される。\n",
"<br><br>\n",
"$$t = y({\\bf x},{\\bf w}) + \\epsilon$$\n",
"<br><br>\n",
"ここで、$$\\epsilon$$は平均0の正規分布であり、この正規分布の精度(分散の逆数)を$$\\beta$$\n",
"とおくと、上記のモデルは以下のように表せる。<br><br>\n",
"$$p(t|{\\bf x},{\\bf w},\\beta) = \\mathcal{N}(t|y({\\bf x},{\\bf w}),\\beta^{-1})$$\n",
"<br><br>\n",
"これは、「ある観測点$${\\bf x}$$,重み$${\\bf w}$$,精度$$\\beta$$が与えられた時、観測値$$t$$\n",
"が得られる確率」を表す。<br>\n",
"ここで、データセットとしてN個の観測点と観測値のペアが与えられたとする。<br><br>\n",
"観測点の集合を$${\\bf X} = \\{{\\bf x}_1,{\\bf x}_2,...,{\\bf x}_N\\}$$<br>\n",
"観測値の集合を縦ベクトル$${\\bf t} = (t_1,t_2,...,t_N)^T$$<br>\n",
"と表す。<br><br>\n",
"ここで、今、知りたいのは、$${\\bf X},{\\bf w},\\beta$$が与えられた時、観測値$${\\bf t}$$\n",
"が得られる確率」なので、全ての$${\\bf x}_n,t_n$$についての確率を掛け合わせる。\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf X},{\\bf w},\\beta) = \\prod_{n=1}^N \\mathcal{N}(t_n|{\\bf w}^T\\phi({\\bf x}_n),\\beta^{-1})$$\n",
"<br><br>\n",
"注意:この式ではわかりやすさのため条件付き確率の条件部分に$${\\bf X}$$と$$\\beta$$含めているが、\n",
"これまでの表記に合わせると$${\\bf X}$$は自明のため表記されず、また$$\\beta$$も所与として表記されない。\n",
"つまりこれは$$p({\\bf t}|{\\bf w})$$であることに注意。\n",
"<br><br>"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"では、具体的にデータセット$${\\bf X},{\\bf t}$$から$$p(t_0|{\\bf t})$$を算出する方法を見ていく。\n",
"<br><br>\n",
"\n",
"観測データは真のモデルに正規分布のノイズが乗ったものであると仮定した。\n",
"つまりある観測点と重み$${\\bf x},{\\bf w}$$が与えられた時、観測値$$t$$は以下のように表される。\n",
"<br><br>\n",
"$$t = y({\\bf x},{\\bf w}) + \\epsilon$$\n",
"<br><br>\n",
"ここで、$$\\epsilon$$は平均0の正規分布であり、この正規分布の精度(分散の逆数)を$$\\beta$$\n",
"とおくと、上記のモデルは以下のように表せる。<br><br>\n",
"$$p(t|{\\bf x},{\\bf w},\\beta) = \\mathcal{N}(t|y({\\bf x},{\\bf w}),\\beta^{-1})$$\n",
"<br><br>\n",
"これは、「ある観測点$${\\bf x}$$,重み$${\\bf w}$$,精度$$\\beta$$が与えられた時、観測値$$t$$\n",
"が得られる確率」を表す。<br>\n",
"ここで、データセットとしてN個の観測点と観測値のペアが与えられたとする。<br><br>\n",
"観測点の集合を$${\\bf X} = \\{{\\bf x}_1,{\\bf x}_2,...,{\\bf x}_N\\}$$<br>\n",
"観測値の集合を縦ベクトル$${\\bf t} = (t_1,t_2,...,t_N)^T$$<br>\n",
"と表す。<br><br>\n",
"ここで、今、知りたいのは、$${\\bf X},{\\bf w},\\beta$$が与えられた時、観測値$${\\bf t}$$\n",
"が得られる確率」なので、全ての$${\\bf x}_n,t_n$$についての確率を掛け合わせる。\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf X},{\\bf w},\\beta) = \\prod_{n=1}^N \\mathcal{N}(t_n|{\\bf w}^T\\phi({\\bf x}_n),\\beta^{-1})$$\n",
"<br><br>\n",
"注意:この式ではわかりやすさのため条件付き確率の条件部分に$${\\bf X}$$と$$\\beta$$含めているが、\n",
"これまでの表記に合わせると$${\\bf X}$$は自明のため表記されず、また$$\\beta$$も所与として表記されない。\n",
"つまりこれは$$p({\\bf t}|{\\bf w})$$であることに注意。\n",
"<br><br>"
]
},
{
"cell_type": "code",
"execution_count": 285,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"ここで、曲線フィッティングで観測値を予測するために求めたかった式を再度確認する。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"上のセルで求めた式は$$p({\\bf t}|{\\bf w})$$であった。ここから事後分布$$p({\\bf w}|{\\bf t})$$を計算したい。\n",
"<br>\n",
"別の記事(Bayesian inference)では、以下のベイズの定理からゴリゴリ計算して事後分布を求めていった。\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\frac{p({\\bf t}|{\\bf w})p({\\bf w})}{p({\\bf t})}$$\n",
"<br><br>\n",
"が、ここでは別の方法で事後分布を求める。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"ここで、曲線フィッティングで観測値を予測するために求めたかった式を再度確認する。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"上のセルで求めた式は$$p({\\bf t}|{\\bf w})$$であった。ここから事後分布$$p({\\bf w}|{\\bf t})$$を計算したい。\n",
"<br>\n",
"別の記事(Bayesian inference)では、以下のベイズの定理からゴリゴリ計算して事後分布を求めていった。\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\frac{p({\\bf t}|{\\bf w})p({\\bf w})}{p({\\bf t})}$$\n",
"<br><br>\n",
"が、ここでは別の方法で事後分布を求める。"
]
},
{
"cell_type": "code",
"execution_count": 286,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"PRML p93にある公式(Marginal and Conditional Gaussians)を使う。\n",
"<br><br>\n",
"$${\\bf x}$$の周辺分布と、$${\\bf x}$$が与えられた時の$${\\bf y}$$の条件付き分布が以下の正規分布で与えられるとき、\n",
"<br><br>\n",
"$$p({\\bf x}) = \\mathcal{N}({\\bf x}|{\\bf \\mu},{\\bf \\Lambda}^{-1})$$<br>\n",
"$$p({\\bf y}|{\\bf x}) = \\mathcal{N}({\\bf y}|{\\bf Ax}+{\\bf b},{\\bf L}^{-1})$$<br>\n",
"<br><br>\n",
"$${\\bf y}$$の周辺分布と、$${\\bf y}$$が与えられた時の$${\\bf x}$$の条件付き分布は以下の正規分布となる。\n",
"<br><br>\n",
"$$p({\\bf y}) = \\mathcal{N}({\\bf y}|{\\bf A\\mu}+{\\bf b},{\\bf L}^{-1}+{\\bf A}{\\bf \\Lambda}^{-1}{\\bf A}^T)$$<br>\n",
"$$p({\\bf x}|{\\bf y}) = \\mathcal{N}({\\bf x}|{\\bf \\Sigma}\\{{\\bf A}^T{\\bf L}({\\bf y}-{\\bf b})+{\\bf \\Lambda\\mu}\\}\n",
" ,{\\bf \\Sigma})$$\n",
"<br><br>\n",
"ただし、$${\\bf \\Sigma} = ({\\bf \\Lambda}+{\\bf A}^T{\\bf LA})^{-1}$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"PRML p93にある公式(Marginal and Conditional Gaussians)を使う。\n",
"<br><br>\n",
"$${\\bf x}$$の周辺分布と、$${\\bf x}$$が与えられた時の$${\\bf y}$$の条件付き分布が以下の正規分布で与えられるとき、\n",
"<br><br>\n",
"$$p({\\bf x}) = \\mathcal{N}({\\bf x}|{\\bf \\mu},{\\bf \\Lambda}^{-1})$$<br>\n",
"$$p({\\bf y}|{\\bf x}) = \\mathcal{N}({\\bf y}|{\\bf Ax}+{\\bf b},{\\bf L}^{-1})$$<br>\n",
"<br><br>\n",
"$${\\bf y}$$の周辺分布と、$${\\bf y}$$が与えられた時の$${\\bf x}$$の条件付き分布は以下の正規分布となる。\n",
"<br><br>\n",
"$$p({\\bf y}) = \\mathcal{N}({\\bf y}|{\\bf A\\mu}+{\\bf b},{\\bf L}^{-1}+{\\bf A}{\\bf \\Lambda}^{-1}{\\bf A}^T)$$<br>\n",
"$$p({\\bf x}|{\\bf y}) = \\mathcal{N}({\\bf x}|{\\bf \\Sigma}\\{{\\bf A}^T{\\bf L}({\\bf y}-{\\bf b})+{\\bf \\Lambda\\mu}\\}\n",
" ,{\\bf \\Sigma})$$\n",
"<br><br>\n",
"ただし、$${\\bf \\Sigma} = ({\\bf \\Lambda}+{\\bf A}^T{\\bf LA})^{-1}$$"
]
},
{
"cell_type": "code",
"execution_count": 287,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"さて、$${\\bf w}$$が与えられたときの$${\\bf t}$$の条件付き分布は以下であった。\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf w}) = \\prod_{n=1}^N \\mathcal{N}(t_n|{\\bf w}^T\\phi({\\bf x}_n),\\beta^{-1})$$\n",
"<br><br>\n",
"正規分布の総乗は以下のように行列で表現できるとのこと。(上のリンクの[PRML演習問題 全問解答 演習問題 3.7]参照)\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf w}) = \\mathcal{N}({\\bf t}|\\Phi{\\bf w},\\beta^{-1}{\\bf I})$$\n",
"<br><br>\n",
"この$${\\bf w}$$の共役事前分布は正規分布であるので、平均を$${\\bf m}_0$$,分散を$${\\bf S}_0$$とおいて以下のように書ける。\n",
"<br><br>\n",
"$$p({\\bf w})=\\mathcal{N}({\\bf w}|{\\bf m}_0,{\\bf S}_0)$$\n",
"<br><br>\n",
"ここで、上のセルの公式にこれを当てはめていくと、\n",
"<br><br>\n",
"$${\\bf y}={\\bf t}$$<br>\n",
"$${\\bf x}={\\bf w}$$<br>\n",
"$${\\bf A}=\\Phi$$<br>\n",
"$${\\bf b}={\\bf 0}$$<br>\n",
"$${\\bf \\mu}={\\bf m}_0$$<br>\n",
"$${\\bf L}=\\beta$$<br>\n",
"$${\\bf \\Lambda}={\\bf S}_0^{-1}$$\n",
"<br><br>\n",
"であり、すなわち、\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N={\\bf S}_N({\\bf S}_0^{-1}{\\bf m}_0+\\beta\\Phi^T{\\bf t})$$<br>\n",
"$${\\bf S}_N^{-1}={\\bf S}_0^{-1}+\\beta\\Phi^T\\Phi$$<br>"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"さて、$${\\bf w}$$が与えられたときの$${\\bf t}$$の条件付き分布は以下であった。\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf w}) = \\prod_{n=1}^N \\mathcal{N}(t_n|{\\bf w}^T\\phi({\\bf x}_n),\\beta^{-1})$$\n",
"<br><br>\n",
"正規分布の総乗は以下のように行列で表現できるとのこと。(上のリンクの[PRML演習問題 全問解答 演習問題 3.7]参照)\n",
"<br><br>\n",
"$$p({\\bf t}|{\\bf w}) = \\mathcal{N}({\\bf t}|\\Phi{\\bf w},\\beta^{-1}{\\bf I})$$\n",
"<br><br>\n",
"この$${\\bf w}$$の共役事前分布は正規分布であるので、平均を$${\\bf m}_0$$,分散を$${\\bf S}_0$$とおいて以下のように書ける。\n",
"<br><br>\n",
"$$p({\\bf w})=\\mathcal{N}({\\bf w}|{\\bf m}_0,{\\bf S}_0)$$\n",
"<br><br>\n",
"ここで、上のセルの公式にこれを当てはめていくと、\n",
"<br><br>\n",
"$${\\bf y}={\\bf t}$$<br>\n",
"$${\\bf x}={\\bf w}$$<br>\n",
"$${\\bf A}=\\Phi$$<br>\n",
"$${\\bf b}={\\bf 0}$$<br>\n",
"$${\\bf \\mu}={\\bf m}_0$$<br>\n",
"$${\\bf L}=\\beta$$<br>\n",
"$${\\bf \\Lambda}={\\bf S}_0^{-1}$$\n",
"<br><br>\n",
"であり、すなわち、\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N={\\bf S}_N({\\bf S}_0^{-1}{\\bf m}_0+\\beta\\Phi^T{\\bf t})$$<br>\n",
"$${\\bf S}_N^{-1}={\\bf S}_0^{-1}+\\beta\\Phi^T\\Phi$$<br>"
]
},
{
"cell_type": "code",
"execution_count": 288,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"ここで、簡便のため{\\bf w}の事前分布を平均0の以下の正規分布で仮定する。\n",
"<br><br>\n",
"$$p({\\bf w}|\\alpha) = \\mathcal{N}({\\bf w}|{\\bf 0},\\alpha^{-1}{\\bf I})$$\n",
"<br><br>\n",
"すると、事後分布は以下のようになる。\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$<br>\n",
"<br><br>\n",
"ちなみに、この事後分布の対数をとると、以下のようにどこかで見たような(正則化の記事参照.)式になる。\n",
"<br>\n",
"$$log p({\\bf w}|{\\bf t}) = -\\frac{\\beta}{2}\\sum_{n=1}^N(t_n - {\\bf w}^T\\phi(x_n))^2\n",
"-\\frac{\\alpha}{2}{\\bf w}^T{\\bf w} + const.$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"ここで、簡便のため{\\bf w}の事前分布を平均0の以下の正規分布で仮定する。\n",
"<br><br>\n",
"$$p({\\bf w}|\\alpha) = \\mathcal{N}({\\bf w}|{\\bf 0},\\alpha^{-1}{\\bf I})$$\n",
"<br><br>\n",
"すると、事後分布は以下のようになる。\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$<br>\n",
"<br><br>\n",
"ちなみに、この事後分布の対数をとると、以下のようにどこかで見たような(正則化の記事参照.)式になる。\n",
"<br>\n",
"$$log p({\\bf w}|{\\bf t}) = -\\frac{\\beta}{2}\\sum_{n=1}^N(t_n - {\\bf w}^T\\phi(x_n))^2\n",
"-\\frac{\\alpha}{2}{\\bf w}^T{\\bf w} + const.$$"
]
},
{
"cell_type": "code",
"execution_count": 289,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"さて、再度$$p(t_0|{\\bf t})$$の式に戻る。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"上のセルで、$$p({\\bf w}|{\\bf t})$$を求めることができた。次に、$$p(t_0|{\\bf w})$$である。<br>\n",
"その前に、パラメータ$$\\alpha,\\beta$$も与えられていることを考慮し、より明示的に記載する。<br><br>\n",
"$$p(t_0|{\\bf t},\\alpha,\\beta) = \\int p(t_0|{\\bf w},\\beta)p({\\bf w}|{\\bf t},\\alpha,\\beta)d{\\bf w}$$\n",
"<br><br>\n",
"で、改めて、$$p(t_0|{\\bf w},\\beta)$$であるが、ここで思い出して欲しいのは、PRMLの記法において$${\\bf x}$$\n",
"は自明のため書かれていないが、条件に含まれている。つまりこれは$$p(t_0|{\\bf x},{\\bf w},\\beta)$$である。\n",
"<br>\n",
"と、いうことを考えると、この式はこの記事のずっと上の方のセルにすでに書かれている。\n",
"<br><br>\n",
"$$p(t_0|{\\bf x},{\\bf w},\\beta) = \\mathcal{N}(t_0|y({\\bf x},{\\bf w}),\\beta^{-1})$$<br>\n",
"$$=\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"さて、再度$$p(t_0|{\\bf t})$$の式に戻る。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"上のセルで、$$p({\\bf w}|{\\bf t})$$を求めることができた。次に、$$p(t_0|{\\bf w})$$である。<br>\n",
"その前に、パラメータ$$\\alpha,\\beta$$も与えられていることを考慮し、より明示的に記載する。<br><br>\n",
"$$p(t_0|{\\bf t},\\alpha,\\beta) = \\int p(t_0|{\\bf w},\\beta)p({\\bf w}|{\\bf t},\\alpha,\\beta)d{\\bf w}$$\n",
"<br><br>\n",
"で、改めて、$$p(t_0|{\\bf w},\\beta)$$であるが、ここで思い出して欲しいのは、PRMLの記法において$${\\bf x}$$\n",
"は自明のため書かれていないが、条件に含まれている。つまりこれは$$p(t_0|{\\bf x},{\\bf w},\\beta)$$である。\n",
"<br>\n",
"と、いうことを考えると、この式はこの記事のずっと上の方のセルにすでに書かれている。\n",
"<br><br>\n",
"$$p(t_0|{\\bf x},{\\bf w},\\beta) = \\mathcal{N}(t_0|y({\\bf x},{\\bf w}),\\beta^{-1})$$<br>\n",
"$$=\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$"
]
},
{
"cell_type": "code",
"execution_count": 290,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"ここまでを整理する。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$\n",
"<br><br>\n",
"と、積分の中身が二つの正規分布であることがわかった。<br>\n",
"ここで思い出してほしいのが、少し上のセルで出てきた公式(Marginal and Conditional Gaussians)である。その一つに以下があった。\n",
"<br><br>\n",
"$$p({\\bf y}) = \\mathcal{N}({\\bf y}|{\\bf A\\mu}+{\\bf b},{\\bf L}^{-1}+{\\bf A}{\\bf \\Lambda}^{-1}{\\bf A}^T)$$\n",
"<br><br>\n",
"ここで、周辺確率$$p({\\bf y})=\\int p({\\bf y}|{\\bf x})p({\\bf x})d{\\bf x}$$であることを考えると...\n",
"<br><br>\n",
"$$p(t_0)=\\int p(t_0|{\\bf w})p({\\bf w})d{\\bf w}$$として上の公式を適用できる。\n",
"<br><br>\n",
"ここで、(少し本筋から脱線するが)<br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$が元の公式の<br>\n",
"$$p({\\bf y}|{\\bf x}) = \\mathcal{N}({\\bf y}|{\\bf Ax}+{\\bf b},{\\bf L}^{-1})$$に該当するが、<br>\n",
"$${\\bf w}^T\\phi({\\bf x})$$を$${\\bf Ax}+{\\bf b}$$に則した形で書きたい。\n",
"<br><br>\n",
"ここで、<br>\n",
"$${\\bf w} = (w_0,w_1,...,w_{M-1})^T$$<br>\n",
"$$\\phi({\\bf x}) = (\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))^T$$<br>\n",
"であるので、<br>\n",
"$${\\bf w}^T\\phi({\\bf x}) = (w_0,w_1,...,w_{M-1})\n",
"(\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))^T$$<br>\n",
"$$= w_0\\phi_0({\\bf x}) + w_1\\phi_1({\\bf x}) + ... + w_{M-1}\\phi_{M-1}({\\bf x})$$<br>\n",
"$$= (\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))\n",
"(w_0,w_1,...,w_{M-1})^T$$<br>\n",
"$$=\\phi({\\bf x})^T{\\bf w}$$\n",
"<br><br>\n",
"こちらの方が$${\\bf Ax}+{\\bf b}$$に則した形なので、$$p(t_0|{\\bf w})$$を以下のように書き直す。\n",
"<br><br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|\\phi({\\bf x})^T{\\bf w},\\beta^{-1})$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"ここまでを整理する。\n",
"<br><br>\n",
"$$p(t_0|{\\bf t}) = \\int p(t_0|{\\bf w})p({\\bf w}|{\\bf t})d{\\bf w}$$\n",
"<br><br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$\n",
"<br><br>\n",
"$$p({\\bf w}|{\\bf t}) = \\mathcal{N}({\\bf w}|{\\bf m}_N,{\\bf S}_N)$$<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$\n",
"<br><br>\n",
"と、積分の中身が二つの正規分布であることがわかった。<br>\n",
"ここで思い出してほしいのが、少し上のセルで出てきた公式(Marginal and Conditional Gaussians)である。その一つに以下があった。\n",
"<br><br>\n",
"$$p({\\bf y}) = \\mathcal{N}({\\bf y}|{\\bf A\\mu}+{\\bf b},{\\bf L}^{-1}+{\\bf A}{\\bf \\Lambda}^{-1}{\\bf A}^T)$$\n",
"<br><br>\n",
"ここで、周辺確率$$p({\\bf y})=\\int p({\\bf y}|{\\bf x})p({\\bf x})d{\\bf x}$$であることを考えると...\n",
"<br><br>\n",
"$$p(t_0)=\\int p(t_0|{\\bf w})p({\\bf w})d{\\bf w}$$として上の公式を適用できる。\n",
"<br><br>\n",
"ここで、(少し本筋から脱線するが)<br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|{\\bf w}^T\\phi({\\bf x}),\\beta^{-1})$$が元の公式の<br>\n",
"$$p({\\bf y}|{\\bf x}) = \\mathcal{N}({\\bf y}|{\\bf Ax}+{\\bf b},{\\bf L}^{-1})$$に該当するが、<br>\n",
"$${\\bf w}^T\\phi({\\bf x})$$を$${\\bf Ax}+{\\bf b}$$に則した形で書きたい。\n",
"<br><br>\n",
"ここで、<br>\n",
"$${\\bf w} = (w_0,w_1,...,w_{M-1})^T$$<br>\n",
"$$\\phi({\\bf x}) = (\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))^T$$<br>\n",
"であるので、<br>\n",
"$${\\bf w}^T\\phi({\\bf x}) = (w_0,w_1,...,w_{M-1})\n",
"(\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))^T$$<br>\n",
"$$= w_0\\phi_0({\\bf x}) + w_1\\phi_1({\\bf x}) + ... + w_{M-1}\\phi_{M-1}({\\bf x})$$<br>\n",
"$$= (\\phi_0({\\bf x}),\\phi_1({\\bf x}),...,\\phi_{M-1}({\\bf x}))\n",
"(w_0,w_1,...,w_{M-1})^T$$<br>\n",
"$$=\\phi({\\bf x})^T{\\bf w}$$\n",
"<br><br>\n",
"こちらの方が$${\\bf Ax}+{\\bf b}$$に則した形なので、$$p(t_0|{\\bf w})$$を以下のように書き直す。\n",
"<br><br>\n",
"$$p(t_0|{\\bf w}) =\\mathcal{N}(t_0|\\phi({\\bf x})^T{\\bf w},\\beta^{-1})$$"
]
},
{
"cell_type": "code",
"execution_count": 291,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"これを踏まえて改めて公式を適用すると、\n",
"<br><br>\n",
"$${\\bf y}=t_0$$<br>\n",
"$${\\bf x}={\\bf w}$$<br>\n",
"$${\\bf A}=\\phi({\\bf x})^T$$<br>\n",
"$${\\bf b}={\\bf 0}$$<br>\n",
"$${\\bf \\mu}={\\bf m}_N$$<br>\n",
"$${\\bf L}=\\beta$$<br>\n",
"$${\\bf \\Lambda}={\\bf S}_N^{-1}$$\n",
"<br><br>\n",
"$$p(t_0) = \\mathcal{N}(t_0|\\phi({\\bf x})^T{\\bf m}_N,\\beta^{-1}+\\phi({\\bf x})^T{\\bf S}_N\\phi({\\bf x}))$$\n",
"<br><br>\n",
"ここで、$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$である。<br>\n",
"また、$$\\beta$$と$${\\bf S}_N$$は定数、$$\\Phi^T$$はM×N行列、$${\\bf t}$$はN×1行列である。<br>\n",
"すなわち$${\\bf m}_N$$はM×1行列である。<br>\n",
"$$\\phi({\\bf x})^T$$は1×M行列なので、先ほど$${\\bf w}^T\\phi({\\bf x})=\\phi({\\bf x})^T{\\bf w}$$\n",
"としたのと同様にここも$$\\phi({\\bf x})^T{\\bf m}_N={\\bf m}_N^T\\phi({\\bf x})$$とできる。\n",
"<br><br>\n",
"まとめると、学習データセット$${\\bf X}, {\\bf t}$$が与えられた時、入力$${\\bf x}$$に対する予測値の分布\n",
"$$p(t_0)$$は以下のように求まる。\n",
"<br><br>\n",
"$$p(t_0|{\\bf X},{\\bf t},\\alpha,\\beta,{\\bf x}) = \\mathcal{N}(t_0|{\\bf m}_N^T\\phi({\\bf x}),\\beta^{-1}+\\phi({\\bf x})^T{\\bf S}_N\\phi({\\bf x}))$$\n",
"<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"これを踏まえて改めて公式を適用すると、\n",
"<br><br>\n",
"$${\\bf y}=t_0$$<br>\n",
"$${\\bf x}={\\bf w}$$<br>\n",
"$${\\bf A}=\\phi({\\bf x})^T$$<br>\n",
"$${\\bf b}={\\bf 0}$$<br>\n",
"$${\\bf \\mu}={\\bf m}_N$$<br>\n",
"$${\\bf L}=\\beta$$<br>\n",
"$${\\bf \\Lambda}={\\bf S}_N^{-1}$$\n",
"<br><br>\n",
"$$p(t_0) = \\mathcal{N}(t_0|\\phi({\\bf x})^T{\\bf m}_N,\\beta^{-1}+\\phi({\\bf x})^T{\\bf S}_N\\phi({\\bf x}))$$\n",
"<br><br>\n",
"ここで、$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$である。<br>\n",
"また、$$\\beta$$と$${\\bf S}_N$$は定数、$$\\Phi^T$$はM×N行列、$${\\bf t}$$はN×1行列である。<br>\n",
"すなわち$${\\bf m}_N$$はM×1行列である。<br>\n",
"$$\\phi({\\bf x})^T$$は1×M行列なので、先ほど$${\\bf w}^T\\phi({\\bf x})=\\phi({\\bf x})^T{\\bf w}$$\n",
"としたのと同様にここも$$\\phi({\\bf x})^T{\\bf m}_N={\\bf m}_N^T\\phi({\\bf x})$$とできる。\n",
"<br><br>\n",
"まとめると、学習データセット$${\\bf X}, {\\bf t}$$が与えられた時、入力$${\\bf x}$$に対する予測値の分布\n",
"$$p(t_0)$$は以下のように求まる。\n",
"<br><br>\n",
"$$p(t_0|{\\bf X},{\\bf t},\\alpha,\\beta,{\\bf x}) = \\mathcal{N}(t_0|{\\bf m}_N^T\\phi({\\bf x}),\\beta^{-1}+\\phi({\\bf x})^T{\\bf S}_N\\phi({\\bf x}))$$\n",
"<br>\n",
"$${\\bf m}_N=\\beta {\\bf S}_N\\Phi^T{\\bf t}$$<br>\n",
"$${\\bf S}_N^{-1}=\\alpha{\\bf I}+\\beta\\Phi^T\\Phi$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 実装してみる"
]
},
{
"cell_type": "code",
"execution_count": 293,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import math\n",
"import numpy as np\n",
"from functools import reduce\n",
"\n",
"from matplotlib import pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 420,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class Model:\n",
" def __init__(self,alpha,beta,X,t):\n",
" self.beta = beta\n",
" self.sn = self._Sn(alpha,beta,X)\n",
" self.mn = self._mn(beta,self.sn,X,t)\n",
" def predict(self,x):\n",
" m = np.dot(self.mn.T,x)\n",
" s = np.sqrt(1.0/self.beta+np.dot(np.dot(x.T,self.sn),x))\n",
" return m, m-math.sqrt(s), m+math.sqrt(s)\n",
" \n",
" def _Sn(self,alpha,beta,X):\n",
" return np.linalg.inv(alpha*np.eye(len(X.T))+beta*np.dot(X.T,X))\n",
"\n",
" def _mn(self,beta,sn,X,t):\n",
" return beta*np.dot(np.dot(sn,X.T),t)"
]
},
{
"cell_type": "code",
"execution_count": 421,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def create_matrix(x,M):\n",
" \"\"\"\n",
" x: predictor variable data(array)\n",
" m: dimension (int>0) including intercept\n",
" \"\"\"\n",
" X = np.zeros((len(x), M), float) # make a matrix size of (data size - dimension)\n",
" for i in range(M):\n",
" X[:,i] = x**i\n",
" return X\n",
"\n",
"def truth(N,M):\n",
" x = np.linspace(0,1,N)\n",
" t = 0.5 + 0.4*np.sin(2*np.pi*x)\n",
" X = create_matrix(x,M)\n",
" return X,t\n",
"\n",
"def dataset(N,M):\n",
" x = np.linspace(0,1,N)\n",
" t = 0.5 + 0.4*np.sin(2*np.pi*x) + np.random.normal(0.0, 0.1, len(x))\n",
" X = create_matrix(x,M)\n",
" return X,t"
]
},
{
"cell_type": "code",
"execution_count": 447,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def fitting(X_train,t_train,a,b,X):\n",
" m = Model(a,b,X_train,t_train)\n",
" res = [m.predict(x) for x in X]\n",
" res_mean = list(map(lambda x:x[0],res))\n",
" res_low = list(map(lambda x:x[1],res))\n",
" res_high = list(map(lambda x:x[2],res))\n",
" return res_mean,res_low,res_high"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Main"
]
},
{
"cell_type": "code",
"execution_count": 451,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"a = 1.0/100**2 #alpha\n",
"b = 1.0/(0.3)**2 #beta\n",
"M = 8 # num parameters\n",
"\n",
"X, t_true = truth(500,M)"
]
},
{
"cell_type": "code",
"execution_count": 452,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nNloju43UsIxhGtR5EPN/Qs5aq03Fm7Q0f6mW5C9xx9Yl2lm2U8MyhmlE1xEa2W2kxvQYo1M6nRKa\nifTPP/+CvvnN7yg5uY8qKzfqmWee1JVXfqXev95aqabGHdXVRx5Bft5aqbbWPR7veUNeJ0kJCQcO\nYxr3cWKilJQkJSdLLVo07khJcY8MfiKWUK7QpKpqqrSsYJnm5c3Twi0LjyhSo7qP0qhuozS4y2Al\nJyb7jouA7CrbVVe4Fm1dpI82f6TC0kKN6jZKY3qM0dgeYzWmxxj1SOtxxK+tqZHKy91RUXHoY2Vl\n/Y6qqmP/t+LiMk2bNkM1NedLaiepWAkJizRu3HhZm3zCX19Z6YpPQoIrFocf+wtHEJ9PTDxQZvYX\nmqM9b8h/219i9heu2tojn9f34/0lcP85a+hRWen+31ortWrljtatDzw/0dG6tdS2rTvS0g48P/xz\nyfzTgmZGuUKg8kvyNS9vnuZtcseSrUt0UvuTNK7HOI3tOZYiFWLWum92B5eZoxWcxj7fU1qp7Xv2\naOeevSoqrVBpWbVU3VItatsqobaVaquSVVWRqNpao5YtVXekpBx4TElx3ygPP1q0OPrnj3Zs3rxB\njzzyrMrKflr3e2/d+jv67W9v1bBhp5zw1+8fcWGkJThVVVJZmTvKyw88P9FRWirt2XPkUVx86MfG\nHFq42rWTOnRwR/v2B54f7eO0NP5fo+EoV2i0qpoqLc1fWlek5m+ar6LyIo3rOU6n9zxd43qO05ge\nY5TeMt131NDbP1rTFKWmvq+trHQjJoeXmmM9P9F/P9HzlBSr7ZWbtGrnYq3c+bEWb5unFTsXamCX\nLE3oPV7je4/X+F7jjzq6FYlt27YpM/MUlZX9R9IwScvVqtVZyslZw9yrGFVRcWjh2r1b2rnz0GPX\nrqN/XFrqyliXLlJGxoHHYz1vzTq+EOUKDVBSWaJ5efM0O2e2ZufO1qIti9S3fV+d3vN0nd7rdJ3e\n83RldcwK/UTmg1nrfmqOtLxEWoZqapqv1Bzvcwme/9eVV5dr0ZZFmps3Vx/kfqAP8z5UanKqJvSe\noPG9XOEa3HlwxHO39s+5atEiU1VVOQ2ec4X4UVXlilZhoTsKCtxxrOdJSVKPHlLPngceDz569JA6\nd/b/dw1Ni3IV4yK5I2rH3h36IPcDzcmdo9k5s7V622qN7DZSkzInaVLmJI3rOU5pKWmNzlZb64pF\n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\npcaY4c2dMcxOdP6MMV8zxizbd3xgjBnqI2dY1efP377XnWaMqTLGXNac+cKsnn93s40xS4wxK40x\n/2nujGFWj7+7acaYGfv+3VthjLnWQ8xQMsY8Y4wpMMYsP85r+L5xDCc6f43+vmGtbZJD0oOS7tj3\n/E5Jvz7Ka7pKGr7veaqkTyWd0lSZwnzIFd31kjIltZC09PBzIelCSf/a93yspPm+c4flqOf5Gycp\nfd/zCzh/DTt/B73uPUmvS7rMd+4wHPX8s5cuaZWkHvs+7uQ7d1iOep6/H0v61f5zJ2mHpCTf2cNw\nSJogabik5cf473zfiOz8Ner7RlPuLXippL/ue/5XSZMPf4G1Nt9au3Tf8xJJn0jq0YSZwmyMpHXW\n2hxrbZWkaXLn8GCXSvqbJFlrF0hKN8ZkCFI9zp+1dr61tmjfh/MVv3/WjqY+f/4k6buSXpTEHcEH\n1OfcfU3SS9bazZJkrd3ezBnDrD7nz0pqu+95W0k7rLXVzZgxtKy1H0g63o1kfN84jhOdv8Z+32jK\nctXFWlsguRIlqcvxXmyM6SPXHhc0YaYw6yEp76CPN+nI/4mHv2bzUV4Tr+pz/g52g6Q3mjRRdDnh\n+TPGdJc02Vo7Vdy8crD6/NnrL6mDMeY/xpiFxphrmi1d+NXn/D0haZAxZoukZZJua6ZssYDvG8Gp\n9/eNpEi+ygkWGD3cMWfOG2NS5X4avm3fCBbQZIwxZ0m6Tm44GPX3qNwl/v0oWPWXJGmkpLMltZE0\nzxgzz1q73m+sqHG+pCXW2rONMSdLescYM4zvF2guDf2+EVG5staee5wgBcaYDGttgTGmq45xGcEY\nkyRXrP7XWvtqJHmi3GZJvQ/6eP+irIe/ptcJXhOv6nP+ZIwZJulPki6wrMl2sPqcv9GSphljjNy8\nlwuNMVXW2hnNlDGs6nPuNknabq0tl1RujJkt6VS5uUbxrj7n7zpJv5Ika+1n+9ZVPEXSx82SMLrx\nfSNCjfm+0ZSXBWdIunbf829IOlZx+ouk1dba3zdhlmiwUFI/Y0ymMSZZ0lflzuHBZkj6uiQZY8ZJ\n2r3/0itOfP6MMb0lvSTpGmvtZx4yhtkJz5+1tu++4yS5H4i+Q7GSVL+/u69KmmCMSTTGtJabWPxJ\nM+cMq/qcvxxJ50jSvvlC/SV93qwpw83o2CPJfN84sWOev8Z+34ho5OoEHpT0D2PM9XJ/Mf5bkowx\n3SQ9ba292BgzXtJVklYYY5bIXTq821r7ZhPmCiVrbY0x5hZJb8uV3mestZ8YY/6f+8/2T9bafxtj\nLjLGrJdUKvfTHFS/8yfpPkkdJD25b/Slylo7xl/q8Kjn+TvklzR7yJCq59/dNcaYtyQtl1Qj6U/W\n2tUeY4dGPf/s/VzS/xx0u/wd1tqdniKHijHmOUnZkjoaY3IlPSApWXzfqJcTnT818vsGi4gCAAAE\nqCkvCwIAAMQdyhUAAECAKFcAAAABolwBAAAEiHIFAAAQIMoVAABAgChXAAAAAfr/N87ihHW4CRsA\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a98c828>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N = 3\n",
"X_train,t_train = dataset(N,M)\n",
"m,l,h = fitting(X_train,t_train,a,b,X)\n",
"\n",
"fig,ax = plt.subplots(1,1,figsize=(10,7))\n",
"train_data = ax.scatter(X_train[:,1],t_train)\n",
"vis_true = ax.plot(X[:,1],t_true,'g')\n",
"vis_mean = ax.plot(X[:,1],m)\n",
"vis_low = ax.plot(X[:,1],l,'b--')\n",
"vis_high = ax.plot(X[:,1],h,'b--')"
]
},
{
"cell_type": "code",
"execution_count": 456,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlcAAAGnCAYAAACaQXIAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VVXaxuHfJiQQeu+QAKFLr4JoUCkWkKIo2EUHy6eO\nbSxjwTJYZkZn1FHRwS6WEVQQFEGJWJAepCXUhAABQkihpGd9fyyK9JDsZJ/y3Ne1rwQ4OeflEHKe\ns8q7HGMMIiIiIuKOcl4XICIiIhJIFK5EREREXKRwJSIiIuIihSsRERERFylciYiIiLhI4UpERETE\nReVLegeO41QA5gNhB+/vc2PMkyW9XxERERF/5LjR58pxnErGmAOO44QAvwB3GWMWlfiORURERPyM\nK9OCxpgDBz+tgB29UmdSERERCUquhCvHcco5jrMc2AHMMcYsduN+RURERPxNiddcARhjCoGujuNU\nA750HKe9MWbNH2/jOI5Gs0RERMRvGGOc4nydq7sFjTGZwDxgyEn+XFcxryeeeMLzGvz10nOn50/P\nn/9eev703Hl1lUSJw5XjOHUcx6l+8PNwYCAQV9L7FREREfFHbkwLNgTecxynHDasfWqMmeXC/YqI\niIj4nRKHK2PMSqCbC7XIKURHR3tdgt/Sc1cyev5KRs9fyej5Kz49d95xpc9VkR7IcUxZPZaIiIhI\nSTiOg/GFBe0iIiIiwU7hSkRERMRFClciIiIiLlK4EhEREXGRwpWIiIiIixSuRERERFykcCUiIiLi\nIoUrERERERcpXImIiIi4SOFKRERExEUKVyIiIiIuUrgSERERcZHClYiIiIiLFK5EREREXKRwJSIi\nIuIihSsRERERFylciYiIiLhI4UpERETERQpXIiIiIi5SuBIRERFxkcKViIiIiIsUrkRERERcpHAl\nIiIi4iKFKxEREREXKVyJiIiIuEjhSkRERMRFClciIiIiLlK4EhEREXGRwpWIiIiIixSuRERERFyk\ncCUiIiLiIoUrERERERcpXImIiIi4SOFKRERExEUKVyIiIiIuUrgSERERcZHClYiIiIiLFK5ERERE\nXKRwJSIiIuIihSsRERERFylciYiIiLhI4UpERETERQpXIiIiIi5SuBIRERFxkcKViIiIiIsUrkRE\nRERcpHAlIiIi4iKFKxEREREXKVyJiIiIuEjhSkRERMRFClciIiIiLlK4EhEREXGRwpWIiIiIixSu\n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\n3p+IiAShYAhWYKcC//IXBatA59q0oOM4w4FRxphrT/LnGrkSERERv+Arx9/cBHzj4v2JiIiI+J3y\np7uB4zhzgPp//C3AAH81xsw4eJu/AnnGmCmnuq8JEyYc/jw6Opro6Ogzr1hERALeW29BdDS0auV1\nJRIsYmJiiImJceW+Sjwt6DjODcAtwPnGmJxT3E7TgiIiUiSvvw6vvAK//go1anhdjQQjz6YFHccZ\nAjwADDtVsBIRETkTt94KF1wAI0fanYT+LDERcvQKGVRKuubqFaAKMMdxnGWO47zmQk0iIhLkHAf+\n9S/bD+rmm/23g3tBAVx2Gcya5XUlUpbURFRERHzWgQMwYACMGAEPPeR1NWfu9dfhk08gJsYGRvEf\n6tAuIiIBa9cu2LsXWrb0upIzk5gIPXrADz9Ax45eVyNnSuFKRETEhxQWwsCB9nDmh9Ve2y/5Sp8r\nERERAWbOhP374YEHvK5EvKCRKxEREZcZA5mZUL2615VIcWlaUEREgsorr9iPd97pbR0SuEoSrk7b\noV1ERMTXDB1q1zTt2QOPP66deOJbNHIlIiJ+aedOGDwYeve2I1lhYV5XJIFEC9pFRCTo1K8P8+dD\ncrLdlZeS4l0tL78Mmzd79/jiWxSuRETEb1WrBl9+aUewvDhixhg7Lfn661CpUtk/vvgmTQuKiIgU\nQ14e/PnP9nDp2bOhXj2vKxI3aUG7iIhIGUpJgauusuu8YmLUckGOpmlBEREJSIWF8Pe/24Xvbps6\n1S6k//prBSs5nkauREQkIGVlwbZt0L493HKL7YnVuLE7933rre7cjwQmjVyJiEhAqlwZ/vUviI21\nBz937AijRsEvvxT9PvLyIDe39GqUwKQF7SIiEhT27oUpU+zC8xEjjv/z+HhITITUVFi3DpYtgx9/\nhA8+sE1LJbjo+BsREZESevFFmDULateGqCjo1AkGDNAuwGClcCUiIiLiInVoFxEREfERClciIiIi\nLlK4EhEREXGRwpWIiIiIixSuRERERFykcCUiIiLiIoUrERERERcpXImIiIi4SOFKRERExEUKVyIi\nIiIuUrgSERERcZHClYiIiIiLFK5EREREXKRwJSIiIuIihSsRERERFylciYiIiLhI4UpERETERQpX\nIiIiIi5SuBIRERFxkcKViIiIiIsUrkRERERcpHAlIiIi4iKFKxEREREXKVyJiIiIuEjhSkRERMRF\n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\nSUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a32deb8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N = 4\n",
"X_train,t_train = dataset(N,M)\n",
"m,l,h = fitting(X_train,t_train,a,b,X)\n",
"\n",
"fig,ax = plt.subplots(1,1,figsize=(10,7))\n",
"train_data = ax.scatter(X_train[:,1],t_train)\n",
"vis_true = ax.plot(X[:,1],t_true,'g')\n",
"vis_mean = ax.plot(X[:,1],m)\n",
"vis_low = ax.plot(X[:,1],l,'b--')\n",
"vis_high = ax.plot(X[:,1],h,'b--')"
]
},
{
"cell_type": "code",
"execution_count": 457,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAGnCAYAAAAQbutBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcjeX/x/HXbWbsS5YJWWasiYjsCkPWKEv2rUQRafn6\nqrRZKkklLV8kSyGyl1RE9hTCZB37jJ2xD2bMcu7fH5fKL2ObOXPuc868n4/HecyMuefcH9Nk3uda\nPpdl2zYiIiIi4jkZnC5AREREJL1RABMRERHxMAUwEREREQ9TABMRERHxMAUwEREREQ9TABMRERHx\nsFQHMMuyCluWtdSyrG2WZW2xLOu561z3iWVZuy3LCrcsq2Jq7ysiIiLiqwLd8ByJwH9s2w63LCs7\nsMGyrJ9t24746wLLspoCJWzbLmVZVnVgLFDDDfcWERER8TmpHgGzbfuYbdvhV96/AOwACv3rshbA\n5CvXrAVyWZaVP7X3FhEREfFFbl0DZllWKFARWPuvTxUCDl718WGuDWkiIiIi6YI7piABuDL9OBt4\n/spIWEqfR2cjiYiIiM+wbdu63a9xywiYZVmBmPA1xbbt75K55DBQ5KqPC1/5s2TZtq1HCh6DBg1y\nvAZffuj7p++fvne++dD3T98/Jx8p5a4pyInAdtu2P77O5+cD3QAsy6oBnLVt+7ib7i0iIiLiU1I9\nBWlZ1gNAZ2CLZVmbABt4FQgBbNu2x9m2/aNlWQ9blrUHuAh0T+19RURERHxVqgOYbdu/AgG3cN2z\nqb2X3FhYWJjTJfg0ff9SR9+/lNP3LnX0/Usdff+cYaVm/jItWJZle1tNIiIiIsmxLAvbqUX4IiIi\nInLrFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwB\nTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBERERE\nPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBE\nREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTD\nFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERE\nRMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwB\nTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBEREREPEwBTERERMTDFMBERERE\nPEwBTERERMTD3BLALMuaYFnWccuyNl/n83UtyzprWdbGK4/X3XFfEREREV8U6KbnmQR8Cky+wTUr\nbdt+1E33ExEREfFZbhkBs217NXDmJpdZ7riXiIiIiK/z5BqwmpZlhVuW9YNlWWU9eF8RERERr+Ku\nKcib2QAUtW37kmVZTYFvgdLXu3jw4MF/vx8WFkZYWFha1yciIiJyU8uXL2f58uWpfh7Ltu3UVwNY\nlhUCfG/bdoVbuHY/UNm27dPJfM52V00iIiIiacmyLGzbvu1lVu6cgrS4zjovy7LyX/V+NUzwuyZ8\niYiIiKQHbpmCtCxrGhAG5LUs6wAwCMgI2LZtjwPaWJb1DJAAxALt3XFfEREREV/ktilId9EUpIiI\niPgKb5iCFBEREZFboAAmIiIi4mEKYCIiIiIe5qk+YCJe49IlOH8eXC6wbfMAyJULcuRwtjYREUkf\nFMDE58XHw969sGsXREXBkSNw9ChUrw59+lx7/TffwKuvgmVBhgzmrW1Dly7w3nvXXj97NowdC3nz\nQp485m1wMNSqBVWrpv3fT0RE/I92QYrP++YbeOMNuPtuCA2Fu+6CggWhYkWoVCn1z3/kCGzbBqdO\n/fOIjoYaNaBz52uvX7QIfvsNSpaEUqXM27x5U1+HiIh4n5TuglQAE692/DgsXw5Ll5pRqnHjnK7o\n5tauhQULYM8e2L3bPAICYMQI6NnT6epERMSdFMDEb1y4AKNGwdy5sH8/1KkD9etDgwZQrpzT1d0+\n24aTJ810Z3IjYaNGwb59ZsSuWjW45x4T2ERExPulNIBpDZh4nUyZ4Nw5+OgjeOABCPTxn1LLMmvG\nrqdWLUhKMqN8771n1q/dfz988glUuOnJqiIi4os0AiaOiY01o0NZszpdiXc5cwb++MOsX8uX79rP\nR0ZC0aJmRE1ERJylTvjiM06cgEGDzIL5RYucrsb75M4NDRsmH75sGx57zIyotWxpRgm3bPmnlYaI\niPgGBTDxmN274emnzW7FY8dgxQpo1crpqnyLZcGGDbB5M3ToADt3QosWUKaM6WsmIiK+QVOQ4hE7\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10afaad30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N = 5\n",
"X_train,t_train = dataset(N,M)\n",
"m,l,h = fitting(X_train,t_train,a,b,X)\n",
"\n",
"fig,ax = plt.subplots(1,1,figsize=(10,7))\n",
"train_data = ax.scatter(X_train[:,1],t_train)\n",
"vis_true = ax.plot(X[:,1],t_true,'g')\n",
"vis_mean = ax.plot(X[:,1],m)\n",
"vis_low = ax.plot(X[:,1],l,'b--')\n",
"vis_high = ax.plot(X[:,1],h,'b--')"
]
},
{
"cell_type": "code",
"execution_count": 455,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAGnCAYAAAAQbutBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4FPXaxvHvBNIoCQZCE0moB1A6CKIciqAiFixHRD02\nLIhdXxU79l6PCKLYQIqIIh4LyoEIipJIkS41gLQE6ZC+z/vHAFIS0jY7m+T+XNdeEDLMPLO7sHd+\n1TEzRERERCRwQrwuQERERKS8UQATERERCTAFMBEREZEAUwATERERCTAFMBEREZEAUwATERERCbBi\nBzDHceo5jjPdcZwljuMschznjjyOe9NxnJWO4yxwHKdNca8rIiIiUlpV9MM5soF7zGyB4zhVgLmO\n43xvZssPHuA4Th+gkZk1cRynEzAC6OyHa4uIiIiUOsVuATOzLWa24MDv9wLLgBOPOuxC4OMDx8wB\noh3HqVXca4uIiIiURn4dA+Y4TjzQBphz1LdOBDYc9vVGjg1pIiIiIuWCP7ogATjQ/fgZcOeBlrCi\nnkd7I4mIiEipYWZOYf+OX1rAHMepiBu+RpvZl7kcshE46bCv6x34s1yZmR5FeDz++OOe11CaH3r+\n9PzpuSudDz1/ev68fBSVv7og3weWmtkbeXx/CnA1gOM4nYGdZrbVT9cWERERKVWK3QXpOM7pwJXA\nIsdx5gMGPATEAWZmI83sG8dxznUcZxWwD7iuuNcVERERKa2KHcDM7GegQgGOu62415Lj6969u9cl\nlGp6/opHz1/R6bkrHj1/xaPnzxtOcfovS4LjOBZsNYmIiIjkxnEczKtB+CIiIiJScApgIiIiIgGm\nACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIi\nIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApg\nIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiIS\nYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYi\nIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGmACYiIiISYApgIiIiIgGm\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10a72c940>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N = 100\n",
"X_train,t_train = dataset(N,M)\n",
"m,l,h = fitting(X_train,t_train,a,b,X)\n",
"\n",
"fig,ax = plt.subplots(1,1,figsize=(10,7))\n",
"train_data = ax.scatter(X_train[:,1],t_train)\n",
"vis_true = ax.plot(X[:,1],t_true,'g')\n",
"vis_mean = ax.plot(X[:,1],m)\n",
"vis_low = ax.plot(X[:,1],l,'b--')\n",
"vis_high = ax.plot(X[:,1],h,'b--')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment