『ベイズ推論による機械学習入門』補足メモ (1/n)

『ベイズ推論による機械学習入門』が教科書然としていて内容が頭に入らないので、自分の解釈をメモ。数学的な厳密性は全く考慮していな。

### 1.2.1 回帰
$M$個の特徴量から、ある値$y$を求めようとする試み。入力データがN個あるとき、これを下記のような$N \times (M + 1)$の表として考えることができる (この表にあるデータは、回帰を実行する以前に取得しているものとする)。

| | 特徴量1 | 特徴量2 | $\cdots$ | 特徴量M | y |
|:-:|:-:|:-:|:-:|:-:|:-:|
|データ1| $x_{11}$ | $x_{12}$ | | $x_{1M}$ | $y_1$
|データ2| $x_{21}$ | $x_{22}$ | | $x_{2M}$ | $y_2$
|$\vdots$|
|データN| $x_{N1}$ | $x_{N2}$ | | $x_{NM}$ | $y_N$

(特徴量1~Mから成る) 新たなデータD行が与えられた際に、それが何の値yを取るかを求めるのが回帰。基本的な方針は、$ax_{11}+bx_{12}+\cdots+mx_{1M}=y_1$ (表1行目) を満たしかつ、$ax_{21}+bx_{22}+\cdots+mx_{2M}=y_2$ (表2行目) を満たしかつ、$\cdots$、$ax_{N1}+bx_{N2}+\cdots+mx_{NM}=y_N$ (表N行目) を満たすような、$\\{a, b, \cdots, m\\}$の組み合わせを見つけるというもの。そんな$\\{a, b, \cdots, m\\}$であれば、未知のデータに対しても正しいyを導くに違いない。

$a, b, \cdots, m$を$w_a w_b \cdots w_m$と置き換えて、下記のようにも表現できる。この場合、下記の条件を満たす$\textbf{w}=[w_a w_b \cdots w_m]$を探すことが課題となる。$\textbf{w}$は「重み」とも呼ばれる。

$$
\begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1M} \\\\
x_{21} & x_{22} & \cdots & x_{2M} \\\\
\vdots \\\\
x_{N1} & x_{N2} & \cdots & x_{NM} \\
\end{bmatrix}
\begin{bmatrix}
w_a \\\\ w_b \\\\ \vdots \\\\ w_m
\end{bmatrix}
\=
\begin{bmatrix}
y_1 \\\\ y_2 \\\\ \vdots \\\\ y_N
\end{bmatrix} \\\\
$$

### 1.2.2 分類
次に、yを0~1に押し込めるような変換を考える。つまり、$y_1$から$y_N$までの全てのyの中で最大の絶対値を$|y_{max}|$として、下記表のような状況を考える。そして、$y>0.5$をPositive、$y<=0.5$をNegativeと**定める**。そうすれば回帰と同じ要領で、新たなデータDが与えられた際に、それがPositiveかNegativeかを計算・判定できる。

| | 特徴量1 | 特徴量2 | $\cdots$ | 特徴量M | y |
|:-:|:-:|:-:|:-:|:-:|:-:|
|データ1| $x_{11}$ | $x_{12}$ | | $x_{1M}$ | $\frac{\|y_1\|}{\|y_{max}\|}$
|データ2| $x_{21}$ | $x_{22}$ | | $x_{2M}$ | $\frac{\|y_2\|}{\|y_{max}\|}$
|$\vdots$|
|データN| $x_{N1}$ | $x_{N2}$ | | $x_{NM}$ | $\frac{\|y_N\|}{\|y_{max}\|}$

実際のところ上記のyの変換は (簡易な説明のため) かなり強引で、少なくともMinMax変換と呼ばれる$\frac{y_n-y_{min}}{y_{max}-y_{min}}$を適用すべき場面ではある。更に言うと、下記のようなシグモイド関数を使うことで、どんな値も0~1に押し込むことができる。

<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/8c1679ff-d0ab-9b1e-a4f8-23f7c69ac1ac.png">

シグモイド関数では、絶対値が6以上のものは全て (ほぼ) 0か1に変換される。そのため重みを計算する際は、絶対値が大きくなりすぎないように考慮する必要がある (一般的な機械学習ならば自動で考慮される)。

### 1.4.1 確率分布

例えばPythonで`import random; random.random()`と打つと、0から1までの値がランダムで返ってくる。この状況を横に返り値、縦に確率を取ったグラフで表すと、下図のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/efcec6e2-8f0c-8f14-31fc-ffac458c79fe.png)
横軸を見ると、0から始まって1で終わっている。縦軸目盛りに数字はないが、$\Delta$ (= ほぼ0)で一定と考えられる。例えば`random.random()`で"0.500000ちょうど"が返ってくる確率はとても低い。0から1の間に実数が仮に$\infty$個あるとすれば、"$0.500000$ちょうど"が出る確率は$\frac{1}{\infty}$だ。一方で「"0.500000ちょうど"が出ることは絶対にない」とも言えないので、確率は0にはならない。この議論が"0.49999"にも"0.49998"にも他の実数にも当てはまるので、前述の通り、0から1の全ての実数・横軸に対して縦軸は$\Delta$で一定になる。

ところで上記の例で、"$0.500000$ちょうど"が出る確率は$\Delta$でしかないけれど、0から1のどれかが返る確率は1だ (0から1の数字どれかは必ず返る)。「"$0.500000$ちょうど"が出る確率」を$P(0.500000)$と書くことにすれば、①$P(0.500000)=\Delta$かつ②$P(0.00000)+P(0.00001)+\cdots+P(0.500000)+\cdots+P(1.00000)=1$と表すことができる。②はもっと数学っぽく、$\int_{x=0}^1P(x)\textrm{d}x$とも書ける。こんな風に、「個々の値が出る確率をはっきりと言えない[^prob]けれど、足したら1になるような分布」のことを (確率分布ではなく) **確率密度関数** (PDF) と呼ぶ。

`random.random()`の確率密度関数についてはもう少し言えることがあって、例えば0.5以下の数値が返る確率は1/2 (=50%) と直感的に分かる。0.8以下の数値が返る確率は80%だ。この「ある数値以下の値が返る確率」をグラフにしたものは**累積分布関数** (CDF) と呼ばれていて、今回の例で言えば下図のようなものになる。累積分布関数は確率密度関数の値を左から右へ次々に足し込んでいったものになっていて、右端の縦軸の値は必ず1になる[^must1]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/91e2a428-0dd7-73a9-1034-de48a57363ec.png)

ところで、確率密度関数の縦軸[^1]の合計[^2]は1でないといけない[^3]けれども、横軸に関して制限はない。なので、(プラスマイナス全て含めた) 実数全てを横軸として考慮するような確率密度関数も考えることもできる。そんな自作関数`random_all_real_number()`は、自分で定めた確率分布に則って、全ての実数から何か1つを返す。ここで全く任意の決めごととして、1や-3程度の普段見慣れた実数は頻繁に返ってきて、10000000のような (絶対値が) 大きな実数はあまり返ってきて欲しくないとする。`random.random()`関数は横軸が0から1までで、全て一定の縦軸$\Delta$を持つ確率密度関数を利用していた。一方、`random_all_real_number()`関数では「横軸は実数全体」で「0近辺の縦軸が大きい」ような確率密度関数を利用することになる。例えば、下記のような形状の確率密度関数が考えられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/72285dcd-57ea-b9c6-8564-6c8567d7b985.png)

正規分布 (ガウス分布; $\mathcal{N}(x)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\\{-\frac{(x-\mu)^2}{2\sigma^2}\\}$) で知られるこの形状は、0近辺の値が返りやすくなっていて、縦軸の合計を取ると1になる ($\int \mathcal{N}(x)\textrm{d} x=1$)[^4]。Pythonならば、`random.gauss(0, 1)`を呼ぶと、正規分布に則った (0近辺の値が返りやすいような) 実数が得られる。累積分布関数は下図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/14a826b9-3241-9f83-4bd4-f69eb6e8aa0a.png)

`random.random()`も`random.gauss(0, 1)`も、「0から1までの値をランダムに選び、それぞれの累積分布関数を逆に適用した値を返す関数である」とも言える。確率密度関数は、あるブラックボックスな関数 (例えば`blackbox()`) に結びついていると考えることができる。`blackbox()`がランダムに返す①値の範囲と、②どんな値が出やすいかを規定しているのが確率密度関数である。

### 1.4.2 確率分布の推論
正確な記述を見つけられなかったのだが、確か[タレブ](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%82%B7%E3%83%A0%E3%83%BB%E3%83%8B%E3%82%B3%E3%83%A9%E3%82%B9%E3%83%BB%E3%82%BF%E3%83%AC%E3%83%96)の本に、「梅雨の時期、①『今日の夕方から雨が振り出して明日も雨が続く確率』と、②『明日に雨が降る確率』のどちらが高いかを人に聞くと、多くの人は①と答える」というような記述があった。①は今日の夕方過ぎから雨が振らないといけない分だけ条件が厳しいので、実際は明日に雨が降れば良いだけの②の確率の方が高い[^rainprob]。

上記の要領で、「③今日は晴れだが明日は雨」と「④今日は曇りで明日は雨」も考えることができる。この状況を、下記のように記述してみる。$P$は確率 (Probability) を表しており、"$P(x, y)$" は "$x$が起こりかつ$y$が起こる確率"と読み、**同時確率**と呼ばれる ($x$と$y$は可換)。
- ①: $P(今日雨, 明日雨)$
- ②: $P(明日雨)$
- ③: $P(今日晴れ, 明日雨)$
- ④: $P(今日曇り, 明日雨)$

天気の種類が晴れ・曇り・雨の3つしかなく、重なって起こることもないとすれば、$P(明日雨) = P(今日晴れ, 明日雨) + P(今日曇り, 明日雨) + P(今日雨, 明日雨)$である[^rain]。
また逆に、$P(今日雨) = P(今日雨, 明日晴れ) + P(今日雨, 明日曇り) + P(今日雨, 明日雨)$も成り立つ[^ref]。

これらが成り立つのは、天気の種類を晴れ・曇り・雨の3つに絞っており、だからこそ$P(今日晴れ)+P(今日曇り)+P(今日雨)=1$ かつ $P(明日晴れ)+P(明日曇り)+P(明日雨)=1$であるという事実に強く依存している。

このように、ある1つの変数に注目してその変数全てを足し合わせる操作は**周辺化**と呼ばれる[^marginal]。数学っぽく書くと、$P(明日雨)=\int P(今日の天気, 明日雨) \textrm{d}x$となる。

他に今日雨が降ったとして、明日の雨が降る確率はどうなるか、は**条件付き確率**と呼ばれる[^cond]。数学っぽく書くと、$P(明日雨|今日雨)=\frac{P(\textrm{今日雨, 明日雨})}{P(今日雨)}$となる。左辺では`|`を使った新たな記法が導入されていて、右辺では条件として確定している事項 (= 今日雨) の確率を割り引いている。

上記の「今日雨」と「明日雨」を入れ替えると、$P(今日雨|明日雨)=\frac{P(\textrm{明日雨, 今日雨})}{P(明日雨)}$である。$P(x,y)=P(y,x)$であったので、$P(明日雨|今日雨)=\frac{P(今日雨|明日雨)P(明日雨)}{P(今日雨)}$が成り立ち、これは**ベイズの定理**と呼ばれる。

実際のところ、今日の天気は明日の天気と関係があると予想される。この場合、$P(今日雨, 明日雨)\neq P(今日雨)P(明日雨)$である。「今日雨が降ったという事実 (条件)」が「明日の雨を降る確率 (の予測) に影響を与える」という状況が、右辺では表現できていない。一方で、今日雨が降った事実は、明日サイコロを降って6が出る確率には全く影響しないと考えられる。これは$P(今日雨, 明日サイコロ6)= P(今日雨)P(明日サイコロ6)$と書くことができ、「今日雨」と「明日サイコロ6」は**独立**であると言われる。

### プログラムからの解釈
下記のような、天気の確率を返すプログラムを考えることができる。
```clojure
;; Clojure
(defn P
  ([today] (case today
             :sunny 0.3
             :cloud 0.5
             :rain 0.2))
  ([tomorrow today] (case today
                      :sunny (case tomorrow
                               :sunny 0.3
                               :cloud 0.5
                               :rain 0.2)
                      :cloud (case tomorrow
                               :sunny 0.3
                               :cloud 0.5
                               :rain 0.2)
                      :rain (case tomorrow
                              :sunny 0.2
                              :cloud 0.5
                              :rain 0.3))))
```
引数1つで`(P :cloud)`と呼んだ場合、今日の天気が曇りになる確率 (=0.5) を返す。引数を2つで`(P :sunny :rain)`と呼ぶと、今日の天気が雨だった場合に、明日が晴れである**条件付き確率** (=0.2) を返す。
今日が雨になりーかつー明日が晴れであるような**同時確率**は、$P(x|y)=\frac{P(x, y)}{P(y)}\Leftrightarrow P(x,y)=P(x|y)P(y)$より、`(* (P :sunny :rain) (P :rain))`で求まり、ここでは0.04。「今日が雨になる」確率を考慮する分、条件付き確率よりも結果が小さくなっている。ここで、同時確率 (Joint Probability) を求める関数を下記のように定義する。
```clojure
(defn Pj [tomorrow today]
  (* (P tomorrow today) (P today)))
```
明日が雨になる確率を**周辺化**で求める場合、`(+ (Pj :rain :sunny) (Pj :rain :cloud) (Pj :rain :rain))`を実行すれば良く、0.22という数字が求まる。明日の天気を求める関数も、下記のように定義できる。
```clojure
(defn Pt [tomorrow]
  (+ (Pj tomorrow :sunny) (Pj tomorrow :cloud) (Pj tomorrow :rain)))
```
そうすると`[(Pj :rain :sunny) (* (Pt :rain) (P :sunny))]`の結果が`[0.06 0.066]`となり、同時確率と、確率の積とが異なる値を持つことが分かる。これより、今日・明日の天気が**独立でない**ことが確かめられた。

さらに**ベイズの定理**を利用して、明日の天気が晴れだった場合に今日が雨である確率を、`(/ (* (P :rain :sunny) (P :sunny)) (P :rain))より0.3と求めることもできる。
`

### 1.4.5 逐次推論
今日・明日だけでなく、明後日の天気まで考えたいとする。そうすると、今日明日と雨が続いた場合に、明後日も雨が降る条件付き確率は$P(明後日雨|今日雨, 明日雨)$と表現される。明後日雨=A, 今日雨=B1, 明日雨=B2とすると、[下記のように変形ができる](https://jonathanweisberg.org/vip/multiple-conditions.html)。
$$
\begin{align*}
ベイズの定理より \\\\
P(A|B_1, B_2) &= \frac{P(B_1, B_2|A)P(A)}{P(B_1,B_2)} \\\\
B_1, B_2が独立ならば \\\\
P(A|B_1, B_2) &= \frac{P(B_1|A)P(B_2|A)P(A)}{P(B_1)P(B_2)} \\\\
また、ベイズの定理より \\\\
P(A|B_1) &= \frac{P(B_1|A)P(A)}{P(B_1)} \\\\
&= P(A)\frac{P(B_1|A)}{P(B_1)} \\\\
なので、下記のように表現できる \\\\
P(A|B_1, B_2) &= P(A) \frac{P(B_1|A)}{P(B_1)} \frac{P(B_2|A)}{P(B_2)} \\\\
&= P(A)\frac{P(A|B_1)}{P(A)}\frac{P(A|B_2)}{P(A)} \\\\
&(= P(A)\frac{\\{P(B_1|A)P(B_2|A)\\}}{\\{P(B_1)P(B_2)\\}}) \\\\
一般に \\\\
P(A|\textbf{B}) &= P(A)\prod \frac{P(A|B_i)}{P(A)} \\\\
&(=P(A)\frac{\prod P(B_i|A)}{P(\textbf{B})}) \\\\
これらを変形して一般に、下記のように書ける \\\\
P(A, \textbf{B}) &= \frac{P(A|\textbf{B})}{P(\textbf{B})} \\\\
&= P(A) \prod P(B_i|A) 
\end{align*}
$$

ただし今回の天気の例では、日ごとの天気が独立ではない (今日の天気の結果が分かると、明日の天気の予想を更新する必要がある) ので、この関係を適用することはできない。

### 3.1.1 パラメータの事前分布
Pythonでの[`random.uniform()`](https://note.nkmk.me/python-random-randrange-randint/)関数を元に、下記の状態を考える。
1. 適当に決めた実数$\theta$とそれにマイナスを掛けたものを、`random.uniform()`に引数として与える。つまり`random.uniform(-θ, θ)`であり、これは$-\theta$以上$\theta$以下の値を返す。
2. 実際には`random.uniform()`の逆関数である、`inv_uniform()`という自作関数を利用する。これは適当な実数を与えると、その実数が`random.uniform(-θ, θ)`で選ばれる確率を返す。つまり、与えた実数が$-\theta$以上$\theta$以下であれば$\Delta$を、そうでなければ0を返す。
3. $\theta$の値は最初に一度ランダムに決まり、私達はその値を見れないものとする。

つまり、下記のような状況である。どうやら$\theta$は、10よりは大きいが、10000よりは小さいらしい。
```python
# Python
import random
theta = random.random() * 1000000
def inv_uniform(x):
    if -theta < x < theta:
        return 0.00000001
    else:
        return 0
    
inv_uniform(10) # => 0.00000001
inv_uniform(10000) # => 0
inv_uniform(-3) # => 0.00000001
```

これを前述の確率的な表現で書くと、下記のようになる。
- $P(arg=10|param=\theta) = 0.00000001$
- $P(arg=10000|param=\theta) = 0$
- $P(arg=-3|param=\theta) = 0.00000001$

ベイズの定理$P(x|y)=\frac{P(y|x)P(x)}{P(y)}$より、下記に変換もできる。これらは、ある結果・データが得られたときの$param=\theta$の確率を表現している。
- $P(param=\theta|arg=10)=\frac{P(arg=10|param=\theta)P(param=\theta)}{P(arg=10)}=0.00000001\cdot\frac{P(param=\theta)}{P(arg=10)}$
- $P(param=\theta|arg=10000)=\frac{P(arg=10000|param=\theta)P(param=\theta)}{P(arg=10)}=0$
- $P(param=\theta|arg=-3)=\frac{P(arg=-3|param=\theta)P(param=\theta)}{P(arg=10)}=0.00000001\cdot\frac{P(param=\theta)}{P(arg=-3)}$

$P(param=\theta)$は全ての実数の中から、今回のパラメータとして$\theta$が選ばれる確率なので、$\Delta$とすることができる。$P(arg=10)$は分かりにくいが、周辺化の議論を思い出せば、パラメータに色々な値を入れた同時分布を取ってきてそれらを足し合わせたものだと分かる ($\int P(arg=10, param=x)\textrm{d}x$)。

上記ベイズの処理によって、$arg=10000$の元での条件付き確率は$P(param=\theta, arg=10000)=0$であり、$\theta$の値を絞り込むことができた。これはささやかながら現実・データの特徴を捉えたということになり、**学習**と呼ばれる。

これは「あるパラメータの元であるデータが得られる確率」を、ベイズの定理によって「あるデータが得られた場合にあるパラメータが設定されている確率」に逆転させて求めているとも言える。「寝ている間に雨が降っていた」というパラメータからは、地面が濡れているというデータ・観測がほぼ確実に得られる ($P(地濡れ|寝雨)=0.99$)。では逆に、「寝ていて外の様子は知らないが、起きてみると地面が濡れていた」という状況で、「寝ている間に雨が降っていた確率」はどの程度だろうか。これは、ほぼ確実とまでは言えない[^sleep]。道路の清掃が入ったのかもしれないし、何かドラマの撮影で利用されていたのかもしれない。$P(寝雨|地濡れ)=P(地濡れ|寝雨)P(寝雨)/P(地濡れ)=0.99\times P(寝雨)/P(地濡れ)$より、「どんな理由でも構わないから地面が濡れる確率」が大きいと、「寝ている間に雨が降っていた確率」を低く評価することになる。そしてふと向こう側を見ると、見たことのある俳優がびしょ濡れでスタッフと「今回の撮影は大変でしたねー」と話している。そうすると条件付き確率は1.4.5節の式の要領で、$P(寝雨|地濡れ,撮影)=P(寝雨|地濡れ)\frac{P(寝雨|撮影)}{P(寝雨)}$に更新・学習したいところだが、地濡れと撮影が独立ではないので、この変形はできない。できるのはベイズを適用することだけで、$P(寝雨|地濡れ,撮影)=\frac{P(地濡れ,撮影|寝雨)P(寝雨}{P(地濡れ,撮影)}=\frac{P(地濡れ|寝雨,撮影)P(撮影|寝雨)P(寝雨}{P(地濡れ|撮影)P(撮影)}$である。分子は「雨が降ったとして撮影が行われる確率と寝雨が降る確率との積」示しており、分母は「撮影があって地面が濡れる確率と、そもそも撮影がある確率との積」を示している。ここでは$P(寝雨|地濡れ,撮影)\simeq P(寝雨)$となり、撮影を観察する前よりも「寝ている間に雨が降っていた」確率は少し下がっていると言える。

### 3.3 1次元ガウス分布の学習と予測
次に、分散が1 ($\sigma^2=\frac{1}{\lambda_x}=1$)で、平均$\theta$を-10~10からランダムで取る正規分布を考える。そして、この正規分布のPDFに則ってランダムに値を100個取得して、保存する。
```clojure
;; Clojure
(ns user
  (:require [clojure.core :refer :all]
            [kixi.stats.distribution :refer [normal draw]]))

(def theta (* (- (rand) 0.5) 2 10))

(def data (for [_ (range 100)] (draw (normal {:mu theta :sd 1}))))

data
;; (8.306915290931675
;;  8.607457799881324
;;  7.068684912008853
;;  ...
```

この保存されたデータから$\theta$を求めるにはどうすれば良いかを考える。そのものズバリの値を予測するというよりは、一番ありえそうな値は〇〇でその確率は△△、全体的にはこれくらいの値までは$\theta$である可能性がある、ということを求めたい。実際この$\theta$の予測分布は正規分布になることが分かっていて、$\lambda_\mu$を決め打ちされた$\theta$正規分布の初期精度 (=1)、$m$を決め打ちされた$\theta$正規分布の初期平均値 (=0) とすると、そのパラメータは下記の通り。

- $\hat \lambda_\mu = N\lambda_x + \lambda_\mu$
- $\hat m = \frac{\lambda\sum^N_{n=1}x_n+\lambda_\mu m}{\hat \lambda_\mu}$

これらを素直に計算して、計算されたパラメータを利用して正規分布を描けば、それが$\theta$の確率密度関数となる。
```clojure
(def lambda-hat (+ (* (count data) 1) 1))

(def m-hat (/ (+ (* 1 (apply + data)) (* 1 0)) lambda-hat))

[(float (/ 1 lambda-hat)) m-hat]
;; [0.00990099 7.846653394871308]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325849/6afa1cc9-f686-9e83-374d-5a0821a48128.png)

$\theta$の尤もありえそうな値は7.8466...で、7.81~7.88にはほぼほぼ入っていると言えそうである。実際に$\theta$の値を確認してみると、値は7.8101...であった。
```clojure
theta
;; 7.810125860107345
```

今回は$\theta$の真の値が分かっているが、現実ではこのようなパラメータは分からないことが多い。そこで、分散が1 ($\sigma^2=\frac{1}{\lambda_x}=1$)で、平均$\theta$を上で推定された正規分布として、正規分布を求める。つまり、正規分布は一般に$\mathcal{N}(x|\theta,\lambda_x^{-1})$と書けるが、この平均部分に$\mathcal{N}(x|\mathcal{N}(\theta|\hat m, \hat \lambda_\mu^{-1}),\lambda_x^{-1})$のようにして正規分布が入れ子になった状況を考える。

確率分布を1つ消したければ、同時確率の周辺化を行えば良いのであった。よって、$P(x_\*)=\int P(x_\*, \theta)\textrm{d}\theta=\int P(x_\*|\theta)P(\theta)\textrm{d}\theta=\int \mathcal{N}(x_\*|\theta,\lambda_x^{-1}) \mathcal{N}(\theta|\hat m, \hat \lambda_\mu^{-1}) \textrm{d}\theta$となり、これを計算していくと、下記の式が導かれる。

$$
P(x_\*)=\mathcal{N}(x_\*|\hat m, \lambda^{-1}_\*)
$$

$$
\lambda^{-1}_\* = \frac{\lambda_x \hat \lambda _\mu}{\lambda_x + \hat \lambda _\mu}
$$

[^1]: $P(x)$
[^2]: $\int P(x)\textrm{d}x$
[^3]: $\int P(x)\textrm{d}x=1$
[^4]: 「なぜ都合良く合計が1になるのか」という疑問は方向が逆で、正規分布は合計が1になるように係数が設計されている。
[^prob]: 確率密度関数でどんなに高い確率が期待されていても、ある実数ちょうどそのものが出る確率は常に$\Delta$。
[^norm]: 例えば[このサイト](https://www.statology.org/quick-normal-cdf-calculator/)で、$\mu=0, \sigma=1, lower bound=-10000, upper bound=-1$のような値を入れて計算できる。
[^must1]: $\int P(x)\textrm{d}x=1$なので。
[^rain]: これは定義でもある。明日雨が降る際の経路は晴れ→雨、曇り→雨、雨→雨しかなく、明日雨が降る確率はこれらの確率を足し合わせたものになる。
[^rainprob]: とは言え日常会話の範疇で言えば、②は「今日の夕方に雨が降っておらず」明日に雨が降る確率、と理解されるはず。なので、通常の会話という条件下であるなら、①の確率が高いと答えてもあながち間違いとは言えない。
[^ref]: これも定義に近い。今日雨が降ったとして、そこからの経路は雨→晴れ、雨→曇り、雨→雨しかない。晴れ・曇り・雨のどれかに推移する確率は1 (どれかには必ず成る) のだから、「今日雨が降る確率」と「今日雨が降って、明日何でも良いので何かが起こる確率」は等しくなる。
[^cond]: 同時確率$P(x,y)$と条件付き確率$P(x|y)$の違いが、最初は分からなかった。これは「明日の天気」と「明後日の天気」で考えると分かりやすい。条件付き確率$P(明後日雨|明日雨)$では、明日雨が降ったとして、明後日雨が降る確率を考える。そのため、この確率はある程度高くなることが予想される。一方で同時確率$P(明後日雨, 明日雨)$は、そもそも明日雨が降るかどうかも考慮して確率を考える必要がある。
[^marginal]: Wikipediaの[周辺分布のページ](https://ja.wikipedia.org/wiki/%E5%91%A8%E8%BE%BA%E5%88%86%E5%B8%83)にあるように、2変数＋確率の3次元で表される立体的な確率密度関数に周辺化を行うと、その周辺分布は立体を形成する平面に張り付くような形を取る。この周辺に張り付かせるイメージから、周辺化と呼ばれているのだと考えている。周辺化はmarginalizingの和訳で、この単語にはフチという意味もある。
[^sleep]: 雨が降れば地面が濡れる確率は99%だが、そもそもの雨が降る確率を考慮しなければならない。