# 機械学習に必要な数学の基礎

本章では，ディープラーニングを含めた機械学習に必要な数学の基礎である「微分」「線形代数」「確率・統計」の3つについて，簡潔に紹介していきます．

## 機械学習とは

機械学習は，コンピュータがデータから学習することで，そのデータに含まれる規則や判断基準などのパターンを抽出する関数を獲得し，その関数を用いて新たなデータについて予測を行う手法です．機械学習技術は現在では，画像認識，音声認識，文書分類，医療診断，迷惑メール検知，商品推薦など，幅広い分野に応用されています．

ここで，学習によって獲得される関数（**モデル**ともよばれます）は多くの場合**パラメータ**によって特徴づけられており，パラメータを決めればその関数の挙動が決まります．最も単純な例として直線の関数を考えると，これは傾き$a$と切片$b$の2つのパラメータで特徴づけられ，$f(x; a, b) = ax + b$のように表記します．（ここで$x$は関数の**入力変数**とよびます．また$；$の後ろにパラメータを表記します）．機械学習の目標は，データを使ってこれらのパラメータを決定することです．

機械学習は，**目的関数**とよばれる関数を最小化（または最大化）することで学習，つまり望ましい挙動をするようなパラメータを決定します．そのため，目的関数はモデルの出力値が望ましい場合には小さな（または大きな）値をとり，そうでない場合は大きな（または小さな）値をとるように設計します．

例えば，モデルの入力と出力のペアからなるデータセット$D=\left((x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n) \right)$が与えられたとします．ここで，$x_{i}$は$i$番目のサンプルの入力，$y_{i}$は$i$番目のサンプルの出力を表します．これらの点の近くをできる限り通るような直線$f(x; a, b) = ax + b$を求めたいとします．出力が実数値の場合，パラメータ$\theta = (a, b)$とおいて，次のような目的関数がよく利用されます．

$L( \theta) = \sum_{i=1}^n (y_i - f(x_i; \theta))^2$

この関数を最小化することを考えます．上式では，モデルの予測値$f(x_i; \theta)$と正解$y_i$との二乗誤差を求め，その合計値を計算しています．全てのデータで予測と正解が一致する時だけ$0$，それ以外は，大きく間違えるほど大きな正の値をとります．間違えた度合いを測る関数を，特に**損失関数**とよぶこともあります．また，与えられたデータセット全体に対するペナルティの合計値を求めるような目的関数は**コスト関数**ともよばれることもあります．目的関数の引数は$\theta$となっており，目的関数を最小化する最適な$\theta$を求めることで，データセット$D$を精度良く予測する関数$f(x; \theta)$が得られることになります

目的関数の最小化問題を解くためには微分と線形代数の知識が必要になります．ただし，微分と線形代数の全ての知識は必要ありません．以降，機械学習の理解に必要な最低限の知識を説明します．

## 微分

関数のある入力値における微分は，その点におけるグラフの**接線の傾き**に相当し，下図のように関数に接する直線として表すことができます．

例えば上図の関数においては，$a$の点における接線は赤い直線であり，その傾きは$+3$となっています．右肩上がりな直線の傾きは正の値になります．

それに対し，次の図の$b$の点においては，傾きは$-1$であり，接線は右肩下がりの直線となっています．

もし目的関数の値が全てのパラメータについて計算できているならば，その中から目的関数の最小値を選び出すのは可能ですが，そのようなことは通常不可能です．しかし，ある点でのパラメータに関する微分を計算できれば，接線の傾きを求めることができ，パラメータ全域のグラフ形状がわからなくても，パラメータを変化させた時に目的関数がどう変化するのかが分かります．この情報に基づいて，目的関数を小さくするようにパラメータを更新することができます．

再度，微分の説明に戻り，その定義や多変数入力，多変数出力の場合について詳しくみていきます．

### 2点間を通る直線の傾き

はじめに，微分の原理を理解していくために，下図に示す2点間を通る直線の傾き$a$を求めてみましょう．

この時，傾き$a$は，

$$
a = \dfrac{f(x_{2}) - f(x_{1})}{x_{2}-x_{1}}
$$

と求まります．

### 1点での接線の傾き

次に，与えられた関数の接線の傾きを求めていきます．そのためには，**極限**の考えが必要になります．極限では，変数がある値に限りなく近づくとき，その変数によって記述される関数がどのような振る舞いをするか考えます．極限を表すために，$\lim$ という記号が一般的に用いられます．例えば，

$$
\displaystyle \lim _{x\rightarrow 0}3x=3\times 0=0
$$

は，$x$という変数を$0$に近づけていったときに式の値がどのような値になるかを与えます．

それでは，下図のある点$x$における接線の傾き$a$を求めていきましょう．

さきほど考えた2点を通る直線と極限を組み合わせて，接線を求めることができます．

はじめに，$x$から$h$だけ離れた点$x+h$を考え，2点を通る直線の傾きを求めてみます．次に$h$を$h \rightarrow 0$のように小さくしていけば，直線の開始点と終了点の2点が1点に収束し，1点での接線として考えることができます．これを式でみると
$$
\begin{aligned}
f'(x) &=\lim _{h\rightarrow 0}\dfrac {f\left( x+h\right) -f\left( x\right) }{\left( x+h\right) -x}\\
&=\lim _{h\rightarrow 0}\dfrac {f\left( x+h\right) -f\left( x\right) }{h}\\
\end{aligned}
$$

となります．上の式を**導関数**とよびます．また導関数を求めることを**微分する**といいます．また，記号の使い方として，
$$
f'(x) = \dfrac{d}{dx} f(x)
$$

のように表しても構いません．この$d$という記号はある変数における微小変化量を表しており，$df(x)$が対象の値の変化量，$dx$が$x$の変化量を表し，それらを小さくしていった時の極限を表します．この記法は煩雑ですが，変数が$x$，$y$など複数ある場合に，$x$で微分しているか，$y$で微分しているかが明確になるため，正確な表現をすることができます．

### 微分の公式

覚えておくと便利な微分の公式がありますので，以下に幾つか紹介していきます（$c$は定数，$x$は変数を表します）．

$$
\begin{align}
\left( c\right) ^{'}&=0 \\
\left( x\right)^{'}&=1\\
\left( cf(x) \right)^{'} &= c f'(x) \\
\left( x^{n} \right)^{'} &=nx^{n-1} \\
\left( f(x) + g(x) \right) ^{'} &=f^{'}(x)+g^{'}(x) \\
\left( f(x) g(x) \right) ^{'} &= f^{'}(x)g(x) + f(x)g^{'}(x) \\
\left( f(g(x)) \right) ^{'} &= \frac{df(u)}{du}\frac{du}{dx} = f^{'}(g(x)) \cdot g^{'}(x) \\
\end{align}
$$

例えば，以下の微分を考えてみましょう．

$$
\begin{aligned}
\left( 3x^{2} + 4x + 5 \right)' &= \left( 3x^{2} \right)' + \left( 4x \right)' + \left( 5 \right)' \\
&= 3 \times \left( x^{2} \right)' + 4 \times \left( x \right)' + 5 \times \left( 1 \right)' \\
&= 3 \times 2x + 4 \times 1 + 5 \times 0  \\
&= 6x + 4
\end{aligned}
$$

このように，各項の和に対する微分の計算は，各項に対して微分した後に和をとるようにしても等式の関係が成立します．また，各項の微分を行う際に，定数の係数（変数にかかる数）は微分演算の外側に出すことができます．これらは微分の**線形性**とよばれる性質であり，この性質を使うことで，微分を簡単に計算できるようになります．

### 合成関数の微分

後の章で詳しく述べますが，一般的に機械学習においては複雑な**合成関数の微分**を考える必要が出てきます．簡単な例として，

$$
\left\{ (3x + 4)^{2} \right\}'
$$

を計算することを考えます．この式は$3x+4$という内側の部分と$(\cdot)^{2}$という外側の部分で構成されています．この式を$(9x^2 + 24x + 16)'$のように展開してから微分を計算してもよいのですが，3乗や4乗となってくると展開するのも大変になります．ここで役に立つ考え方が合成関数の微分です．先程紹介した微分の公式の最後に登場していた式です．合成関数の微分は，内側の微分と外側の微分をそれぞれ行い，その結果をかけ合わせることで求めることができます．外側の微分の際には関数の引数を入力とみなし，その入力について微分をとります．

それでは先程の$(3x+4)^2$という関数の微分を考えてみます．

まず内側の関数を$u = (3x+4)$とおいて，

$$
\left\{ (3x + 4)^{2} \right\}' = (u^{2})'
$$

とします．ここで，$(\cdot)'$ をもう少し厳密に考える必要が出てきます．今は$x$と$u$の2つの変数が登場しており，$(\cdot)'$では，$x$で微分しているのか$u$で微分しているのかの区別がつきません．そこで，多少複雑に見えますが，先程紹介した$d$を使った記法で微分する変数を厳密に記述すると，

$$
\begin{aligned}
\left\{ (3x + 4)^{2} \right\}' &= \dfrac{d}{dx} \left\{ (3x + 4)^{2} \right\} \\
&= \dfrac{du}{dx} \dfrac{d}{du} (u^2) \\
&= \dfrac{d}{du} (u^{2}) \cdot \dfrac{d}{dx} (3x + 4) \\
&= 2u \cdot 3 \\
&= 6u = 6(3x + 4) = 18x + 24 \\
\end{aligned}
$$

となります．

ニューラルネットワークを訓練する際には合成関数の微分を使用する場面が何度も登場するため，この計算方法をしっかりと覚えておきましょう．

### 偏微分

機械学習では，1つの入力変数$x$から出力変数$y$を予測するケースは稀であり，基本的には，複数の入力変数$x_{1}, x_{2}, \ldots, x_{M}$を用いて出力変数$y$を予測する多変数関数を扱います．例えば，家賃を予測する場合，部屋の広さだけではなく，駅からの距離や犯罪発生率なども考慮した方がより正確に予測できると期待されます．複数の入力$x_1, x_2, \ldots, x_M$を考慮した関数$f(x_1, x_2, \ldots, x_M)$を多変数関数とよびます．この多変数関数において，ある入力$x_m$にのみ注目して微分することを**偏微分**とよび，

$$
\dfrac{\partial}{\partial x_{m}} f(x_{1}, x_{2}, \ldots, x_{M})
$$

のように表します．微分を表す記号が，$d$から$\partial$に変わり，計算としては$\dfrac{\partial}{\partial x_{m}}$の場合は$x_{m}$以外は定数と考え$x_{m}$にのみ着目して微分を行います．（ただし，入力変数が他の入力変数と独立ではない場合は定数と考えることはできません．本講義ではそのようなケースは出てきません）．

例題で具体的な計算の流れを確認していきましょう．

$$
\begin{aligned}
\dfrac {\partial }{\partial x_{1}}\left( 3x_{1}+4x_{2}\right) &=\dfrac {\partial }{\partial x_{1}}\left( 3x_{1}\right) +\dfrac {\partial }{\partial x_{1}}\left( 4x_{2}\right) \\
&=3\times \dfrac {\partial }{\partial x_{1}}\left( x_{1}\right) +4x_{2}\times \dfrac {\partial }{\partial x_{1}}\left( 1\right) \\
&=3\times 1+4x_{2}\times 0\\
&= 3
\end{aligned}
$$

偏微分でも微分と同じ公式を適用できます．今回のケースでは，$x_{1}$にだけ着目するため，$x_{2}$は定数として扱うことを把握しておけば上記の計算の流れが理解できるはずです．

## 線形代数

### 線形代数とは

次に，ベクトル，行列，逆行列などが登場する数学の一分野である**線形代数**について解説していきます．

線形代数を導入することで，複数の変数間の関係をシンプルに記述可能となるため，機械学習の中でも度々登場してきます．ぜひ身に着けていきましょう．

### スカラー，ベクトル，行列，テンソル

最初に線形代数で使われるスカラー，ベクトル，行列，テンソルの4つを解説します．

**スカラー**は，1つの値もしくは変数のことです．例えば，

$$
x, \ y,\  M,\  N
$$

のように表します．スカラーは例えば温度や身長といった単一の量を表すことに使われます．

**ベクトル**は，複数のスカラーを縦方向（もしくは横方向）に集めて並べたものであり，

$$
\bf{x}=\begin{bmatrix}
x_{1} \\
x_{2} \\
x_{3}
\end{bmatrix}, \
\bf{y}=\begin{bmatrix}
y_{1} \\
y_{2} \\
\vdots \\
y_{N}
\end{bmatrix}
$$

のように表します．ベクトルの表記は太文字とする場合が多く，スカラーかベクトルかを区別できるようにしています．ベクトルを表現する際，縦方向に並べたものを列ベクトル，横方向に並べたものを行ベクトルとよびます．数学や機械学習では列ベクトルを利用する論文や参考書が多いため，特に明示しない限り，単にベクトルと表現した場合には列ベクトルを指すこととします．

**行列**は複数の同じサイズのベクトルを並べたものであり，

$$
\bf{X}=\begin{bmatrix}
x_{11} & x_{12} \\
x_{21} & x_{22} \\
x_{31} & x_{32}
\end{bmatrix}
$$

のように表します．行列のサイズは行と列で表現します．例えば，この$\bf{X}$は3行2列であり，サイズが(3, 2)の行列と言います．多くの場合，行列は大文字，または大文字の太文字で表記されます．

**テンソル**はベクトルや行列を一般化した概念であり，ベクトルは1階のテンソル，行列は2階のテンソルと表現することができます．また，図のように行列を奥行き方向にさらに並べたものは3階のテンソルとなります．例えば，カラー画像をデジタル表現する場合，画像を構成する各ピクセルはRGB (Red Green Blue) などの色空間を用いるのが一般的であり，（行番号，列番号，色）の3つの軸で1つの値を指定するため，3階のテンソルで表現されます．本講座を含めて，単にテンソルと表現されている場合には，3階以上のテンソルを指すことが多いので，注意してください．

線形代数では $\bf{y}$ や $\bf{X}$ といった文字だけで式変形をしていくため，どのような形の数値が取り扱われているかわかりくいのですが，これはベクトルなどと常に意識しておくことでその形を見失わないように注意しましょう．

スカラー，ベクトル，行列，テンソルの一般的な記法をまとめると下表の通りです．本講座でもこの記法を用いています．

|        | 小文字         | 大文字         |
| ------ | -------------- | -------------- |
| 細文字 | スカラーの変数 | スカラーの定数 |
| 太文字 | ベクトル       | 行列，テンソル |

### 足し算・引き算

行列やベクトルの演算について覚えていきましょう．足し算は同じサイズの行列，ベクトル間だけで成立し，次のように計算されます．

$$
\begin{aligned}&\begin{bmatrix}
1 \\
2 \\
3
\end{bmatrix}+\begin{bmatrix}
4 \\
5 \\
6
\end{bmatrix}=\begin{bmatrix}
1+4 \\
2+5 \\
3+6
\end{bmatrix}=\begin{bmatrix}
5 \\
7 \\
9
\end{bmatrix}\\
&\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}+\begin{bmatrix}
7 & 8 & 9 \\
10 & 11 & 12
\end{bmatrix}=\begin{bmatrix}
1+7 & 2+8 & 3+9 \\
4+10 & 5+11 & 6+12
\end{bmatrix}=\begin{bmatrix}
8 & 10 & 12 \\
14 & 16 & 18
\end{bmatrix}\end{aligned}
$$

このように行列やベクトルの中の**要素**で対応する場所を足し合わせます．引き算も同様です．**同じサイズでないと計算が成立しない**ということを覚えておきましょう．

### 転置

ベクトルは縦向きの列ベクトルを基本としていましたが，横向きのベクトルを使いたい場合もあります．そこで縦向きのベクトルを横向きのベクトルに，横向きのベクトルを縦向きのベクトルに入れ替える演算を**転置（Transpose）**とよび，$T$で表記します．例えば，

$$
\begin{aligned} \bf{x} &= \begin{bmatrix}
1 \\
2 \\
3
\end{bmatrix}, \
\bf{x}^{T}= \begin{bmatrix} 1 & 2 & 3 \\
\end{bmatrix} \end{aligned}
$$

のようになります．
行列に対する転置では，サイズが$(N, M)$から$(M, N)$になり，$i$行$j$列目の値が転置後には$j$行$i$列目の値になります．

$$
\begin{aligned} \bf{X} &= \begin{bmatrix}
1 & 4 \\
2 & 5 \\
3 & 6
\end{bmatrix}, \
\bf{X}^{T} = \begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix} \end{aligned}
$$

転置の公式として次を覚えておくとよいでしょう．

$$
\begin{aligned}& \left( 1 \right) \ \left( \bf{A}^{T} \right)^{T} = \bf{A}\\
&\left( 2 \right) \ \left( \bf{A} \bf{B} \right) ^{T}= \bf{B}^{T} \bf{A}^{T}\\
&\left( 3 \right) \ \left( \bf{A} \bf{B} \bf{C} \right) ^{T}= \bf{C}^{T} \bf{B}^{T} \bf{A}^{T} \end{aligned}
$$

### 内積

同じサイズのベクトル間では内積が定義できます．内積は同じ位置の対応する値同士を掛けていき，それらを足し合わせたものです．

$$
\begin{aligned}& \begin{bmatrix}
1 & 2 & 3
\end{bmatrix} \begin{bmatrix}
4 \\
5 \\
6
 \end{bmatrix} = 1 \times 4 + 2 \times 5  + 3 \times 6 = 32 \end{aligned}
$$

### 掛け算（行列積）

行列の掛け算には，行列積，外積，要素積（アダマール積）など複数種あります．ここではそのうち最もよく使われる**行列積**について説明します．以降では明示しない限り行列の掛け算は行列積を指すこととします．

行列$A$と行列$B$の行列積は$A$の各行と$B$の各列の内積を並べたものとして定義されます．例えば行列Aの2行目の行ベクトルと行列Bの3列目の列ベクトルの内積は結果の行列Cの2行3列目に対応します．

そして，内積が定義される条件はベクトルのサイズが等しいということでしたが，ここでもそれが成り立つために，Aの行のサイズ（=Aの列数）とBの列のサイズ（=Bの行数）が一致する必要があります．また，結果はAの行数とBの列数からなる行列となります．

また，行列積がスカラー積と大きく異なる性質のひとつとして，$AB$と$BA$が等しいとは限らないということが挙げられます．

行列積は線形代数や機械学習の多くの問題で使われます．また，行列では割り算に相当する演算はありませんが，後述する逆行列を使って$4 / 2 = 4 \times \dfrac{1}{2}$のように割り算を逆数（逆行列）の掛け算として記述します．

それでは，計算条件の確認も踏まえて，下記の3つを練習問題として解いてください．

$$
\begin{aligned}
&\left( 1\right)
\begin{bmatrix}
1 & 2
\end{bmatrix}
\begin{bmatrix}
3 \\
4
\end{bmatrix}\\
&\left( 2\right)
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}\begin{bmatrix}
5 \\
6
\end{bmatrix}\\
&\left( 3\right)
\begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
3 & 4 \\
5 & 6
\end{bmatrix}\begin{bmatrix}
3 \\
1
\end{bmatrix}
\end{aligned}
$$

こちらが解答です．

$$
\begin{aligned}
&\left( 1\right)
\begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
3 \\
4
\end{bmatrix} = 1\times 3 + 2 \times 4 = 11\\
&\left( 2\right)
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}\begin{bmatrix}
5 \\
6
\end{bmatrix} = \begin{bmatrix}
1 \times 5 + 2 \times 6 \\
3 \times 5 + 4 \times 6
\end{bmatrix} = \begin{bmatrix}
17 \\
39
\end{bmatrix}\\
&\left( 3\right)
\begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
3 & 4 \\
5 & 6
\end{bmatrix}\begin{bmatrix}
3 \\
1
\end{bmatrix}
=\begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
3 \times 3 + 4 \times 1 \\
5 \times 3 + 6 \times 1
\end{bmatrix} = \begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
13 \\
21
\end{bmatrix}
= 1 \times 13 + 2 \times 21
=55
\end{aligned}
$$

この形の計算は，機械学習においてよく登場してきます．行列積は，演算後に形が変わる場合があることを覚えておきましょう．

### ベクトル，行列のサイズ

行列積を行った後は行列サイズが変わります．サイズが$(L, M)$の行列と$(M ,N)$の行列の行列積の結果は$(L, N)$となります．例えば先ほどの３つの練習問題のサイズがどのように変化したかをまとめると，

となります．(3)は最初のベクトルと行列の結果が横方向のベクトルであり(1)に帰着することに注意してください．また，ある次元のサイズが1となった場合，その次元を削除しベクトルがスカラーに，行列がベクトルになる場合があります．

### 単位行列

スカラー値の$1$は，$10 \times 1 = 10$といったように，その数を任意の数に乗じても変わらないという性質を持ちます．行列の演算において，これと同様の働きをする行列が**単位行列**です．

$$
\bf{I}=\begin{bmatrix}
1 & 0 & \ldots  & 0 \\
0 & 1 & \ldots  & 0 \\
\vdots & \vdots  & \ddots  & \vdots  \\
0 & 0 & \ldots  & 1
\end{bmatrix}
$$

上記のような形をしており，記号$\bf{I}$で表されるのが一般的です．行列の斜めの要素を**対角要素**とよび，それ以外の要素を非対角要素とよびます．単位行列は，対角要素が1で，非対角要素が0であるような**正方行列**（行要素の数と列要素の数が一致する行列）です．例えば， $2 \times 2$行列の場合は，

$$
\bf{I} =\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}
$$

であり，$3 \times 3$行列の場合は，

$$
\bf{I}=\begin{bmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
$$

となります．行列のサイズを明示したい場合は，$I_{n}$ ($n \times n$行列の場合)と添字を付けて区別します．

単位行列は任意の正方行列$\bf{A}$に対し，以下が成立します．

$$
\begin{aligned}
\bf{A}\bf{I}&=\bf{A}\\
\bf{I}\bf{A}&=\bf{A}
\end{aligned}
$$

先程説明したように，行列の掛け算が成立するためには，$I$のサイズは$A$と同じである必要があります．

実際に計算して，元の行列と値が変わらないかを確認してみると，

$$
\begin{aligned}\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}
&=\begin{bmatrix}
1\times 1+2\times 0 & 1\times 0+2\times 1 \\
3\times 1+4\times 0 & 3\times 0+4\times 1
\end{bmatrix}\\
&=
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}
\end{aligned}
$$

のように，元の値と一致することが確認できます．

### 逆行列

**逆行列**とは，元の正方行列にかけると単位行列になるような行列であり，スカラーにおける逆数($2 \times 2^{-1} = 1$)に対応するような行列です．行列$\bf{A}$に対し，その逆行列は$\bf{A}^{-1}$のように表記します．

逆行列の定義を数式で表すと，

$$
\begin{aligned}
\bf{A}\bf{A}^{-1}=\bf{I}\\
\bf{A}^{-1}\bf{A}=\bf{I}
\end{aligned}
$$

となります．ここで，$\bf{I}$ は先程の単位行列です．サイズが$2 \times 2$や$3 \times 3$といった小さな行列の場合には，逆行列計算に公式がありますが，機械学習ではより大きなサイズの行列($1000 \times 1000$など)を扱う必要が出てくるため，逆行列を効率的に求める計算手法が提案されています．

逆行列は常に存在するとは限りません．逆行列が存在するような行列のことを**正則行列**とよびます（行列が正則であるための条件については今回は説明しません）．

### 線形結合と二次形式

機械学習の式によく出てくる形式として，$\bf{b}^{T}\bf{x}$と$\bf{x}^{T}\bf{A}\bf{x}$の2つの形式があります．前者は**線形結合**もしくは**一次結合**，後者は**二次形式**とよばれています．スカラーの場合，一次式（$ax+b$）や二次式（$ax^2+bx+c$）がありますが，それをベクトルに拡張したものです．

線形結合の計算の中身を見てみると，

$$
\begin{aligned}
\bf{b}&=\begin{bmatrix}
1 \\
2
\end{bmatrix},\
\bf{x}=\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}\\
\bf{b}^{T}\bf{x}&=\begin{bmatrix}
1 & 2
\end{bmatrix}\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}=x_{1}+2x_{2}\end{aligned}
$$

のように$\bf{x}$の要素である$x_{1}$もしくは$x_{2}$に関して，一次式となっていることがわかります．

また，二次形式も同様に計算の中身を確認してみると，

$$
\begin{aligned}
\bf{A}&=\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix},\
\bf{x}=\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}\\
\bf{x}^{T}\bf{A}\bf{x}
&=\begin{bmatrix} x_{1} & x_{2}\end{bmatrix}
\begin{bmatrix}
1 & 2 \\
3 & 4
\end{bmatrix}\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}\\
&=\begin{bmatrix}x_{1} & x_{2}\end{bmatrix} \begin{bmatrix}
x_{1}+2x_{2} \\
3x_{1}+4x_{2}
\end{bmatrix}\\
&=x_{1}\left( x_{1}+2x_{2}\right) +x_{2}\left( 3x_{1}+4x_{2}\right) \\
&=x^{2}_{1}+5x_{1}x_{2}+4x_{2}^{2}\end{aligned}
$$

となり，各要素において二次式となっていることがわかります．

従って，任意の二次関数を

$$
\bf{x}^{T}\bf{A}\bf{x} + \bf{b}^{T}\bf{x} + c
$$

の形で表現できます．ここで，$c$はスカラーの定数項です．

### ベクトルによる微分と勾配

微分は入力を変えた場合の関数値の変化量と説明しました．同様に関数の入力がベクトルである場合，ベクトルによる微分を考えることができます．関数のそれぞれのベクトルの成分毎に偏微分を計算し，それらを並べてベクトルにしたものを**勾配**とよびます．

勾配の計算を紹介する前に，下記の例題を計算しましょう．

$$
\begin{aligned}
\bf{b}&=\begin{bmatrix}
3 \\
4
\end{bmatrix}, \
\bf{x}=\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}\\
\bf{b}^{T}\bf{x}&=\begin{bmatrix}
3 & 4
\end{bmatrix}\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}
=3x_{1}+4x_{2}\end{aligned}
$$

この$\bf{b}^{T}\bf{x}$を ベクトル$\bf{x}$で微分したものを，

$$
\dfrac {\partial }{\partial \bf{x}}\left( \bf{b}^{T}\bf{x}\right)
$$

と表し．これを**ベクトルで微分**すると言います．今回の例では，

$$
\begin{aligned}
\dfrac {\partial }{\partial \bf{x}}\left( \bf{b}^{T}\bf{x}\right) &=\dfrac {\partial }{\partial \bf{x}}\left( 3x_{1}+4x_{2}\right) \\
&=\begin{bmatrix}
\dfrac {\partial }{\partial x_{1}} \left( 3x_{1}+4x_{2}\right)  \\
\dfrac {\partial }{\partial x_{2}} \left( 3x_{1}+4x_{2}\right)
\end{bmatrix}
\end{aligned}
$$

のようになり，計算を進めると

$$
\begin{aligned}\dfrac {\partial }{\partial x_{1}}\left( 3x_{1}+4x_{2}\right) &=\dfrac {\partial }{\partial x_{1}}\left( 3x_{1}\right) +\dfrac {\partial }{\partial x_{1}}\left( 4x_{2}\right) \\
&=3\times \dfrac {\partial }{\partial x_{1}}\left( x_{1}\right) +4x_{2}\times \dfrac {\partial }{\partial x_{1}}\left( 1\right) \\
&=3\times 1+4x_{2}\times 0\\
&=3\end{aligned}
$$

$$
\begin{aligned}\dfrac {\partial }{\partial x_{2}}\left( 3x_{1}+4x_{2}\right)&=\dfrac {\partial }{\partial x_{2}}\left( 3x_{1}\right) +\dfrac {\partial }{\partial x_{2}}\left( 4x_{2}\right) \\
&=3x_{1}\times \dfrac {\partial }{\partial x_{2}}\left( 1\right) +4\times \dfrac {\partial }{ax_{2}}\left( x_{2}\right) \\
&=3x_{1} \times 0 + 4 \times 1 \\
&= 4
\end{aligned}
$$

となり，下記の計算結果が得られます．

$$
\begin{aligned}
\dfrac {\partial }{\partial \bf{x}}\left( \bf{b}^{T}\bf{x}\right)
&=\begin{bmatrix}
\dfrac {\partial }{\partial x_{1}} \left( 3x_{1}+4x_{2}\right)  \\
\dfrac {\partial }{\partial x_{2}} \left( 3x_{1}+4x_{2}\right)
\end{bmatrix} =\begin{bmatrix}
3  \\
4
\end{bmatrix} = \bf{b}
\end{aligned}
$$

もう一問，以下の例題を考えましょう．

$$
\begin{aligned}
\bf{b}&=\begin{bmatrix}
3 \\
4
\end{bmatrix}, \
\bf{x}=\begin{bmatrix}
x_{1} \\
x_{2}
\end{bmatrix}\\
\dfrac {\partial }{\partial \bf{x}}\left( \bf{b}\right) &=\begin{bmatrix}
\dfrac {\partial }{\partial x_{1}}\left( 3 \right)  \\
\dfrac {\partial }{\partial x_{2}}\left( 4 \right)
\end{bmatrix}
=\begin{bmatrix}
0 \\
0
\end{bmatrix}=\bf{0}\end{aligned}
$$

偏微分を行う対象の変数が含まれていない場合，その偏微分は$0$となります．要素が$0$のみで構成されたベクトルを**零（ゼロ）ベクトル**と言います．

これらを踏まえて，公式としてまとめておきましょう．

$$
\begin{aligned}
&\left( 1\right) \ \dfrac {\partial}{\partial \bf{x}}\left( \bf{c} \right) = \bf{0}\\
&\left( 2\right) \ \dfrac {\partial }{\partial \bf{x}}\left( \bf{b}^{T}\bf{x}\right) = \bf{b}\\
&\left( 3\right) \ \dfrac {\partial }{\partial \bf{x}}\left( \bf{x}^{T}\bf{A}\bf{x}\right) =\left( \bf{A}+\bf{A}^{T}\right) \bf{x}\end{aligned}
$$

(1)と(2) はすでに導出済みです．(3) は導出が少し複雑なので省略しますが，数値を代入して確認してみてください．この3つの公式は機械学習を学んでいく上で非常に重要な公式となりますので，必ず覚えておきましょう．

こういった行列などにおける公式は他にもたくさんあり，論文などを読む際にはどういった公式があるのかを知っておくことも重要です．例えば，[The Matrix Cookbook](https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf)などを参考にしてみてください．

また，今回は多入力単出力関数の微分として勾配まで紹介しましたが，多入力多出力関数の微分であるヤコビ行列（ヤコビアン）もニューラルネットワークの誤差逆伝播法を理解するために必要となります．さらに詳しく知りたい方は，例えば[The Matrix Calculus You Need For Deep Learning](https://arxiv.org/abs/1802.01528)などを参考にしてみてください．

## 確率・統計

### 確率や統計は何に使えるのか

機械学習といえば確率や統計といったイメージで勉強する人も多いと思いますが，簡単なアルゴリズムであれば，微分と線形代数を理解しておくだけで説明することができ，確率や統計が出てくることはありません．それでは，確率，統計はなぜ必要なのでしょうか？

機械学習の目的はそのデータの背後にある普遍性，法則を捉えることです．確率はデータの分布や不確実性といった概念を数式化することができます．また統計によって，ある集団に対する様々な統計量を得ることができ，それらを使ってデータを扱いやすいように正規化したり，モデルが妥当なのか，各データが外れ値ではないのかといった判断をすることができます．

### 確率

確率は様々な可能性がある事象に対し，その事象が起こることが期待される度合いを表します．パラメータ推定の文脈では確率はどれくらい起きそうだという信念を表す場合もあります．確率は$p(x)$のような関数の形で表し，$x$を**確率変数**とよびます．確率変数は起きうる事象のいずれかの値をとるような変数です．確率変数には離散型と連続型がありますが，本節では離散型の確率変数を扱います．確率変数$x$の値が$u$であった時の確率は$p(x=u)$，もしくは$p(u)$と省略して表わされます．確率は，「全ての事象の確率の和が$1$になる」，「全ての事象の確率は$0$以上である」という2つの制約を満たします．これを式で書くと，

$$
\begin{align}
\sum_{x } p(x) &= 1 \\
p(x) & \geq  0
\end{align}
$$

となります．

2つの事象が同時に起きる確率を**同時確率**とよび$p(x, y)$のように表します．例えばサイコロを2回振り，1回目の目が$1$，2回目の目が$5$となる確率は同時確率で表すことができます．

同時確率のうち，特定の確率変数のみに注目し，それ以外の確率変数について和を取って消去する操作を**周辺化**とよびます（周辺化という言葉は，行を1つ目の確率変数，列を2つ目の確率変数に対応させて同時確率を表で書いた場合，その行の合計，列の合計を表の周辺に書いたことからそうよばれています）．周辺化の結果は，注目した確率変数の確率に一致します．

$$
p(x) = \sum_y p(x, y) \\
p(y) = \sum_x p(x, y)
$$

片方の確率変数がある値で固定されている条件下で，もう片方の確率がどうなるのかを表した確率分布を**条件付き確率**とよび，$p(y|x)$のように表します．例えば$y$を外で雨が降っているかを表す確率変数，$x$を部屋に入ってきた人が傘を持っていたかを表す確率変数とします（$y=1$を雨が降っている，$y=0$を雨が降っていない，のように割り当てます）．この時$p(y|x)$は，部屋に入ってきた人が傘をもっていた場合に外で雨が降っている条件付き確率を表します．

条件付き確率は，同時確率を条件の確率で割った値と一致します．

$$
p(y|x) = \frac{p(x, y)}{p(x)}
$$

ここで，条件付確率の式を変形させた$p(y|x)p(x) = p(x, y)$に注意すると，

$$
p(x|y) = \frac{p(x, y)}{p(y)} = \frac{p(y | x)p(x)}{p(y)}
$$

が得られます．これを**ベイズの定理**とよびます．重要な定理なので，ぜひ覚えておきましょう．

例えば，ベイズの定理の応用事例として，スパム（迷惑）メールフィルターがあります．メールに単語$i$が含まれるか否かを表す確率変数を$x_{i}$，メールがスパムであるか否かを表す確率変数を$y$とおくと，$p(x_{i}=1)$は「メールが単語$i$を含む確率」，$p(y=1)$は「メールがスパムである確率」，$p(x_{i}=1|y=1)$は「メールがスパムであった場合に，その中に単語$i$が含まれる確率」となります．受信済みの大量のメールからそれぞれの割合を集計して求め，ベイズの定理を適用することで，$p(y=1|x_{i}=1)$として，「メールに単語$i$が出現した場合に，そのメールがスパムである確率」を求めることができます．

### 尤度と最尤推定

パラメータ$\theta$で特徴付けられた確率モデルをパラメトリックなモデルとよび，$p(x; \theta)$のように表記します．確率モデル$p(x)$上で事象$u$が観測される確率$p(x=u; \theta)$を事象$u$の**尤度**とよびます．尤度の尤は「尤（もっと）もらしい」という意味であり，その事象の起きやすさを表します．

ここで，$N$個のデータ$X = \left( x^{(1)}, x^{(2)}, \ldots, x^{(N)} \right)$が与えられ，そのデータ$X$を生成するような確率分布を推定する問題を考えます．この場合，**最尤（さいゆう）推定**とよばれる手法がよく使われます．最尤推定は観測データ$X$を最も生成しそうなパラメータ$\theta$を推定する手法です．観測するデータがそれぞれ独立に生成されている場合，その尤度は

$$
L(\theta) = p(X; \theta) = \prod_{i=1}^N p(x^{(i)}; \theta)
$$

のように表されます．この$\prod$という記号は$\sum$の掛け算版で全ての値を掛け合わせるという意味です．複数データに対する尤度は，$1$より小さな値の積となるため非常に小さな数になりコンピュータ上で扱うことが困難になります．また尤度を最大化したい場合，積の形の式の最大化は難しいことが知られています．そこで尤度の代わりにその対数をとった対数尤度を考えます．

$$
\log L(\theta) = \log p(X; \theta) = \sum_{i=1}^N \log p(x^{(i)}; \theta)
$$

この対数尤度を最大化するパラメータ$\theta$を求めることができれば，その値がデータ$X$を最も生成しそうな確率モデルのパラメータとなります．

ここで，わかりやすい具体例として，コインの表・裏が出る確率を推定する問題を考えてみます．コインの表・裏を表す確率変数を$x$とおき，$x = 1$であれば表，$x = 0$であれば裏とします．また，表($x = 1$)となる確率を表すパラメータを$\theta$とおきます．コインを$10$回投げた結果，以下の観測結果$X$が得られたとします．

$$
X = \left(1, 0, 1, 1, 1, 0, 0, 1, 0, 0 \right)
$$

すると，その尤度は，

$$
\begin{aligned}
L(\theta) &= \theta \cdot (1 - \theta) \cdot \theta \cdot \theta \cdot \theta \cdot (1 - \theta) \cdot (1 - \theta) \cdot \theta  \cdot (1 - \theta) \cdot (1 - \theta) \\
&= \theta^{5} \cdot (1 - \theta)^{5}
\end{aligned}
$$

と計算され，その対数尤度は，

$$
\log L(\theta) = 5 \log \theta + 5 \log \left( 1 - \theta \right)
$$

となります．この関数は上に凸となっています．$\theta$と$\log L(\theta)$の関係を図示すると下図のようになります．

これを$\theta$で微分して$0$になる条件を求めると，

$$
\frac{5}{\theta} - \frac{5}{\left( 1 - \theta \right)} = 0
$$

より，$\theta = 0.5$が最尤推定により得られます．

回帰モデルの目的関数として真値と予測値の二乗誤差の和を使う場合（**最小二乗法**とよばれています），モデルの出力値に正規分布（後述）の誤差を仮定した最尤推定を行っているのと等価であることが知られています．

### 事後確率最大化推定(MAP推定)

最尤推定は多くの場合有効ですが，求めるパラメータに何らかの事前情報がある場合，最尤推定ではその事前情報を扱うことができません．そのため，試行回数が少ない中でパラメータを推定しようとすると，最尤推定ではうまくいかない場合があります．

先程と同様に，コインの表・裏が出る確率を推定する例を考えてみましょう．コインを$5$回投げたところ，たまたま$5$回とも表($x = 1$)が出たとします．この場合，最尤推定では，表が出る確率が$100$%（裏が出る確率が$0$%）であると推定してしまいます．しかし，明らかに裏が出る確率は$0$よりも大きいはずという事前情報があれば，より良い推定ができそうです．

このような場合に，事前情報も考慮しながら，観測データに基づいてパラメータを推定する方法が**事後確率最大化(Maximum A Posteriori, MAP)推定**です．MAP推定においては，パラメータ$\theta$も確率変数であり，その分布（**事前確率**ともよばれます）$p\left( \theta \right)$が存在すると考えます．その上で，観測データ$X$が与えられた条件での，パラメータ$\theta$の条件付き確率（**事後確率**ともよばれます）$p\left( \theta|X\right)$を最大化するような$\theta$を求めることになります．

ここでベイズの定理を思い出しましょう．ベイズの定理を用いると事後確率は，

$$
p(\theta|X) = \frac{p(X|\theta)p(\theta)}{p(X)}
$$

となります．これをパラメータについて最大化することを考えると，$P(X)$はパラメータとは関係が無いので無視することができ，

$$
p(X|\theta) p(\theta)
$$

を最大化するようなパラメータを求めることになります．$p(X|\theta)$の部分は最尤推定と同じですが，MAP推定ではさらにパラメータの事前確率$p(\theta)$を掛けた確率を最大化することになります．（ここではMAP推定の解を求める過程については説明しません．）

機械学習においてパラメータを最適化する際，正則化とよばれる，パラメータの値が大きいことに対する罰則項を設けたりしますが，これはパラメータの事前確率（の対数）とみなすことができ，パラメータをMAP推定していると解釈できます．

### 統計量

本節では，データ解析を行う際によく用いられる基本的な統計量を紹介していきます．

統計量を求める際には，**母集団**に対する解析か**標本集団**に対する解析かを意識することが重要です．母集団とは解析を行いたい想定の範囲に対して，すべてのデータが揃っている場合であり，標本集団はそのうちの一部を抽出する場合です．例えば，全国の小学生の身長と体重を集計する際，全国の小学生を一人の抜け漏れもなく集められれば母集団ですが，各都道府県で100人ずつ抜き出して集計すると，標本集団となります．母集団のデータを集めることは現実的に難しいことが多く，標本集団のデータから母集団の分布を推定することが一般的です．そうなると，基本的には母集団の統計量ではなく，標本集団向けの統計量を使用することになります．サンプル数$N$が多い場合には，母集団の統計量と標本集団の統計量に差は殆どありませんが，サンプル数が小さい場合は大きな差となるので注意しましょう．

ここでは，代表的な統計量である平均，分散，標準偏差について紹介していきます．

最初は，**平均**を紹介します．たとえば，300円, 400円, 500円の平均は，

$$
\dfrac{300 + 400 + 500}{3} = 400
$$

となり，すべてを足し合わせて対象の数で割ります．これを定式化すると，

$$
\begin{aligned}\overline {x}=\dfrac {x_{1}+x_{2}+\ldots +x_{N}}{N}
=\dfrac {1}{N}\sum ^{N}_{n=1}x_{n}\end{aligned}
$$

のようになります．$N$は**サンプルの数**を表します．平均は，$\bar{x}$や$\mu$といった記号で表わされるのが一般的です．データ分布において，平均はその重心に相当する値です．

次に，**分散**を紹介します．分散はデータのばらつきを表す統計量であり，その定義は

$$
\begin{aligned}\sigma ^{2}=\dfrac {1}{N}\sum ^{N}_{n=1}\left( x_{n}-\overline {x}\right) ^{2}\end{aligned}
$$

となります．各サンプルの平均$\bar{x}$からの差分$x - \bar{x}$を計算し，それらの二乗誤差の平均の値を計算します．分散にはもう一つ定義があり，

$$
\begin{aligned}
\sigma ^{2}=\dfrac {1}{N-1}\sum ^{N}_{n=1}\left( x_{n}-\overline {x}\right) ^{2}
\end{aligned}
$$

と表す場合もあります．前者は**標本分散**といい，後者は**不偏分散**といいます．これらの式の導出は他書に譲ることにします．

例えば，実験を行った際に結果にばらつきが多ければ，各実験で再現性が確保できていない可能性が考えられるため，多数の試行結果がある値に集まっていることが望ましい状況において，分散を評価することが重要となってきます．他に，データのばらつき具合にもよりますが，分散を使えばスケールの違いも評価することができます．

最後に**標準偏差**を紹介します．分散は各サンプルの平均からの差の二乗の平均であり，単位は元の単位の二乗となっています．例えば元の単位がkgであれば，分散はkgの二乗という単位になります．そこで分散の平方根をとった$\sigma$を用いることで，元の単位と等しくなり，解釈が容易になります．これを標準偏差とよびます．

練習問題で具体的な計算手順の確認を行いましょう．以下の①と②のデータに対して，平均，分散，標準偏差を求めてください．ただし，今回は標本分散を使用することとします．

①の解答は以下の通りです．

$$
\begin{aligned}
\bar{x}&=\dfrac {1}{5}\left( -2-1+0+1+2\right) =0\\
\sigma ^{2}&=\dfrac {1}{5}\left\{ \left( -2-0\right) ^{2}+\left( -1-0\right) ^{2}+(0-0)^{2}+(1-0)^{2}+(2-0)^{2}\right\} \\
&=\dfrac {1}{5}\times 10=2\\
\sigma &=\sqrt {2}
\end{aligned}
$$

また，②の解答は以下の通りです．

$$
\begin{aligned}
\overline {x}&=\dfrac {1}{5}\left( -4-2+0+2+4\right) =0\\
\sigma ^{2}&=\dfrac {1}{5}\left\{ \left( -4-0\right) ^{2}+\left( -2-0\right) ^{2}+\left( 0-0\right) ^{2}+\left( 2-0\right) ^{2}+\left( 4-0\right) ^{2}\right\} \\
&=\dfrac {1}{5}\times 40=8\\
\sigma &=\sqrt {8}=2\sqrt {2}
\end{aligned}
$$

これより，②のケースの方が分散が大きく，データのばらつきが大きいことがわかります．

### 正規分布

ここでは，確率で度々登場する**正規分布**について紹介します．正規分布は**ガウス分布**ともよばれます．横軸に確率変数，縦軸に確率密度をとって図示すると，平均$\mu$，標準偏差$\sigma$を持つ正規分布は以下のような形をしています．

なぜこの正規分布がよく登場するのでしょうか．その理由として，以下のような物理的・数学的背景があります．

- 多数の独立な因子の和で表される確率変数は正規分布に近似的に従う
- 数式が扱いやすい

世の中でみられる多くのデータが正規分布に従うことが知られています（例えば，性年代別の身長，試験の点数，物理実験の測定誤差など）．一方で必ずしもデータは正規分布に従うとは限りません．正規分布ではないような分布に対し正規分布にあてはめて考えてしまい誤った結論を導く場合も多々あります．データの分布は図示化するなどして正規分布として扱ってよいかは常に考えましょう．

正規分布では平均$\mu$と標準偏差$\sigma$に対して，何%がその分布に入っているかといった議論を良く行います．例えば，$\mu \pm 3\sigma$の範囲内に，データの全体の99.7%が入るため，この$\mu \pm 3 \sigma$に入らない領域を外れ値（他の値から大きく外れた値）として定義するといった使い方ができます．

### 標準偏差を利用したスケーリング

スケーリングは，大抵の機械学習手法における前処理として重要です，

なぜスケーリングが重要かを説明するために，2点間の距離を計算する例題を取りあげます．スケールが異なる変数$x_{1}$と$x_{2}$があった場合に，下記の図のような状況になります．ここで，縦軸と横軸のスケールが大きく異なっていることに注意してください．

この2点間の距離$d$を求めると，

$$
\begin{aligned}
d&=\sqrt {\left( 100-1000\right) ^{2}+\left( 0.1-1\right) ^{2}}\\
&= \sqrt {900^{2}+0.9^{2}}\\
&= \sqrt {810000+0.81} \\
&= \sqrt {810000.81}
\end{aligned}
$$

のようになります．距離$d$の中で$x_{1}$の影響量が大きく$x_{2}$ に関しては，スケールが小さいが故にほとんど影響を与えていません．これでは$x_{2}$がデータの意味として重要な場合においても考慮できません．こうした問題を解決する方法の一つが，ここで紹介する**スケーリング**です．代表的なスケーリングの方法としては２つあります．

1つ目が，サンプル集合を**最小値0**，**最大値1**にスケーリングする方法です．これを**Min-Max スケーリング**とよびます．この方法では，各変数ごとに最小値$x_{\min}$と最大値$x_{\max}$を求めておき，すべてのデータに対して，

$$
\widetilde{x} = \dfrac{x - x_{\min}}{x_{\max} - x_{\min}}
$$

の計算を行います．Min-Maxスケーリングには計算が単純というメリットがある反面，下図の例ように$x_1$で外れ値を持つデータ点が存在するような場合，$x_{\max}$が外れ値に大きく引っ張られてしまうという弱点があります．

もうひとつのスケーリングの方法として，**平均0**，**標準偏差1**にスケーリングする方法があります．これは一般的に**標準化（正規化）**とよばれています．全てのデータから平均を引くと平均$0$になり，標準偏差で割ると標準偏差は$1$になります．

$$
\widetilde{x}  = \dfrac{x - \bar{x}}{\sigma}
$$

分散を計算した例題の①に対して，このスケーリングを適用してみると，

$$
\begin{aligned}
x_{1}&=\dfrac {-2-0}{\sqrt {2}}=-\dfrac {2}{\sqrt {2}}\\
x_{2}&=\dfrac {-1-0}{\sqrt {2}}=-\dfrac {1}{\sqrt {2}}\\
x_{3}&=\dfrac {0-0}{\sqrt {2}}=0\\
x_{4}&=\dfrac {1-0}{\sqrt {2}}=\dfrac {1}{\sqrt {2}}\\
x_{5}&=\dfrac {2-0}{\sqrt {2}}=\dfrac {2}{\sqrt {2}}
\end{aligned}
$$

のように，データが変換されます．この時の平均と標準偏差を求めてみると，

$$
\begin{aligned}
\overline {x}&=\dfrac {1}{5}\left( -\dfrac {2}{\sqrt {2}}-\dfrac {1}{\sqrt {2}}+0+\dfrac {1}{\sqrt {2}}+\dfrac {2}{\sqrt {2}}\right) =0\\
\sigma ^{2}&=\dfrac {1}{5}\left\{ \left( -\dfrac {2}{\sqrt {2}}-0\right) ^{2}+\left( -\dfrac {1}{\sqrt {2}}-0\right) ^{2}+\left( 0-0\right) ^{2}
 +\left( \dfrac {1}{\sqrt {2}}-0\right) ^{2}+\left( \dfrac {2}{\sqrt {2}}-0\right) ^{2}\right\} =1\\
\sigma &=\sqrt {\sigma ^{2}}=1
\end{aligned}
$$

のように，平均0，標準偏差1にスケーリングできていることがわかります．この方法であれば，Min-Maxスケーリングと比較して，少数の外れ値には強いスケーリングが実現できます．

### 外れ値除去

以下のように時間によって変動するようなデータを扱うとしましょう．例えば，横軸が時刻，縦軸が温度だとします．また，平均的な温度は一定であり，温度はランダムに変動しているものと仮定します．

このデータに対して，温度計の異常や不具合による温度の異常（外れ値）を検出したい場合，どのようにこの外れ値を定義して検出すれば良いでしょうか．一つの方法として，値の**頻度**に着目する方法があります．

上図のように，平均に対して線を引き，それぞれの値において頻度を算出してヒストグラムを描いてみると正規分布が現れます．ここでは，データが従う分布に正規性を仮定できるとします（データが正規分布に従うかどうかを統計的に確認したい場合は，正規性検定などの方法があります）．外れ値を定義するために，データの平均$\mu$と標準偏差$\sigma$を計算し，$\mu \pm 3\sigma$の値に線を引けば，外れ値除去を行うことができます．これを**3σ法**とよびます．ただし，外れ値の回数が多かったり，外れ値が極端な値を持つ場合には平均や標準偏差がその外れ値に引っ張られ，3σ法ではうまく対処できないことがあります．

その場合には，データを大きい順に並べて上位5%，下位5%を取り除くといった処理をすることもできます．


# Multivariate Calculus
Author: Vo, Huynh Quang Nguyen

```python
import numpy as np
import sympy
import matplotlib.pyplot as plt
```

## Acknowledgements:
The contents of this note are based on the lecture notes and the materials from the following source:
1. _Mathematics for Machine Learning_ specializatin given by Prof. David Dye, Dr. Samuel J. Cooper, and Dr. A. Freddie Page from Imperial College London.

Available in Coursera: [Mathematics for Machine Learning specialization](https://www.coursera.org/specializations/mathematics-machine-learning)

2. _Mathematics for Machine Learning_ textbook by Prof. Marc Peter Deisenroth, Prof. A. Aldo Faisal, and Prof. Cheng Soon Ong.

The book is freely available at: [Mathematics for Machine Learning textbook](https://mml-book.github.io/)

3. _Essential Math for Data Science in 6 Weeks_ webinar given by Dr. Thomas Nield.

Available in O'Reily Learning: [Essential Math for Data Science in 6 Weeks](https://learning.oreilly.com/attend/essential-math-for-data-science-in-6-weeks/0636920055929/0636920055928/)

4. _The Matrix Calculus You Need For Deep Learning_ leaflet by Prof. Terence Parr and Dr. Jeremy Howard from University of San Francisco.

Available at arXiv.org: [The Matrix Calculus You Need For Deep Learning](https://arxiv.org/abs/1802.01528)

5. _MIT 8.02t Electricity and Magnetism_ course given by Dr. Eric Hudson, Dr. George Stephans, Prof. John Belcher, Prof. John Joannopoulos, Prof. Michael Feld, and Dr. Peter Dourmashkin from MIT.

## Table of Contents
1. [Introduction to Multivariate Calculus](#Section1)
2. [Derivatives](#Section2)
3. [Vector Calculus](#Section3)
4. [Integrals](#Section4)
6. [Appendix](#Section5)

## I. Introduction to Multivariate Calculus

### 1. Why we have to learn?

Multivariate Calculus plays a critical role in machine learning. If we pick up any machine learning paper or documentation of any library such as PyTorch, the first thing we see is calculus.

Therefore, if we want to understand machine learning, we must understand calculus.

### 2. Applications of Multivariate Calculus

Together with linear algebra, calculus serves as another pillar in many scientific fields. Below are selected examples of how it is applied in machine learning and data science.

Figure 1: Visualization of gradient descent. This algorithm is an optimization method to find local minimum/maximum; thus, it is highly popular due to the need to optimize thousands and even millions of machine learning variables, like neural networks and their node weight values.

$$
$$

Figure 2: Visualization of finding areas under probability distributions to get probabilities, which is a commonly used case for integration in data science (adapted from **Digital Underwater Acoustic Communication Equipment** from Tianzeng Xu et al).

## II. Derivatives

### 1. What are derivatives:
1. According to formal definition, the derivative of a function $f$ at $x = a$
$$
\lim_{h \to 0} \frac{f(a + h) - f(a)}{h}
$$
provided the limit exists.

2. We can simply understand that a derivative tells the slope of a function $f(x)$ at a designated point $x = a$. Therefore, it is useful to measure the rate of change at any point in a function. When the slope is 0, that means we are at the minimum or maximum of a variable.

3. As an example, here is how we find the slope of the function $f(x) = x^2$ at $x = 2$:
    * We can measure "steepness" at any point in the curve, and we can visualize this with a tangent line.
    * A tangent line is a straight line that "just touches" the curve at a given 𝑥 value, and it also provides the slope at that point.
    * We can estimate this slope using the following steps:

***
* Take $x = 2$ and a nearby value $x = 2.1$.
* When passed to the function $f(x) = x^2$ these two x-values will yield the following values.
$$
f(2) = (2)^2 = 4
$$

$$
f(2.1) = (2.1)^2 = 4.41
$$

* From here, we can estimate the slope between these two points using the simple rise-over-run formula:

$$
m = \frac{y_2 - y_1}{x_2 - x_1} = 4.41
$$

* Therefore, the resulting line that passes through these two points has a slope of 4.41. We can increase the accuracy of our slope estimation by selecting a point (for example, $x = 2.000001$ that is infinitely close to $x = 2$. Thus, the slope is:

$$
m = \frac{y_2 - y_1}{x_2 - x_1} = 4.000001 \approx 4
$$

***

Figure 1: An example of finding a slope for a function at a designated point by estimation. This method of estimation is widely used if we cannot compute the exact derivative of our function-under-interest.

4. In practice, we compute the slope by taking the derivative $\frac{d}{d_x}$ of our function $f(x)$.

5. Noted: the **derivatives** describe the rate of change of a function concerning the change in its variables. The **differentiation** describes the process of finding the derivatives.

### 2. What are partial derivatives:
1. Partial derivatives are derivatives on functions that have multiple input variables. Because there is more than one input variable, we have slopes in more than one direction as plotted with these functions.

2. Logically, if there are multiple slopes then we can have multiple derivatives for each variable. Rather than finding the slope on a 1-dimensional function, we have slopes concerning multiple variables in several directions.

3. As an example, consider this function $f(x,y) = 2x^3 + 3y^3$, we can compute the partial derivatives of this function as follows:

$$
\frac{\partial f(x,y)}{\partial x} = 6x^2 + 0
$$

$$
\frac{\partial f(x,y)}{\partial y} = 0 + 9y^2
$$

* At a point $(x,y) = (1,2)$, we have the slope concerning x and the slope concerning y computed as follows:

$$
\frac{\partial f(x,y)}{\partial x} = 6(1^2) = 6
$$

$$
\frac{\partial f(x,y)}{\partial y} = 9(2)^2 = 36
$$

* Therefore, the slope concerning $x$ is 6, and the slope concerning $y$ is 36.

5. Noted: the function $f(x,y) = 2x^3 + 3y^3$ can be denoted as $f(\mathbf{x}) = 2x_1^3 + 3x_2^3$ with $\mathbf{x} = [x_1, x_2]$.

### 3. Basic rules of differentiation:
Below are the basic rules of differentiation:
1. Product rule:
$$
(f(x)g(x))' = f'(x)g(x) + f(x)g'(x)
$$

2. Quotient rule:
$$
(\frac{f(x)}{g(x)})' = \frac{f'(x)g(x) + f(x)g'(x)}{(g(x))^2}
$$

3. Sum rule:
$$
(f(x) + g(x))' = f'(x) + g'(x)
$$

4. Chain rule:
$$
(g(f(x)))' = g'(f(x))f'(x)
$$

The last rule is crucial because it is the backbone of the backpropagation algorithm in machine learning.

Figure 2: Application of the chain rule: the backpropagation algorithm. This algorithm describes how to find the influence of a certain input, on systems that are composed of multiple functions. (adapted from **Hands-On Convolutional Neural Networks with TensorFlow** by Zafar et al.)

```python
##
# DEMO: FIND DERIVATIVE AND COMPUTE SLOPE
#
from sympy import *
x = symbols('x') # We use this function to declare our variable for symbolic math.

f = x**2
df = diff(f,x)

slope = df.subs(x,2)
print(slope)

##
# DEMO: FIND THE PARTIAL DERIVATIVE
#
from sympy import *
from sympy.plotting import plot3d

x,y = symbols('x y')

f = 2*x**3 + 3*y**3

dx_f = diff(f, x)
dy_f = diff(f, y)

print(dx_f)
print(dy_f)
```

    4
    6*x**2
    9*y**2

# II. Vector Calculus

## 1. Basic components of vector calculus

### a) Field
A field is a function that has a different value at every point in space. Technically speaking, there are two popular types of fields: scalar field, and vector field.

#### Scalar field
1. A scalar field is a function associates a scalar value to every point in space. In principle, a scalar field provides values not only on a two-dimensional surface in space but for every point in space. To represent three-dimensional scalar fields, a common practice is to create a three-dimensional atmospheric volume element and colour it to represent the temperature variation.

2. One example of a scalar field is this expression, and it defines the value of the scalar function $\phi$ at every point $(x,y,z)$ in space.:

$$
\phi(x,y,z) = \frac{1}{\sqrt{x^2 + y^2 + z^2}} - \frac{1}{\sqrt{x^2 + y^2 - z^2}}
$$

3. Noted: the function $\phi(x,y,z)$ can be denoted as $\phi(\mathbf{x})$ with $\mathbf{x} = [x_1,x_2,x_3]$. This is the function that maps a space $\mathbb{R}^3$ to a new space $\mathbb{R}$ because for every point $(x,y,z)$ in a 3-D space, there is one point $\phi$ in a 1-D space. In pratice, a scalar-valued function $f(\mathbf{x})$ maps $\mathbb{R}^m → \mathbb{R}$ with $\mathbf{x} = [x_1,...,x_m]$ and $\mathbf{f} = f_1$.

$$
$$

Figure 1: An example of a scalar field: the night-time temperatures measured by the Thermal Emission Spectrometer instrument on the Mars Global Surveyor (MGS). The various colours on the map represent the surface temperature. This map, however, is limited to representing only the temperature on a two-dimensional surface and thus, it does not show how temperature varies as a function of altitude.

4. To visualize a scalar field, we use the following approaches:
    * **Contour Maps**: in this approach, we fix one of our independent variables (z, for example) and then show a contour map for the two remaining dimensions, in which the curves represent lines of constant values of our function-under-interest. A series of these maps for various (fixed) values of z will give a feel for the properties of the scalar function.
    * **Color Coding**: in this approach, we represent the values of the scalar field is by colour-coding in two dimensions for a fixed value of the third. An example is the night-time temperatures map we see above.
    * **Relief Maps**: in this approach, we represent a scalar field by fixing one of the dimensions (z, for example), and then plotting the value of the function as a height versus the remaining spatial coordinates, say x and y.

Figure 2: Methods of visualizing a scalar field: using Contour Maps (a); using Color Coding (b); using Relief Maps (c).

#### Vector field
1. Recall that a vector is a quantity that has both a magnitude (scalar) and a direction in space. In practice, we use vectors to physical quantities such as velocity, momentum, acceleration and force, associated with an object. However, when we try to describe a system that consists of a large number of objects, we need to assign a vector to each object.

2. As an example, let's consider falling snowflakes whereas snow falls, each snowflake moves in a specific direction. Here, we can assign to each snowflake a velocity vector that characterizes its movement. The falling snowflakes above is an example of a collection of discrete bodies. On the other hand, if we try to analyze the motion of continuous bodies such as fluids or flows, a velocity vector then needs to be assigned to every point in the fluid at any instant in time.

3. The result of this assignment is a vector field that represents both a magnitude (scalar) and a direction of every point in space. Thus, the distinction between a vector field and a scalar field is that the former contains information about both the direction and the magnitude at every point in space, while only a single variable is specified for the latter.

4. One example of a vector field is this expression:

$$
\vec{F}(x,y,z) = F_x(x,y,z)\hat{i} + F_y(x,y,z)\hat{j} + F_z(x,y,z)\hat{k}
$$
where the components are scalar fields.

Noted: the function $\vec{F}(x,y,z)$ can be denoted as $\mathbf{F}(\mathbf{x})$ with $\mathbf{x} = [x_1,x_2,x_3]$ and $\mathbf{F} = [f_1,f_2,f_3]$. This is the function that maps a space $\mathbb{R}^3$ to a new space $\mathbb{R^3}$ because for every point $(x,y,z)$ in a 3-D space, there is one point $(x_\hat{i},y_\hat{j},z_\hat{k})$ in a 3-D space. In practice, a vector-valued function $\mathbf{F}$ maps $\mathbb{R}^m → \mathbb{R}^n$ with $\mathbf{x} = [x_1,...,x_n]$ and $\mathbf{F} = [f_1,...,f_n]$.
$$
$$

Figure 3: An example of a vector field: a scenario of the variation of the jet stream, which is the wind velocity as a function of position. The “streamlines” are formed by joining arrows from head to tail.

5. To visualize a vector field, we use the following approaches:
    * **Quiver**: in this approach, we put arrows representing the field direction. The direction of the arrow at a given location represents the direction of the vector field at that point. In many cases, we also make the length of the vector proportional to the magnitude of the vector field at that point. However, we also may show only the direction with the vectors (that is make all vectors the same length) and colour-code the arrows according to the magnitude of the vector.
    * **Field Line**: in this approach, we first start at any point in space and move a very short distance in the direction of the local vector field, drawing a line as you do so. After that short distance, we stop, find the new direction of the local vector field at the point where we stopped, and begin moving again in that new direction. We continue this process indefinitely. Thereby we construct a line in space that is everywhere tangent to the local vector field.

Figure 4:  Methods of visualizing a vector field: using Quiver (a); using Field Line (b).

### b) Gradient
1. Consider a multivariable scalar function $f(x_1,x_2,x_3,...,x_n)$, a gradient is a vector-valued function that stores all the partial derivative information of this function.

$$
\nabla f = [\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2},\frac{\partial f}{\partial x_3},...,\frac{\partial f}{\partial x_n} ]
$$

2. Imagine that we are standing at a point $(x_1,x_2,x_3,...,x_n)$ in the space created by the function $f(x_1,x_2,x_3,...,x_n)$, the gradient $\nabla f$ tells us which direction we should travel to increase or decrease the value of $f(x_1,x_2,x_3,...,x_n)$ most rapidly.

3. As mentioned above, the gradient is a vector-valued function which means we can consider it as a vector field and visualize it as such.

### c) Divergence
1. Consider a vector-valued function $\vec{F}(\vec{F_1},\vec{F_2},\vec{F_3},...,\vec{F_n})$ that defines a vector field, a divergence is an operator that takes in the vector-valued function and outputs a scalar-valued function measuring how much the vector field is expanding or contracting at each point.

$$
\nabla \bullet \vec{F} = \frac{\partial \vec{F_1}}{\partial x_1} + \frac{\partial \vec{F_2}}{\partial x_2} + \frac{\partial \vec{F_3}}{\partial x_3} + ... + \frac{\partial \vec{F_n}}{\partial x_n}
$$

2. For example, consider the following vector $\vec{F} = (2x−y)\hat{i} + (y^2)\hat{j} = \begin{bmatrix} 2x - y \\ y^2 \end{bmatrix}$, we can compute the divergence of vector $\vec{F}$ as:

$$
\nabla \bullet \vec{F} = \begin{bmatrix} \frac{\partial}{\partial x} \\ \frac{\partial}{\partial y} \end{bmatrix} \bullet \begin{bmatrix} 2x - y \\ y^2 \end{bmatrix} = 2 + 2y
$$

3. The result tells us that at each point in the vector field, the expansion or contraction obeys the scalar-valued function $\nabla \bullet \vec{F} = 2 + 2y$.

4. The divergence at a point $(x_0, y_0, z_0)$ has the following properties:
    * $\nabla \bullet \vec{F} > 0 $: this means at this point, the vector field is flowing outwardly making it less dense (expanding). Thus, the point $(x_0, y_0, z_0)$ can be considered as a source.
    * $\nabla \bullet \vec{F} < 0 $: this means at this point, the vector field is flowing inwardly making it denser (contracting). Thus, the point $(x_0, y_0, z_0)$ can be considered as a sink.
    * $\nabla \bullet \vec{F} = 0 $: this means at this point, the vector field stays constant. Thus, the point $(x_0, y_0, z_0)$ is a divergence-free.

Figure 5: Visualization of a divergence evaluated at a designated point: the value of the divergence indicates whether the vector field is expanding, contracting or remains constant.

### d) Curl
1. Consider a vector-valued function $\vec{F}(\vec{F_1},\vec{F_2},\vec{F_3},...,\vec{F_n})$ that defines a vector field, a **curl** is an operator that takes in the vector-valued function and outputs a scalar-valued function measuring the rotation of the vector field at each point.

2. As an example, let's consider a 2-D and a 3-D vector fields, respectively: $\vec{v} = v_1(x,y)\hat{i} + v_2(x,y)\hat{j}$ and
$\vec{w} = w_1(x,y,z)\hat{i} + w_2(x,y)\hat{j} + w_3\hat(k)$. We compute curl of these vector fields as follows:

$$
\nabla \times \vec{v} = det(\begin{bmatrix} i & j \\ \frac{d}{dx} & \frac{d}{dy} \\ v_1 & v_2 \end{bmatrix}) =\frac{\partial v_2}{\partial x} - \frac{\partial v_1}{\partial y}
$$

$$
\nabla \times \vec{w} = det(\begin{bmatrix} i & j & k \\ \frac{d}{dx} & \frac{d}{dy} & \frac{d}{dz} \\ w_1 & w_2 & w_3 \end{bmatrix}) = (\frac{\partial w_3}{\partial y} - \frac{\partial w_2}{\partial z})\hat{i} + (\frac{\partial w_1}{\partial z} - \frac{\partial w_3}{\partial x})\hat{j} + (\frac{\partial w_2}{\partial x} - \frac{\partial w_1}{\partial y})\hat{k}
$$

3. The curl at a point $(x_0, y_0, z_0)$ has the following properties:
* $\nabla \times \vec{F} > 0 $: this means at this point, the vector field is flowing counter-clockwise (right-hand curl).
* $\nabla \times \vec{F} < 0 $: this means at this point, the vector field is flowing clockwise (left-hand curl).
* $\nabla \times \vec{F} = 0 $: this means at this point, the vector field is irrotational.

Figure 6: Visualization of a curl evaluated at a designated point: the value of the curl indicates whether the vector field is right-hand curl (RHC), left-hand curl (LHC) or irrotational.

```python
from sympy import *
x,y = symbols('x y')

##
# DEMO: VISUALIZING A SCALAR FIELD
#

f = 2*x**3 + 3*y**3
plot3d(f) # We use this function to create a 3-D plot

x1 = np.linspace(-10,10,1000)
x2 = np.linspace(-10,10,1000)
X1, X2 = np.meshgrid(x1,x2)
Y = 2*X1**3 + 3*X2**3

fig, axs = plt.subplots(1,3, figsize = (10,6)) # We use this function to create a 2x2 subplots
###
cm = plt.cm.get_cmap('viridis')
a = axs[0].scatter(X1,X2, c = Y, cmap = cm) # We use this function to create a heatmap plot
###
b = axs[1].contour(X1,X2,Y) # We use this function to create a contour plot
plt.clabel(b, inline = 1, fontsize = 10)
###
c = axs[2].contourf(X1,X2,Y) #We use this function to create a color coding plot
plt.clabel(c, inline = 1, fontsize = 10)
###
for ax in axs.flat:
    ax.set(xlabel = 'x', ylabel = 'y')
###
fig.tight_layout(pad = 3.0)
plt.show()

##
# DEMO: FINDING A GRADIENT OF A SCALAR FIELD
#
from sympy.vector import CoordSys3D, Del
R = CoordSys3D("R") # We use this function to define a frame R.
delop = Del() # We use this function to define the nabla operator
###
f = 1 / (R.x ** 2 + R.y ** 2 + R.z ** 2) - 1 / (R.x ** 2 + R.y ** 2 - R.z ** 2)
res = delop.gradient(f, doit = True) # We use this function to apply the nabla operator
print(res)

```

```python
##
# DEMO: FINDING A GRADIENT OF A SCALAR FIELD EVALUATED AT A POINT (x_0,y_0)
#
from sympy import symbols, Matrix
x, y, z = symbols('x y z')
f = 1/(x**2 + y**2 + z**2) - 1/(x**2 + y**2 - z**2)
###
dx = diff(f,x)
dy = diff(f,y)
grad_f = Matrix([dx, dy])

```

## 2. Jacobian
1. Consider a scalar-valued function $f(\mathbf{x})$ that maps a space $\mathbb{R}^n$ to a new one $\mathbb{R}$ where $\mathbf{x} = x_1,x_2,..,x_n>$, we can say the gradient is a transformation of $f(\mathbf{x})$:

$$
\nabla f(\mathbf{x}) = \frac{\partial f(\mathbf{x})}{\partial x_1} + \frac{\partial f(\mathbf{x})}{\partial x_2} + ... + \frac{\partial f(\mathbf{x})}{\partial x_n}
$$

2. From this knowledge, let's consider a vector-valued function $\mathbf{f}(\mathbf{x})$ that maps the space $\mathbb{R}^n$ to a new space $\mathbb{R^m}$, where $\mathbf{f} = [f_1,f_2,...,f_m]$ and $\mathbf{x} = [x_1, x_2,...,x_3]$. The so-called Jacobian is a transformation of $\mathbf{f}(\mathbf{x})$:

$$
\mathbb{J}_f = \frac{\partial (f_1, f_2,..., f_m)}{\partial (x_1,x_2,...,x_n)} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & ... & \frac{\partial f_1}{\partial x_m} \\ ... & ... & ... \\ \frac{\partial f_m}{\partial x_1} & ... & \frac{\partial f_m}{\partial x_n} \end{bmatrix}
$$

3. In other words, the Jacobian matrix is the generalization of a gradient. The Jacobian matrix is the same as the gradient when $m = 1$.

4. The determinant of the Jacobian matrix is typically used to describe changes of variables because it can be viewed as the ratio of an infinitesimal change in the variables of one coordinate system to another. To do so, the vector-valued function $\mathbf{f}(\mathbf{x})$ must map the space $\mathbb{R}^n$ to a new space $\mathbb{R^n}$, which means no change in the dimension.

## 3. Hessian
1. Consider the same scalar-valued function $f(\mathbf{x})$ that maps a space $\mathbb{R}^n$ to a new one $\mathbb{R}$ where $\mathbf{x} = x_1,x_2,..,x_n>$, we now take the gradient of its gradient:
$$
\nabla \bullet (\nabla f(\mathbf{x})) = \frac{\partial^2 f(\mathbf{x})}{\partial^2 x_1} + \frac{\partial^2 f(\mathbf{x})}{\partial^2 x_2} + ... + \frac{\partial^2 f(\mathbf{x})}{\partial^2 x_n}
$$

2. From this knowledge, let's consider a vector-valued function $\mathbf{f}(\mathbf{x})$ that maps the space $\mathbb{R}^n$ to a new space $\mathbb{R^m}$, where $\mathbf{f} = [f_1,f_2,...,f_m]$ and $\mathbf{x} = [x_1, x_2,...,x_3]$. The so-called Hessian is just the second-derivative of the Jacobian matrix:

$$
\mathbb{H}_f = \nabla \bullet \frac{\partial (f_1, f_2,..., f_m)}{\partial (x_1,x_2,...,x_n)} =
\begin{bmatrix}
\frac{\partial^2 f_1}{\partial^2 x_1} & \frac{\partial^2 f_1}{\partial x_1 \partial x_2} & ... & \frac{\partial^2 f_1}{\partial x_1 \partial x_n} \\ \frac{\partial^2 f_2}{\partial x_2 \partial x_1} & \frac{\partial^2 f_2}{\partial^2 x_2} & ... & \frac{\partial f_2}{\partial x_2 \partial x_n} \\ \frac{\partial^2 f_m}{\partial x_n \partial x_1} & \frac{\partial^2 f_m}{\partial x_m \partial x_2} & ... & \frac{\partial^2 f_m}{\partial^2 x_n}
\end{bmatrix}
$$

## 4. Gradient Descent
1. So why do we have to care about Gradient, Jacobian and Hessian? Because it is the backbone of the gradient descent algorithm used in machine learning.

2. Considering a simple machine learning that takes many input variables $X = [x_1, x_2, x_3,...,x_n]$ (our data) and outputs a set of decisions $Y = [y_1, y_2, y_3,...,y_n]$, we define the loss function $\mathbb{L}$ as the difference between the model output and the ground truth $\hat{Y} = [\hat{y}_1, \hat{y}_2, \hat{y}_3,...,\hat{y}_n]$.
$$
\mathbb{L} = |\hat{Y} - Y|
$$

3. We also know the relationship between the model output and the input variables can be simply described as:
$$
Y = W\bullet X + B = [w_1x_1 + b_1, w_2x_2 + b_2,...,w_nx_n + b_n]
$$

4. To make our model feasible, we need to optimize our loss function $\mathbb{L}$ by finding its global minimum where we are certain that our weights $W$ are the most optimal.

Figure 1: Visualization of our multivariate loss function on the input space.

5. To do so, we first compute the gradient of our loss function because the gradient gives us the direction of the steepest increase.

Figure 2: Visualization of the gradient of our loss function. As mentioned above, the gradient gives us the direction of the steepest increase, which is illustrated here as a ball rolling upwards from the global minimum.

6. By taking the negative of the gradient, we now know the direction of the steepest decrease.

Figure 2: Visualization of the gradient descent. Having armed with the knowledge of which direction to go, we can optimize our loss function. After a set of periods of training usually referred as epochs, we manage to find where our weights are most optimal.

```python
##
# DEMO: FINDING THE JACOBIAN OF A VECTOR FUNCTION
#
from sympy import symbols, Matrix, Function, exp

x1, x2 = symbols('x1 x2')
f = symbols('f', cls = Function)

X = Matrix([x1,x2])
f = Matrix([-x1*x2*exp(-(x1**2 + x2**2)/2)])

f.jacobian(X)
```

$\displaystyle \left[\begin{matrix}x_{1}^{2} x_{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} - x_{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} & x_{1} x_{2}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} - x_{1} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}}\end{matrix}\right]$

```python
##
# DEMO: FINDING THE HESSIAN OF A VECTOR FUNCTION
#
from sympy import hessian
hessianf = hessian(f,X)
hessianf
```

$\displaystyle \left[\begin{matrix}- x_{1}^{3} x_{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + 3 x_{1} x_{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} & - x_{1}^{2} x_{2}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + x_{1}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + x_{2}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} - e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}}\\- x_{1}^{2} x_{2}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + x_{1}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + x_{2}^{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} - e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} & - x_{1} x_{2}^{3} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}} + 3 x_{1} x_{2} e^{- \frac{x_{1}^{2}}{2} - \frac{x_{2}^{2}}{2}}\end{matrix}\right]$

# IV. Integrals
## 1. What is an integral?
1. An integral is an opposite of a derivate: a derivate finds a slope of a function's curve, while an integral finds an area under a function's curve.

2. For example, we have a function $f(x) = x^2$, and we want to find the area between $x =0$ and $x = 2$ for this function. We can find the area by using a method called **Riemann Sum**.

***
* From the interval [0,2], we partitions it into a $n$ number of subintervals, each has a width of: $\Delta x = \frac{2 - 0}{n}$.
* The points of in the partition will then be: $0, 0 + \Delta x, 0 + 2\Delta x, ..., 0 + (n-2)\Delta x, 0 + (n-1)\Delta x, 2$
* We then compute the area under the curve:
$$
A = \Delta x[f(0) + f(0 + \Delta x) + f(0 + 2\Delta x) + ... f(2 - \Delta x) + f(2)]
$$
***

Figure 1: Visualization of the Riemann Sum for $f(x) = x^2$: to compute the area under a function's curve from point $(x_0,y_0)$ to $(x_k,y_k)$. we pack some rectangles with equal width under the curve and sum their areas. This method is extremely powerful for integrals we cannot analytically solve.

3. In practice, we compute the area under a function's curve by taking a definite integral from point $a$ to point $b$:
$$
A = \int_a^b f(x)dx
$$

4. Let's move back to the Riemann Sum, there are three types of Riemann sum:
    * In a **Left Riemann Sum**, we approximate the area using rectangles (usually of equal width), where the height of each rectangle is equal to the value of the function at the left endpoint of its base.
    * In a **Right Riemann Sum**, we approximate the area using rectangles (usually of equal width), where the height of each rectangle is equal to the value of the function at the right endpoint of its base.
    * In a **Midpoint Riemann Sum**, the height of each rectangle is equal to the value of the function at the midpoint of its base.
    * In a **Trapezoidal Riemann Sum** also known as the **Trapezoidal Rule**, the area under the curve is the average of the Left Sum and the Right Sum.

Figure 2: Types of Riemann Sum: Left Riemann Sum (a); Right Riemann Sum (b); Trapezoidal Riemann Sum (c). The Midpoint Riemann Sum is not shown here.

```python
##
# DEMO: COMPUTE THE DEFINITE INTEGRAL:
#
from sympy import integrate, symbols, sin
x = symbols('x')
f = sin(x)
integrate(f,(x,0,np.pi))
```

$\displaystyle 2.0$

```python
##
# DEMO: COMPUTE THE RIEMANN SUM USING TRAPEZOIDAL RULE
#
def trapezoidal_riemann(a,b, n,*args):
    h = (b - a) / (n-1)
    x = np.linspace(a,b,n)

    f = np.sin(x)

    A = (h/2) * (f[0] + 2 * sum(f[1: n-1] + f[n-1]))

    return A

trapezoidal_riemann(a = 0, b = np.pi, n = 1000)
```

    1.999998351770849

## 2. Applications of Integrals
1. One application of integrals is computing the finding areas under probability distributions to get probabilities. For example, we want to compute the probability that any given golden retriever’s weight is between 61 and 62 pounds, and we know that the population mean is 64.43 pounds and the population standard deviation is 2.99 pounds.

Figure 1: An example of using integrals: computing the area under the curve of a probability density function.

```python
##
# DEMO: COMPUTE THE PROBABILITY DENSITY FUNCTION
#
import math

def normal_pdf(x: float, mean: float, std_dev: float) -> float:
    return (1.0 / (2.0 * math.pi * std_dev ** 2) ** 0.5) * math.exp(-1.0 * ((x - mean) ** 2 / (2.0 * std_dev ** 2)))

def approximate_integral(a, b, n, f):
    delta_x = (b - a) / (n - 1)

    total_sum = 0
    for i in range(1, n + 1):
        midpoint = 0.5 * (2 * a + delta_x * (2 * i - 1))
        total_sum += f(midpoint)

    return total_sum * delta_x

p_between_61_and_62 = approximate_integral(a = 61, b = 62, n = 1000, f = lambda x: normal_pdf(x,64.43,2.99))
print(p_between_61_and_62)

```

    0.08263012897923018

# Appendix

## 1. Understanding the gradient
1. As previously mention, we picture $\nabla f$ as a vector field, but how do we intepret these vector fields? So, let's think about the case where the input of fff is two-dimensional. The gradient turns each input point $(x_0, y_0)$ into the vector $\nabla f(x_0,y_0) = [\frac{\partial f}{\partial x}(x_0,y_0),\frac{\partial f}{\partial y}(x_0,y_0)]$.

2. Next, we think of the graph of $f$ as hilly terrain. If we are standing on the part of the graph directly above—or below—the point $(x_0, y_0)$, the slope of the hill depends on which direction you walk. For example, if you step straight in the positive $x$ direction, the slope is $\frac{\partial f}{\partial x}$; if we step straight in the positive $y$-direction, the slope is $\frac{\partial f}{\partial y}$.

3. Therefore, if we walk in the direction of the gradient, we will be going straight up the hill. Similarly, the magnitude of the vector $\nabla f(x_0, y_0)$ tells us what the slope of the hill is in that direction.
$$
$$

Figure 1: Understanding the gradient (adapted from **The Gradient** by Khan Academy).

## 2. Number Theory
### a) Number Systems
1. The first system is **natural numbers** $\mathbb{N}$. **Natural numbers** are whole numbers such as 0, 1, 2, 3, 4, 5, ..., and so on.

2. The second system is **integers** $\mathbb{Z}$. **Integers** include positive and negative whole numbers as well as 0.

3. The third system is **ration numbers**. **Rational numbers** are any number that we can express as a fraction such as $\frac{3}{2}$. This includes all finite decimals, repeating decimals, and integers since they can be expressed as fractions too.

4. The fourth system is **irrational numbers**. **Irrational numbers** are any number that we cannot be expressed as a fraction and have an infinite number of decimal places with no pattern. Examples include the famous $\pi$, Euler’s number $e$, and the
the square root of certain numbers like 2.

5. The fifth system is **real numbers** $\mathbb{R}$. Real numbers include rational as well as irrational numbers. In practicality, when we are doing any data science/machine learning/deep learning work, we can treat any decimals you work with as real numbers. In plain Python, we effectively treat any floating type as a real number.

6. The final system is **complex numbers** $\mathbb{C}$. When we take the square root of a negative number, we end
up with an imaginary number. **Imaginary Numbers** are often denoted by $i$. A **complex number** composes of a real part and an imaginary part: $m = a + bi$.

Figure 2: Visualiztion of the number systems.

### b) Variables and function
1. A **variable** is a named placeholder for an unspecified or unknown number. Meanwhile, Functions are expressions that define relationships between two or more variables. More specifically a function takes independent variables (also called domain variables or input variables), plugs them into an expression, and then results in a dependent variable (also called an output variable).

# Suggestive Reading
1. Khan Academy has a comprehensive list of multivariate calculus tutorial given by the creator of the _3 Blue 1 Brown_ Youtube channel: [Multivariate Calculus](https://youtube.com/playlist?list=PLSQl0a2vh4HC5feHa6Rc5c0wbRTx56nF7)

Multivariate Calculus/Multivariate Calculus - Lecture Note.ipynb