Skip to content

Instantly share code, notes, and snippets.

@mitmul
Last active January 30, 2019 19:06
Show Gist options
  • Save mitmul/d0fc10d7842a22d022be08acd0ea09fb to your computer and use it in GitHub Desktop.
Save mitmul/d0fc10d7842a22d022be08acd0ea09fb to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2章 基礎的な数学(微分、線形代数、統計)\n",
"\n",
"本章では、ディープラーニングを含めた機械学習に必要な数学の基礎である「微分」「線形代数」「確率・統計」の3つについて、簡潔に紹介していきます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 機械学習とは\n",
"\n",
"機械学習とは、与えられたデータから、未知のデータに対しても当てはまる規則やパターンを抽出したり、それらを元に未知のデータを分類したり、予測したりするための手法等を研究する学術領域です。機械学習は様々な技術に応用されており、例えば画像認識、音声認識、文書分類、医療診断、迷惑メール検知、商品推薦など、幅広い分野で重要な役割を果たしています。\n",
"\n",
"与えられたデータ(**訓練データ(training data)**)から、未知のデータ(**テストデータ**)に対しても当てはまる規則やパターンを抽出したり、抽出されたパターンを使って、データを人間にとって意味のあるカテゴリに分類するための関数を得ることを、**学習**と呼びます。\n",
"\n",
"学習によって獲得される関数(**モデル**ともよばれます)は多くの場合**パラメータ**と呼ばれる数値の集合によって特徴づけられています。単純な例として、直線の方程式を考えてみましょう。これは、傾き $a$ と切点 $b$ の2つのパラメータで特徴づけられ、 $f(x; a, b) = ax + b$ と表記できます。これは、「 $;$ 」の後ろに書かれているパラメータ(ここでは $a, b$ )によって特徴づけられ、一つの入力 $x$ を与えると一つの出力 $y$ を返す関数 $f$ という意味です。機械学習の目標は、訓練データを用いてこれらのパラメータを決定すること等となります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 目的関数\n",
"\n",
"機械学習では、多くの場合、**目的関数(objective function)**と呼ばれるものをモデルとは別に用意し、これを最小化するようにモデルのパラメータを決定することによって、そのモデルが望ましい働きをするように訓練します。そのため、目的関数はモデルの出力値が望ましい場合には小さな値をとり、そうでない場合は大きな値をとるように設計します。\n",
"\n",
"例えば、学習データとして2次元空間上の点を $n$ 個集めたデータセット $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)$ とおくと、次のような目的関数を利用することができます。\n",
"\n",
"$$\n",
"L(\\theta) = \\sum_{i=1}^n (y_i - f(x_i; \\theta))^2\n",
"$$\n",
"\n",
"この関数を最小化するとはどういうことかを考えてみましょう。上式は、モデルの予測値 $f(x_i; \\theta)$ と正解 $y_i$ との二乗誤差を各データ点(データセット内のひとつのデータ)についてそれぞれ求め、そのデータセット全体に渡る合計値を計算しています。このため、$L(\\theta)$ の値は全てのデータ点に対する予測が正解と一致した場合にだけ $0$ となり、それ以外は予測のはずれ具合に応じた正の値をとります。間違えた度合いを測る関数を、特に**損失関数(loss function)**と呼ぶ場合があります。また、与えられたデータセット全体に対するペナルティの合計値を求めるような目的関数は**コスト関数(cost function)**と呼ばれることもあります。いずれにせよ、目的関数を最小化する最適な $\\theta$ を求めることで、データセット $D$ に含まれる点の $x$ 座標の値 $x_i (i=1, 2, \\dots, n)$ から、その $y$ 座標の値 $y_i (i=1, 2, \\dots, n)$ を精度良く予測する関数 $f(x; \\theta)$ が得られることになります。\n",
"\n",
"目的関数の最小化問題を理解するためには、微分と線形代数の知識が必要になります。ただし、微分と線形代数に関する全ての知識が必要なわけではありません。ここでは、機械学習を学び始める前に必要となる最低限の知識を解説します。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 微分\n",
"\n",
"関数の入力値における微分は、その点における**接線の傾き**に相当し、下図のように関数に接する直線として表すことができます。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/01.png)\n",
"\n",
"例えば上図では、赤い直線が点 $a$ における接線を表しており、その傾きは $+3$ です。右肩上がりの直線の傾きは正の値になります。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/02.png)\n",
"\n",
"一方、上図の点 $b$ においては、傾きは $-1$ です。接線は右肩下がりの直線となっています。\n",
"\n",
"もし目的関数の値があり得る全てのパラメータについて計算できているならば、その中から目的関数の最小値を選び出すこともできるかもしれませんが、そのようなことは通常不可能です。しかし、ある点における目的関数の微分を計算できれば、その位置での接線の傾きから、パラメータ全域にわたる関数の形状が分からなくても、パラメータを変化させた時に目的関数がどう変化するのか(値は増えるのか、減るのか)が分かります。この情報に基づけば、目的関数を小さくするようにパラメータを更新することができます。\n",
"\n",
"再度、微分の説明に戻り、その定義や多変数入力、多変数出力の場合について詳しくみていきます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2点間を通る直線の傾き\n",
"\n",
"はじめに、微分の原理を理解していくために、下図に示す2点間を通る直線の傾き $a$ を求めてみましょう。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/04.png)\n",
"\n",
"この時、傾き $a$ は、\n",
"\n",
"$$\n",
"a = \\dfrac{f(x_{2}) - f(x_{1})}{x_{2}-x_{1}}\n",
"$$\n",
"\n",
"と求まります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1点での接線の傾き\n",
"\n",
"次に、与えられた関数の接線の傾きを求めていきます。そのためには、**極限**の考えが必要になります。極限では、変数がある値に限りなく近づくとき、その変数によって記述される関数がどのような振る舞いをするか考えます。極限を表すために、 $\\lim$ という記号が一般的に用いられます。例えば、\n",
"\n",
"$$\n",
"\\displaystyle \\lim _{x\\rightarrow 0}3x=3\\times 0=0\n",
"$$\n",
"\n",
"は、 $x$ という変数を $0$ に近づけていったときに式の値がどのような値になるかを表しています。\n",
"\n",
"それでは、下図のある点 $x$ における接線の傾き $a$ を求めていきましょう。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/05.png)\n",
"\n",
"さきほど考えた2点を通る直線と極限を組み合わせて、接線を求めることができます。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/06.png)\n",
"\n",
"はじめに、 $x$ から $h$ だけ離れた点 $x + h$ を考え、2点を通る直線の傾きを求めてみます。次に $h$ を $h \\rightarrow 0$ のように小さくしていけば、直線の開始点と終了点の2点が1点に収束し、1点での接線として考えることができます。これを式でみると\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"a\n",
"&= \\lim_{h \\rightarrow 0} \\frac{f(x + h) - f(x)}{(x + h) - x} \\\\\n",
"&= \\lim_{h \\rightarrow 0} \\frac{f(x + h) - f(x)}{h} \\\\\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"となります。上の式は**導関数**とよび、 $f'(x)$ で表されます。また導関数を求めることを**微分する**といいます。また、記号の使い方として、\n",
"\n",
"$$\n",
"(\\cdot)' = \\frac{d}{dx}(\\cdot)\n",
"$$\n",
"\n",
"のように表しても構いません。この $d$ という記号は微分(differentiation)を表しており、 $d(\\cdot)$ が対象の値の変化量、 $dx$ が $x$ の変化量を表し、それらを小さくしていった時の極限を表します。この記法は煩雑ですが、変数が $x$ 、 $y$ など複数ある場合に、 $x$ で微分しているのか、 $y$ で微分しているかが明確になるため、正確な表現をすることができます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 微分の公式\n",
"\n",
"覚えておくと便利な微分の公式があります。以下に幾つか紹介します。以下では、 $c$ は定数、 $x$ は変数を表します。\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\left( c\\right)^{'} &= 0 \\\\\n",
"\\left( x\\right)^{'} &= 1\\\\\n",
"\\left( cf(x) \\right)^{'} &= c f'(x) \\\\\n",
"\\left( x^{n} \\right)^{'} &= nx^{n-1} \\\\\n",
"\\left( f(x) + g(x) \\right)^{'} &= f^{'}(x) + g^{'}(x) \\\\\n",
"\\left( f(x) g(x) \\right)^{'} &= f^{'}(x)g(x) + f(x)g^{'}(x) \\\\\n",
"\\left( f(g(x)) \\right)^{'} &= \\frac{df(u)}{du}\\frac{du}{dx} \\hspace{1em} \\text{where $u = g(x)$}\n",
"\\end{align}\n",
"$$\n",
"\n",
"例えば、以下の式の $x$ での微分を考えてみましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\left( 3x^{2} + 4x + 5 \\right)' &= \\left( 3x^{2} \\right)' + \\left( 4x \\right)' + \\left( 5 \\right)' \\\\ \n",
"&= 3 \\times \\left( x^{2} \\right)' + 4 \\times \\left( x \\right)' + 5 \\times \\left( 1 \\right)' \\\\ \n",
"&= 3 \\times 2x + 4 \\times 1 + 5 \\times 0 \\\\ \n",
"&= 6x + 4 \n",
"\\end{aligned}\n",
"$$\n",
"\n",
"このように、複数の項の和に対する微分の計算は、各項に対して微分した後に和をとるようにしても等式の関係が成立します。また、各項の微分を行う際に、定数の係数(変数にかかる数)は微分演算の外側に出すことができます。これらは微分の **線形性** とよばれる性質であり、この性質は微分の計算を行う際によく活用されます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 合成関数の微分\n",
"\n",
"後の章で詳しく述べますが、一般的に機械学習においては複雑な **合成関数の微分** を考える必要が出てきます。簡単な例として、\n",
"\n",
"$$\n",
"\\left\\{ (3x + 4)^{2} \\right\\}'\n",
"$$\n",
"\n",
"を計算することを考えます。この式は、 $3x+4$ という内側の部分と $(\\cdot)^{2}$ という外側の部分で構成されています。この式を $(9x^2 + 24x + 16)'$ のように展開してから微分を計算してもよいのですが、3乗や4乗となってくると展開するのも大変になります。ここで役に立つ考え方が合成関数の微分です。先程紹介した微分の公式の最後に登場していた式です。合成関数の微分は、内側の微分と外側の微分をそれぞれ行い、その結果をかけ合わせることで求めることができます。外側の微分の際には関数の引数を入力とみなし、その入力について微分をとります。\n",
"\n",
"それではこの $(3x+4)^2$ という関数の微分を考えてみます。\n",
"\n",
"まず内側の関数を $u = (3x+4)$ とおいて、\n",
"\n",
"$$\n",
"\\left\\{ (3x + 4)^{2} \\right\\}' = (u^{2})'\n",
"$$\n",
"\n",
"と見ます。ここで、 $(\\cdot)'$ をもう少し厳密に考える必要が出てきます。今は、 $x$ と $u$ の2つの変数が登場しており、 $(\\cdot)'$ では、 $x$ で微分しているのか $u$ で微分しているのかの区別がつきません。そこで、多少複雑に見えますが、先程紹介した $d$ を使った記法で微分する変数を明示的に記述すると、\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\left\\{ (3x + 4)^{2} \\right\\}' &= \\frac{d}{dx} \\left\\{ (3x + 4)^{2} \\right\\} \\\\\n",
"&= \\frac{du}{dx} \\frac{d}{du} (u^2) \\\\\n",
"&= \\frac{d}{du} (u^{2}) \\cdot \\frac{d}{dx} (3x + 4) \\\\ \n",
"&= 2u \\cdot 3 \\\\ \n",
"&= 6u = 6(3x + 4) = 18x + 24 \\\\ \n",
"\\end{aligned}\n",
"$$\n",
"\n",
"となります。\n",
"\n",
"ニューラルネットワークの仕組みを理解する上では、このような合成関数の微分を使用する場面が頻繁に登場するため、この計算方法をしっかりと覚えておきましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 偏微分\n",
"\n",
"機械学習では、1つの入力変数 $x$ から出力変数 $y$ を予測するケースは稀であり、多くの場合、複数の入力変数 $x_1, x_2, \\dots, x_M$ を用いて出力変数 $y$ を予測する多変数関数が扱われます。例えば、家賃を予測する場合、部屋の広さだけではなく、駅からの距離や周辺の犯罪発生率なども同時に考慮した方がより正確に予測ができると期待されます。複数の入力 $x_1, x_2, \\dots, x_M$ をとる関数 $f(x_1, x_2, \\dots, x_M)$ を多変数関数とよびます。この多変数関数において、ある入力 $x_m$ にのみ注目して微分することを **偏微分** とよび、\n",
"\n",
"$$\n",
"\\frac{\\partial}{\\partial x_{m}} f(x_1, x_2, \\dots, x_M)\n",
"$$\n",
"\n",
"と表します。微分を意味する記号が、 $d$ から $\\partial$ に変わっています。こうすると、 $\\frac{\\partial}{\\partial x_m}$ は $x_m$ 以外を定数と考え、 $x_m$ にのみ着目して微分を行うという意味となります。(ただし、入力変数が他の入力変数と独立でない場合は定数と考えることはできません。しかし本資料ではそのようなケースは出てきません。)\n",
"\n",
"例題で具体的な計算の流れを確認しましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\frac{\\partial}{\\partial x_1}\n",
"\\left( 3x_1+4x_2 \\right)\n",
"&= \\frac{\\partial}{\\partial x_1}\n",
"\\left( 3x_1 \\right) + \\frac{\\partial}{\\partial x_1} \\left( 4x_2 \\right) \\\\\n",
"&= 3 \\times \\frac{\\partial}{\\partial x_1} \\left( x_1 \\right) + 4 \\times \\frac{\\partial}{\\partial x_1} x_2 \\\\\n",
"&= 3 \\times 1 + 4 \\times 0 \\\\\n",
"&= 3\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"偏微分でも微分と同じ公式を適用できます。今回のケースでは、 $x_1$ にだけ着目するため、 $x_2$ は定数として扱われています。このことを把握しておくと上記の計算の流れが理解しやすくなります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 線形代数"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 線形代数とは\n",
"\n",
"次に、**線形代数** について解説します。ベクトル、行列、逆行列などの言葉が登場します。\n",
"\n",
"線形代数で用いられる記法等を導入することで、複数の変数間の関係をシンプルに記述可能となるため、機械学習の理論を勉強する際は線形代数で用いられる概念が頻出します。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### スカラー/ベクトル/行列/テンソル\n",
"\n",
"最初に線形代数で使われるスカラー、ベクトル、行列、テンソルという4つの言葉を解説します。\n",
"\n",
"**スカラー (scalar)** は、1つの値もしくは変数のことです。例えば、\n",
"\n",
"$$\n",
"x, \\ y,\\ M,\\ N\n",
"$$\n",
"\n",
"のように表します。一般的に、太字や斜体にされていない文字がスカラーを表すのに使われます。スカラーは例えば温度や身長といった単一の数量を表すことに使われます。\n",
"\n",
"**ベクトル (vector)** は、複数のスカラーを縦方向(もしくは横方向)に集めて並べたものであり、\n",
"\n",
"$$\n",
"{\\bf x}=\\begin{bmatrix}\n",
"x_{1} \\\\\n",
"x_{2} \\\\\n",
"x_{3}\n",
"\\end{bmatrix}, \\\n",
"{\\bf y}=\\begin{bmatrix}\n",
"y_{1} \\\\\n",
"y_{2} \\\\\n",
"\\vdots \\\\\n",
"y_{N}\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"のように表します。ベクトルを表すのに用いられる文字は、スカラーと区別しやすいよう太字とするのが一般的です。ベクトルを表現する際、縦方向に並べたものを列ベクトル、横方向に並べたものを行ベクトルとよびます。本資料では、特に明示しない限り、単にベクトルと表現した場合には列ベクトルを指すこととします。\n",
"\n",
"**行列 (matrix)** は複数の同じサイズのベクトルを並べたものであり、\n",
"\n",
"$$\n",
"{\\bf X} =\n",
"\\begin{bmatrix}\n",
"x_{11} & x_{12} \\\\\n",
"x_{21} & x_{22} \\\\\n",
"x_{31} & x_{32}\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"のようなものを表します。行列のサイズは行数と列数で表現します。例えば、この ${\\bf X}$ は3行2列なので、サイズが $(3, 2)$ である行列、と言います。しばしば行列は大文字、または大文字の太文字で表記することで区別されます。\n",
"\n",
"**テンソル** はベクトルや行列を一般化した概念であり、ベクトルは1階のテンソル、行列は2階のテンソルと言うことができます。また、図のように行列を奥行き方向にさらに並べたものは3階のテンソルと呼ばれます。例えば、カラー画像をデジタル表現する場合、1枚の画像はRGB (Red Green Blue)などの複数のチャンネルを持つのが一般的です。各チャンネルは行列となっていて、それが3枚重なったものとして1枚の画像が取り扱われます。このため、行列がチャンネル方向に複数積み重なるため、画像は3階テンソルとして表されると言えます。本資料では、単に「テンソル」と言った場合は3階以上のテンソルを指します。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/07.png)\n",
"\n",
"線形代数では ${\\bf y}$ や ${\\bf X}$ 、 $a$ や $K$ といった様々な字体の文字が含まれる式を扱います。その際、これはベクトル、これは行列、などを常に意識しながら式を追いかけていくのがおすすめです。以下に文字のスタイルと、その意味を簡単に表でまとめておきます。\n",
"\n",
"| 字体 | 小文字 | 大文字 |\n",
"|:------:|:--------------:|:--------------:|\n",
"| 細字 | スカラーの変数 | スカラーの定数 |\n",
"| 太字 | ベクトル | 行列、テンソル |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 足し算・引き算\n",
"\n",
"行列やベクトル同士の演算について学んでいきましょう。足し算は同じサイズの行列またはベクトルの間だけで成立します。以下に、行列およびベクトル同士の和の計算方法を具体例で示します。\n",
"\n",
"**ベクトル同士の和**\n",
"$$\n",
"\\begin{bmatrix}\n",
"1 \\\\\n",
"2 \\\\\n",
"3\n",
"\\end{bmatrix}+\\begin{bmatrix}\n",
"4 \\\\\n",
"5 \\\\\n",
"6\n",
"\\end{bmatrix}=\\begin{bmatrix}\n",
"1 + 4 \\\\\n",
"2 + 5 \\\\\n",
"3 + 6\n",
"\\end{bmatrix}=\\begin{bmatrix}\n",
"5 \\\\\n",
"7 \\\\\n",
"9\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"**行列同士の和**\n",
"$$\n",
"\\begin{bmatrix}\n",
"1 & 2 & 3 \\\\\n",
"4 & 5 & 6\n",
"\\end{bmatrix}+\\begin{bmatrix}\n",
"7 & 8 & 9 \\\\\n",
"10 & 11 & 12 \n",
"\\end{bmatrix}=\\begin{bmatrix}\n",
"1+7 & 2+8 & 3+9 \\\\\n",
"4+10 & 5+11 & 6+12\n",
"\\end{bmatrix}=\\begin{bmatrix}\n",
"8 & 10 & 12 \\\\\n",
"14 & 16 & 18\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"このように行列やベクトルの中の **要素** を、それぞれ対応する場所同士で足し合わせます。引き算も同様です。ベクトルや行列の足し算・引き算は、**互いに同じサイズのベクトル間もしくは行列間でないと計算が成立しない**という点に注意しましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 内積\n",
"\n",
"同じサイズのベクトル間では内積が定義できます。内積は、 $\\cdot$ で表され、同じ位置の対応する要素同士を掛けていき、それらを足し合わせることで計算できます。\n",
"\n",
"$$\n",
"\\begin{aligned}& \\begin{bmatrix}\n",
"1 & 2 & 3\n",
"\\end{bmatrix} \\cdot \\begin{bmatrix}\n",
"4 \\\\ \n",
"5 \\\\ \n",
"6\n",
" \\end{bmatrix} = 1 \\times 4 + 2 \\times 5 + 3 \\times 6 = 32 \\end{aligned}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### かけ算(行列積)\n",
"\n",
"行列の掛け算には、行列積、外積、要素積(アダマール積)など複数種あります。ここではそのうち最もよく使われる**行列積**について説明します。以降では明示しない限り行列の掛け算は行列積を指すこととします。\n",
"\n",
"行列 ${\\bf A}$ と行列 ${\\bf B}$ の行列積は、${\\bf A}$ の各行と ${\\bf B}$ の各列の内積を並べたものとして定義されます。例えば行列 ${\\bf A}$ の2行目の行ベクトルと、行列 ${\\bf B}$ の2列目の列ベクトルの内積の結果は、${\\bf A}$ と ${\\bf B}$ の行列積の結果を表す行列 ${\\bf C}$ の2行2列目に対応します。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/08.png)\n",
"\n",
"そして、内積が定義される条件はベクトルのサイズが等しいということでしたが、ここでもそれが成り立つために、${\\bf A}$ の**列数**と ${\\bf B}$ の**行数**が一致する必要があります。そして、結果の行列 ${\\bf C}$ の行数と列数は ${\\bf A}$ の行数と ${\\bf B}$ の列数とそれぞれ等しくなります。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/09.png)\n",
"\n",
"また、行列積がスカラー積と大きく異なる性質のひとつとして、${\\bf AB}$ と ${\\bf BA}$ が等しいとは限らないということが挙げられます。この違いを明示的に表現する言葉として、行列 ${\\bf A}$ に行列 ${\\bf B}$ を左から掛けること( ${\\bf AB}$ の計算)を行列 ${\\bf B}$ を行列 ${\\bf A}$ に**左乗**すると言い、右から掛ける場合は**右乗**すると言います。\n",
"\n",
"行列積は線形代数や機械学習の多くの問題で使われます。また、行列同士の演算には割り算(例えば ${\\bf A} / {\\bf B}$ )に相当するものはありませんが、後述する**逆行列**を使った ${\\bf A} {\\bf B}^{-1}$ のような逆行列の掛け算というものが登場します。\n",
"\n",
"それでは、計算条件を確認しながら、下記の3つの練習問題を計算してください。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"&\\left( 1\\right) \n",
"\\begin{bmatrix}\n",
"1 & 2\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"3 \\\\ \n",
"4\n",
"\\end{bmatrix}\\\\ \n",
"&\\left( 2\\right) \n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\ \n",
"3 & 4 \n",
"\\end{bmatrix}\\begin{bmatrix}\n",
"5 \\\\ \n",
"6 \n",
"\\end{bmatrix}\\\\ \n",
"&\\left( 3\\right) \n",
"\\begin{bmatrix} \n",
"1 & 2 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 & 4 \\\\ \n",
"5 & 6 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 \\\\ \n",
"1\n",
"\\end{bmatrix} \n",
"\\end{aligned} \n",
"$$ \n",
"\n",
"こちらが解答です。\n",
"\n",
"$$\n",
"\\begin{aligned} \n",
"&\\left( 1\\right) \n",
"\\begin{bmatrix} \n",
"1 & 2 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 \\\\ \n",
"4 \n",
"\\end{bmatrix} = 1\\times 3 + 2 \\times 4 = 11\\\\ \n",
"&\\left( 2\\right) \n",
"\\begin{bmatrix} \n",
"1 & 2 \\\\ \n",
"3 & 4\n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"5 \\\\ \n",
"6\n",
"\\end{bmatrix} = \\begin{bmatrix} \n",
"1 \\times 5 + 2 \\times 6 \\\\ \n",
"3 \\times 5 + 4 \\times 6 \n",
"\\end{bmatrix} = \\begin{bmatrix} \n",
"17 \\\\ \n",
"39 \n",
"\\end{bmatrix}\\\\ \n",
"&\\left( 3\\right) \n",
"\\begin{bmatrix} \n",
"1 & 2 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 & 4 \\\\ \n",
"5 & 6 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 \\\\ \n",
"1 \n",
"\\end{bmatrix} \n",
"=\\begin{bmatrix} \n",
"1 & 2 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"3 \\times 3 + 4 \\times 1 \\\\ \n",
"5 \\times 3 + 6 \\times 1 \n",
"\\end{bmatrix} = \\begin{bmatrix} \n",
"1 & 2 \n",
"\\end{bmatrix}\\begin{bmatrix} \n",
"13 \\\\ \n",
"21 \n",
"\\end{bmatrix}\n",
"= 1 \\times 13 + 2 \\times 21 \n",
"=55\n",
"\\end{aligned} \n",
"$$\n",
"\n",
"このような計算は、機械学習の基礎を学習していく過程でよく登場します。行列積では、演算前と後の行数・列数の変化に注意しましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 転置\n",
"\n",
"ベクトルは縦方向に要素が並んだ列ベクトルを基本としていましたが、横方向に要素が並んだ行ベクトルを使いたい場合もあります。そこで列ベクトルを行ベクトルに、行ベクトルを列ベクトルに変換する操作を**転置 (transpose)**とよび、ベクトルを表す文字の右肩に ${\\rm T}$ と書くことでこの操作が行われることを表します。例えば、\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf x}\n",
"&=\\begin{bmatrix}\n",
"1 \\\\\n",
"2 \\\\\n",
"3\n",
"\\end{bmatrix}, \\ \n",
"{\\bf x}^{\\rm T} = \\begin{bmatrix} 1 & 2 & 3 \\end{bmatrix} \\\\\n",
"{\\bf X}\n",
"&=\\begin{bmatrix}\n",
"1 & 4 \\\\\n",
"2 & 5 \\\\\n",
"3 & 6\n",
"\\end{bmatrix}, \\\n",
"{\\bf X}^{\\rm T}=\\begin{bmatrix}\n",
"1 & 2 & 3 \\\\\n",
"4 & 5 & 6\n",
"\\end{bmatrix}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"のようになります。行列に対する転置では、サイズが $(N, M)$ だったものは行と列が入れ替わるためサイズが $(M, N)$ の行列となります。つまり、 $i$ 行 $j$ 列目の値が転置後には $j$ 行 $i$ 列目の値になります。転置の公式として次を覚えておきましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"&\\left( 1\\right) \\ \\left( {\\bf A}^{\\rm T} \\right)^{\\rm T} = {\\bf A} \\\\\n",
"&\\left( 2\\right) \\ \\left( {\\bf A}{\\bf B} \\right)^{\\rm T} = {\\bf B}^{\\rm T}{\\bf A}^{\\rm T}\\\\\n",
"&\\left( 3\\right) \\ \\left( {\\bf A}{\\bf B}{\\bf C} \\right)^{\\rm T} = {\\bf C}^{\\rm T}{\\bf B}^{\\rm T}{\\bf A}^{\\rm T}\n",
"\\end{aligned}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ベクトル/行列のサイズ\n",
"\n",
"行列積を行った後は行列サイズが変化します。サイズが $(L, M)$ の行列と $(M ,N)$ の行列の行列積の結果は $(L, N)$ となります。例えば先ほどの3つの練習問題のサイズがどのように変化したかを以下にまとめます。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/10.png)\n",
"\n",
"(3)では、一番左端のベクトルと、真ん中の行列の乗算結果が、行ベクトルであるため、サイズの変化が(1)と同じケースに帰着することに注意してください。また、ある次元のサイズが1となった場合(例えば $(3, 1)$ の行列など)その次元を削除しベクトルをスカラーとして、行列をベクトルとして扱う場合があります。このようにサイズが1になった一部の次元をつぶす操作を\"squeeze\"と呼ぶ場合があります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 単位行列\n",
"\n",
"スカラー値の $1$ は、 $10 \\times 1 = 10$ のように、任意の数を $1$ に乗じても値が変化しないという性質を持ちます。行列の演算において、これと同様の働きをする行列が**単位行列**です。\n",
"\n",
"$$\n",
"{\\bf I} =\n",
"\\begin{bmatrix}\n",
"1 & 0 & \\cdots & 0 \\\\\n",
"0 & 1 & \\cdots & 0 \\\\\n",
"\\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
"0 & 0 & \\cdots & 1\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"上記のような形をしており、記号 ${\\bf I}$ で表されるのが一般的です。行列の斜めの要素を**対角要素**とよび、それ以外の要素を非対角要素とよびます。単位行列は、対角要素が全て $1$ で、非対角要素が全て $0$ であるような **正方行列**(行数と列数が等しい行列)です。例えば、$2 \\times 2$ の単位行列は、\n",
"\n",
"$$\n",
"{\\bf I} =\n",
"\\begin{bmatrix}\n",
"1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"であり、$3 \\times 3$の単位行列は、\n",
"\n",
"$$\n",
"{\\bf I} =\n",
"\\begin{bmatrix}\n",
"1 & 0 & 0 \\\\\n",
"0 & 1 & 0 \\\\\n",
"0 & 0 & 1\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"です。行列のサイズを明示したい場合に、 $I_n$ ( $n \\times n$ の単位行列の意味)と添字でサイズを表記することがあります。\n",
"\n",
"単位行列はサイズが等しい任意の正方行列 ${\\bf A}$ に対して以下の計算が成立します。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf A}{\\bf I} &= {\\bf A} \\\\\n",
"{\\bf I}{\\bf A} &= {\\bf A}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"適当な値を持つ行列を用意して、単位行列を掛け、元の行列と値が変わらないことを確認してみましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix}\n",
"&=\n",
"\\begin{bmatrix}\n",
"1 \\times 1 + 2 \\times 0 & 1 \\times 0 + 2 \\times 1 \\\\\n",
"3 \\times 1 + 4 \\times 0 & 3 \\times 0 + 4 \\times 1\n",
"\\end{bmatrix} \\\\\n",
"&=\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"元の行列と全ての要素が一致しました。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 逆行列\n",
"\n",
"ある行列の**逆行列**とは、元の行列に掛けると単位行列になるような行列であり、スカラーにおける逆数( $2 \\times 2^{-1} = 1$ )に対応するような行列です。行列 ${\\bf A}$ に対し、その逆行列を ${\\bf A}^{-1}$ と表記します。\n",
"\n",
"逆行列は以下のような性質を持ちます。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf A}{\\bf A}^{-1} = {\\bf I}\\\\\n",
"{\\bf A}^{-1}{\\bf A} = {\\bf I}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"ここで、 ${\\bf I}$ は単位行列です。サイズが $2 \\times 2$ や $3 \\times 3$ といった小さな行列の場合には、手計算でも可能な逆行列計算の方法が知られていますが、機械学習ではより大きなサイズの行列( $1000 \\times 1000$ など)を扱うことがあり、そういった大きな行列の逆行列を効率的または近似的にコンピュータを使って計算する手法が研究されています。\n",
"\n",
"また、逆行列は常に存在するとは限りません。逆行列が存在するような行列のことを**正則行列**と呼びます(行列が正則であるための条件については今回は説明しません。)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 線形結合と二次形式\n",
"\n",
"機械学習の式によく出てくる形式として、 ${\\bf b}^{\\rm T}{\\bf x}$ と ${\\bf x}^{\\rm T}{\\bf A}{\\bf x}$ の2つの形式があります。前者は**線形結合**もしくは**一次結合**、後者は**二次形式**とよばれています。スカラーの一次式( $ax + b$ )や二次式( $ax^2 + bx + c$ )をベクトルに拡張したものと捉えると良いでしょう。\n",
"\n",
"線形結合の計算を要素ごとに見てみると、\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf b}\n",
"&=\n",
"\\begin{bmatrix}\n",
"1 \\\\\n",
"2\n",
"\\end{bmatrix},\\ \n",
"{\\bf x} =\n",
"\\begin{bmatrix}\n",
"x_{1} \\\\\n",
"x_{2}\n",
"\\end{bmatrix}\\\\\n",
"{\\bf b}^{\\rm T}{\\bf x}\n",
"&=\n",
"\\begin{bmatrix}\n",
"1 & 2\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"x_1 \\\\\n",
"x_2\n",
"\\end{bmatrix}\n",
"= x_1 + 2x_2\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"のように ${\\bf x}$ の要素である $x_1$ および $x_2$ に関して一次式となっています。\n",
"\n",
"また、二次形式も同様に要素ごとに確認してみると、\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf A} &=\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix},\\ \n",
"{\\bf x} =\n",
"\\begin{bmatrix}\n",
"x_{1} \\\\\n",
"x_{2}\n",
"\\end{bmatrix}\\\\\n",
"{\\bf x}^{\\rm T}{\\bf A}{\\bf x}\n",
"&=\n",
"\\begin{bmatrix}\n",
"x_1 & x_2\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"x_1 \\\\\n",
"x_2\n",
"\\end{bmatrix} \\\\\n",
"&=\n",
"\\begin{bmatrix}\n",
"x_1 & x_2\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"x_1 + 2x_2 \\\\\n",
"3x_1 + 4x_2\n",
"\\end{bmatrix} \\\\\n",
"&=\n",
"x_1 \\left( x_1 + 2x_2 \\right) + x_2 \\left( 3x_1 + 4x_2 \\right) \\\\\n",
"&=\n",
"x^2_1 + 5x_1 x_2 + 4x_2^2\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"となり、各要素に関して二次式となっています。\n",
"\n",
"従って、二次関数は\n",
"\n",
"$$\n",
"{\\bf x}^{\\rm T}{\\bf A}{\\bf x} + {\\bf b}^{\\rm T}{\\bf x} + c\n",
"$$\n",
"\n",
"と表記できます。ここで、 $c$ はスカラーの定数項です。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ベクトルによる微分と勾配\n",
"\n",
"微分は、入力が変化した場合の関数値の変化量から求められました。これは関数の入力がベクトルである場合も同様です。ベクトルを入力にとる関数の微分を考えてみましょう。入力ベクトルの要素毎に出力に対する偏微分を計算し、それらを並べてベクトルにしたものが**勾配 (gradient)**です。\n",
"\n",
"まず勾配計算の具体例を見てみましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf b}\n",
"&=\\begin{bmatrix}\n",
"3 \\\\\n",
"4\n",
"\\end{bmatrix}, \\ \n",
"{\\bf x} =\n",
"\\begin{bmatrix}\n",
"x_{1} \\\\\n",
"x_{2}\n",
"\\end{bmatrix}\\\\\n",
"{\\bf b}^{\\rm T}{\\bf x} &=\n",
"\\begin{bmatrix}\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"x_1 \\\\\n",
"x_2\n",
"\\end{bmatrix}\n",
"= 3x_1 + 4x_2\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"この ${\\bf b}^{\\rm T}{\\bf x}$ をベクトル ${\\bf x}$ で微分したものを、\n",
"\n",
"$$\n",
"\\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf b}^{\\rm T}{\\bf x} \\right)\n",
"$$\n",
"\n",
"と表し、これは ${\\bf b}^{\\rm T}{\\bf x}$ を ${\\bf x}$ という**ベクトルで微分**することを意味しています。「ベクトルで微分」とは、ベクトルの要素それぞれで対象を微分し、その結果を要素に対応する位置に並べたベクトルを計算することで、具体的には以下のようなことを指しています。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf b}^{\\rm T} {\\bf x} \\right)\n",
"&= \\frac{\\partial}{\\partial {\\bf x}} \\left( 3x_1 + 4x_2 \\right) \\\\\n",
"&=\n",
"\\begin{bmatrix}\n",
"\\frac{\\partial}{\\partial x_1} \\left( 3x_1 + 4x_2 \\right) \\\\\n",
"\\frac{\\partial}{\\partial x_2} \\left( 3x_1 + 4x_2 \\right)\n",
"\\end{bmatrix}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"各要素の計算を進めると、以下のようになります。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\frac{\\partial}{\\partial x_1} \\left( 3x_1 + 4x_2 \\right)\n",
"&= \\frac{\\partial}{\\partial x_1} \\left( 3x_1 \\right)\n",
"+ \\frac{\\partial}{\\partial x_1} \\left( 4x_2 \\right) \\\\\n",
"&= 3 \\times \\frac{\\partial}{\\partial x_1} \\left( x_1 \\right)\n",
"+ 4 \\times \\frac{\\partial}{\\partial x_1} x_2 \\\\\n",
"&= 3 \\times 1 + 4 \\times 0 \\\\\n",
"&= 3\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\frac{\\partial}{\\partial x_2} \\left( 3x_1 + 4x_2 \\right)\n",
"&= \\frac{\\partial}{\\partial x_2} \\left( 3x_1 \\right)\n",
"+ \\frac{\\partial}{\\partial x_2} \\left( 4x_2 \\right) \\\\\n",
"&= 3 \\times \\frac{\\partial}{\\partial x_2} x_1\n",
"+ 4 \\times \\frac{\\partial}{\\partial ax_2} x_{2} \\\\\n",
"&= 3 \\times 0 + 4 \\times 1 \\\\\n",
"&= 4\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"計算結果を整理すると、以下のようになります。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf b}^{\\rm T}{\\bf x} \\right)\n",
"&=\n",
"\\begin{bmatrix}\n",
"\\frac{\\partial}{\\partial x_1} \\left( 3x_1 + 4x_2 \\right) \\\\\n",
"\\frac{\\partial}{\\partial x_2} \\left( 3x_1 + 4x_2\\right) \n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"3 \\\\\n",
"4\n",
"\\end{bmatrix}\n",
"=\n",
"{\\bf b}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"もう一つ別の例を考えてみましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"{\\bf b}\n",
"&=\n",
"\\begin{bmatrix}\n",
"3 \\\\\n",
"4\n",
"\\end{bmatrix}, \\ \n",
"{\\bf x}\n",
"=\n",
"\\begin{bmatrix}\n",
"x_{1} \\\\\n",
"x_{2}\n",
"\\end{bmatrix} \\\\\n",
"\\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf b} \\right)\n",
"&=\n",
"\\begin{bmatrix}\n",
"\\frac{\\partial}{\\partial x_1} \\left( 3 \\right) \\\\\n",
"\\frac{\\partial}{\\partial x_2} \\left( 4 \\right) \n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"0 \\\\\n",
"0\n",
"\\end{bmatrix}\n",
"=\n",
"{\\bf 0}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"偏微分を行う対象に変数が含まれていない場合、その偏微分は $0$ となります。要素が $0$ のみで構成されたベクトルを**ゼロベクトル**と言います。\n",
"\n",
"これらを踏まえて、いくつかよく現れるベクトルによる微分の計算結果をまとめて覚えておきましょう。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"&\\left( 1 \\right) \\ \\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf c} \\right) = {\\bf 0} \\\\\n",
"&\\left( 2 \\right) \\ \\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf b}^{\\rm T}{\\bf x} \\right) = {\\bf b} \\\\\n",
"&\\left( 3 \\right) \\ \\frac{\\partial}{\\partial {\\bf x}} \\left( {\\bf x}^{\\rm T}{\\bf A}{\\bf x} \\right) = \\left( {\\bf A} + {\\bf A}^{\\rm T} \\right) {\\bf x}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"(1)と(2) はすでに導出済みです。(3) は導出が少し複雑なので省略しますが、数値を代入して確認してみてください。この3つの計算は機械学習を学んでいく上でよく登場します。\n",
"\n",
"こういった行列やベクトルの計算で用いられる公式は他にもたくさんあり、知っておくと便利なものが [The Matrix Cookbook](https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf) などにまとまっています。論文等を読む際などにも参照すると便利かもしれません。\n",
"\n",
"今回は多変数を入力にとり、単一の出力を返す関数の微分を考えました。しかし、多変数の入力をとり多変数の出力を返す関数の微分を考える必要もでてきます。そのような微分結果はヤコビ行列(ヤコビアン)と呼ばれ、ニューラルネットワークの学習方法を理解するために必要となります。計算方法が [The Matrix Calculus You Need For Deep Learning](https://arxiv.org/abs/1802.01528) に分かりやすくまとまっています。ぜひ参考にしてください。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 確率・統計"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 確率や統計は何に使えるのか\n",
"\n",
"機械学習にも色々な手法があり、微分と線形代数の知識があれば理解できるアルゴリズムも多く存在します。しかし、「統計的機械学習」と呼ばれる分野の手法を理解するためには、確率・統計の知識が必須となります。\n",
"\n",
"また、機械学習の目的のひとつは、興味のある事象の個別の観測結果を集めたデータ集合(データセット)から、対象の事象の背後にある普遍性や法則性などを見つけ出すことです。確率は、どのようなデータがより頻繁に発生しやすいのか、を表現する確率分布という概念や、不確実性といった概念を取り扱うために利用することができます。また、対象のデータ集合に対して平均や分散などに代表される様々な統計量を計算し、機械学習のアルゴリズムにとって扱いやすいようにデータを正規化する、訓練したいモデルが適当なものなのか判断する、各データ点が外れ値かどうか判断する、といったことがよく行われます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 確率変数と確率分布\n",
"\n",
"この資料では、「確率」という言葉を数学的に厳密には定義しません。代わりに次のように考えます。ある対象としている現象の中で、様々な事象があり得るとき、それぞれの事象ごとに、それが「どの程度起きそうか」という度合いを考えます。確率とはその度合いのこととします。そして、その確率に従って、色々な値を取りうる**確率変数(random variable)**を考えます。確率変数は、名前に「変数」とついていますが、**「事象」を「数値」に変換する関数**と考えると理解しやすくなります。例えば、「コインを投げて表が出る」という「事象」を、「1」という「数値」に変換し、「コインを投げて裏が出る」という「事象」を、「0」という「数値」に変換する関数を考えると、これは「1」か「0」という値のどちらかを取りうる確率変数だ[<sup>*1</sup>](#fn1)ということになります。\n",
"\n",
"<span id=\"fn1\"><sup>*1</sup>: <small>ここでは概念の説明を簡単にするため、この例のように離散的な値を取る確率変数を考え、特に明示しない限り連続値の確率変数は考えないことにします。</small></span>\n",
"\n",
"それでは、確率的現象の具体例を考えてみます。ある歪んだサイコロがあり、「サイコロを投げて $x$ という目が出た」という事象[<sup>*2</sup>](#fn2)を、$x$ という数値に対応させる確率変数 $X$ があるとします。そして、この確率変数が取りうる全ての値が、それぞれどのような確率で出現するかを表した以下のような表があります。\n",
"\n",
"<span id=\"fn2\"><sup>*2</sup>: <small> $x$ は $1, 2, 3, 4, 5, 6$ のいずれか。すなわち $x \\in \\{1, 2, 3, 4, 5, 6\\}$</small></span>\n",
"\n",
"| 確率変数 $X$ の値 | その値をとる確率 |\n",
"|:-----------------:|:----------------:|\n",
"| 1 | $0.3$ |\n",
"| 2 | $0.1$ |\n",
"| 3 | $0.1$ |\n",
"| 4 | $0.2$ |\n",
"| 5 | $0.1$ |\n",
"| 6 | $0.2$ |\n",
"\n",
"このような表のことを**確率分布(probabilistic distribution)**と呼びます。確率分布には重要な制約があり、「確率変数が取りうる値のすべての確率を足すと和が必ず $1$ になること」及び「全ての確率は $0$ 以上の値であること」の両者を常に満たします。上の表の左の列に並ぶ数値を**実現値**と呼び、小文字の $x$ で表します。そして、右の列に並ぶそれぞれの $x$ に対応する確率を、 $p(x)$ と書きます。すなわち、上の表から $p(1) = 0.3$ , $p(2) = 0.1$ , ...といった式が成り立ちます。このような表記を用いると、確率分布が持つ2つの制約は、以下のように表せます。\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\sum_x p(x) &= 1 \\\\\n",
"\\forall x, \\ p(x) & \\geq 0\n",
"\\end{align}\n",
"$$\n",
"\n",
"ここで、 $\\sum_x$ は全てのありうる $x$ の値にわたる和を表し、例えば上のサイコロの例では、 $\\sum_{x=1}^6$ と同じことを意味します。 $\\forall x$ は、あり得る $x$ の値すべてにおいて、右の条件( $p(x) \\geq 0$ )が成り立つ、ということを意味しています。\n",
"\n",
"また、 $p(1) = 0.3$ というのは、確率変数 $X$ が $1$ という値をとる確率ということですが、これを $p(X = 1) = 0.3$ とも書きます。また、$p(x)$ という表記も登場しますが、これは $p(X = x)$ を簡単に表記したもので、 $X$ という確率変数がある値 $x$ を取る確率という意味です。一方、 $p(X)$ と確率変数だけを引数に取る場合、これは上の表のような確率分布を意味します。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 同時分布・周辺確率\n",
"\n",
"前節では、一つの確率変数について、その分布(確率分布のこと)とはなにかと、分布が持つ制約について說明しました。この節では、複数の確率変数が登場する場合について考えます。\n",
"\n",
"まず具体例を用いて考えてみます。ここに2つのサイコロがあり、それぞれのサイコロの出目を2つの確率変数 $X, Y$ で表します。この2つのサイコロを同時に振って、1つ目のサイコロが $x$ という値をとり、2つ目のサイコロが $y$ という値をとったという事象の確率は、以下のように書き表します。\n",
"\n",
"$$\n",
"p(X = x, Y = y)\n",
"$$\n",
"\n",
" $x, y$ はいずれも $1, 2, 3, 4, 5, 6$ の6つの数字のどれかです。例えば、「3」と「5」の目が出た、というとき、その確率は\n",
"\n",
"$$\n",
"p(X = 3, Y = 5)\n",
"$$\n",
"\n",
"と表されます。このように、 $X = 3$ となる**かつ** $Y = 5$ となる、といった複数の条件を指定したときに、それらが全て同時に成り立つ確率のことを、**同時確率(joint probability)**と呼びます。\n",
"\n",
"では次に、この2つのサイコロを別々に見てみましょう。例えば、「1つ目のサイコロが $3$ の目を出した」という事象が起こる確率 $p(X = 3)$ は、2つ目のサイコロが何の目を出していようが関係ないので、1つ目のサイコロが $3$ **かつ** 2つ目のサイコロが $1$ のとき/ $2$ のとき/ $3$ のとき/…/ $6$ のとき、の確率を全て足したものになります。つまり、\n",
"\n",
"$$\n",
"p(X = 3) = \\sum_y p(X = 3, Y = y)\n",
"$$\n",
"\n",
"と書けます。このとき、 $\\sum_y$ は「 $Y$ のとり得るあらゆる値 $y$ についての和」という意味です。これを、「(2つ目のサイコロの目がなんであれ)1つ目のサイコロの目が $x$ である確率」と一般化すると、以下のようになります。\n",
"\n",
"$$\n",
"p(X = x) = \\sum_y p(X = x, Y = y)\n",
"$$\n",
"\n",
"同様に、「(1つ目のサイコロの目がなんであれ)2つ目のサイコロの目が $y$ である確率」は、1つ目のサイコロについてあり得る値すべての確率の和を取れば良いので、\n",
"\n",
"$$\n",
"p(Y = y) = \\sum_x p(X = x, Y = y)\n",
"$$\n",
"\n",
"となります。このように、同時確率が与えられたとき、**着目していない方の確率変数がとり得る全ての値について同時確率を計算しその和をとる**ことを**周辺化(marginalization)**と呼び、結果として得られる確率を**周辺確率(marginal probability)**と呼びます。また、周辺確率をその着目している確率変数がとり得る全ての値について並べて一覧にしたものが**周辺確率分布(marginal probability distribution)**です。さらに、上の例のように2つの確率変数の同時確率を考えるとき、とり得る全ての組み合わせの確率を一覧にしたものが、**同時分布(joint distribution)**です。\n",
"\n",
"ここで、2つのサイコロの同時分布の表は大きくなってしまうので、より簡単な例として、表が出る確率と裏が出る確率が異なる2つのコインを考えてみましょう。この2つのコインを同時に投げたときの表裏の組み合わせについての同時分布が、以下のようになったとします。\n",
"\n",
"\n",
"| $\\ $ | Y = 表 | Y = 裏 |\n",
"|:------:|:------:|:------:|\n",
"| X = 表 | 1 / 5 | 2 / 5 |\n",
"| X = 裏 | 1 / 5 | 1 / 5 |\n",
"\n",
"ここで、1つ目のコインの表裏を表す確率変数を $X$ 、2つ目のコインの表裏を表す確率変数を $Y$ としています。表の中身がどういう意味を持っているか確認してください。2つのコインが両方表になる確率は $p(X = 表, Y = 表) = 1 / 5$ となっています。他のマスに書かれている同時確率の値の意味も確認してください。\n",
"\n",
"では、この表の中の数字を、行ごとに合計してみましょう。1行目は、\n",
"\n",
"$$\n",
"p(X = 表, Y = 表) + p(X = 表, Y = 裏) = 1 / 5 + 2 / 5 = 3 / 5\n",
"$$\n",
"\n",
"です。これは、 $\\sum_y p(X = 表, Y = y)$ [<sup>*3</sup>](#fn3)を計算していることになるので、周辺化によって $p(X = 表)$ という周辺確率を求めていることに相当します。\n",
"\n",
"<span id=\"fn3\"><sup>*3</sup>: <small> $y$ は2つ目のコインが取りうる状態で、この場合、「表」と「裏」という値のいずれか。</small></span>\n",
"\n",
"同様に、1列目の値を合計してみると、今度は $\\sum_x p(X = x, Y = 表)$ [<sup>*4</sup>](#fn4) を計算することに相当し、これは周辺化によって $P(Y = 表)$ という周辺確率を計算していることになります。\n",
"\n",
"<span id=\"fn4\"><sup>*4</sup>: <small> $x$ は1つ目のコインが取りうる状態で、この場合、「表」と「裏」という値のいずれか。</small></span>\n",
"\n",
"このようにして計算される周辺確率を、上の同時分布の表の周辺に書き入れてみます。\n",
"\n",
"| $\\ $ | Y = 表 | Y = 裏 | p(X) |\n",
"|:------:|:------:|:------:|:-----:|\n",
"| X = 表 | 1 / 5 | 2 / 5 | 3 / 5 |\n",
"| X = 裏 | 1 / 5 | 1 / 5 | 2 / 5 |\n",
"| p(Y) | 2 / 5 | 3 / 5 | |\n",
"\n",
"このように周辺確率はしばしば同時分布表の周辺に記述されます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 条件付き確率\n",
"\n",
"前節では、複数の確率変数を同時に考える方法として同時確率および同時分布という概念と、同時確率と一つ一つの確率変数のみに着目した際の確率(周辺確率)のあいだの関係を、周辺化という計算で說明しました。本節では、「とある条件下での着目事象の確率」を考える**条件付き確率(conditional probability)**という概念を説明します。これまでの節で扱っていた確率では、まず対象とする現象について、考えうる全ての事象を考え、そのうち対象とする事象が起きる確率はいくらか、を考えていました。一方、条件付き確率は、それらの考えうる事象のうち、特定の条件を満たした事象のみをまず抜き出し、その中で、さらに着目する特定の事象が起きる確率を考えるためのものです。\n",
"\n",
"例えば、あるお店にやってきた人(以下、客)が傘を持っているときに $1$ 、持っていなかったときに $0$ をとる確率変数 $X$ を考えます。また、ある客がやってきたときに外で雨が降っていたときに $1$ 、降っていなかったときに $0$ をとる確率変数 $Y$ を考えます。客が傘を持っていたかと、その瞬間に雨が降っていたかどうか、という2つの情報が組となったデータが16個あるとします。16人の客を観測してデータを集めた、ということです。それは以下の様なものでした。\n",
"\n",
"| 傘 ( $X$ ) | 雨 ( $Y$ ) |\n",
"|:--------:|:-------:|\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 0 | 1 |\n",
"| 0 | 1 |\n",
"| 0 | 1 |\n",
"| 1 | 0 |\n",
"| 0 | 0 |\n",
"| 0 | 0 |\n",
"| 0 | 0 |\n",
"| 0 | 0 |\n",
"| 0 | 0 |\n",
"| 0 | 0 |\n",
"\n",
"これらのデータから、確率変数 $X, Y$ の同時分布表を作成すると、以下のようになります。この表の作り方は、例えば表の左上のマスは $X = 0$ かつ $Y = 0$ となっているデータが16個中何個あるかを数えて、その割合を記入すればよく、他のマスについても同様となります。\n",
"\n",
"| $\\ $ | Y = 0 | Y = 1 |\n",
"|:-----:|:------:|:------:|\n",
"| X = 0 | 6 / 16 | 3 / 16 |\n",
"| X = 1 | 1 / 16 | 6 / 16 |\n",
"\n",
"では、「客が傘を持っていた( $X = 1$ )」という**条件の下で**、「そのとき雨が降っていなかった( $Y = 0$ )」という確率は、どのようになるでしょうか?\n",
"\n",
"まず、「客が傘を持っていた( $X = 1$ )」という状況下のデータだけを、上の同時分布表から抜き出してきましょう。\n",
"\n",
"| 傘 ($X$) | 雨 ($Y$) |\n",
"|:--------:|:-------:|\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 1 |\n",
"| 1 | 0 |\n",
"\n",
"全部で7個のデータがあり、この中で「雨が降っていなかった( $Y = 0$ )」となっているデータは1個です。すなわち、「客が傘を持っていたという**条件の下で**、そのとき雨が降っていなかった確率」は $1 / 7$ となります。これを、以下のように書きます。\n",
"\n",
"$$\n",
"p(Y = 0 | X = 1) = \\frac{1}{7}\n",
"$$\n",
"\n",
"これが**条件付き確率**と呼ばれるもので、条件となる事象を縦棒 $|$ の後に書き、その条件下で注目している事象を縦棒 $|$ の前に書きます。同様に、「客が傘を持っていたという**条件の下で**、そのとき雨が降っていた確率」は、上の表から $6 / 7$ なので、以下が成り立ちます。\n",
"\n",
"$$\n",
"p(Y = 1 | X = 1) = \\frac{6}{7}\n",
"$$\n",
"\n",
"これらの2つの確率が、それぞれ $p(Y = 0, X = 1) = 1 / 16$ , $p(Y = 1, X = 1) = 6 / 16$ という同時確率とは異なっていることを、上の同時分布表と見比べて確認してみましょう。「客が傘を持っていて**かつ**外で雨が降っている」という同時確率は $6 / 16$ となっていますが、「客が傘を持っているという**条件の下で**外で雨が降っている」という条件付き確率は $6 / 7$ でした。前者は「客が傘を持っておらず外で雨が降っていた」「客が傘を持っておらず外で雨が降っていなかった」「客が傘を持っていたが外で雨が降っていなかった」を含むあり得る全ての事象を考えた上で、その中で対象としている事象「客が傘を持っていて外で雨が降っている」が起こる確率を意味しています。一方で、後者の条件付き確率は、今条件となっている事象「客が傘を持っている」が成り立っている事象だけをまず対象とし、その中で着目している事象「外で雨が降っている」が起こる確率を考えます。それぞれの確率の値を計算する際の分母が異なっていることに注目してください。\n",
"\n",
"また、上記の2つの条件付き確率を足すと、 $1$ になります。「ある条件下で」という制約された世界で、対象とする確率変数がとり得る値全ての確率を並べて一覧したものは**条件付き分布(conditional distribution)**と呼ばれ、それらの確率を全て足すと必ず $1$ になります。上の例では、以下の計算で確かめられます。\n",
"\n",
"$$\n",
"p(Y = 0 | X = 1) + p(Y = 1 | X = 1) = \\frac{1}{7} + \\frac{6}{7} = 1\n",
"$$\n",
"\n",
"ここで、確率変数 $X$ が取りうる実際の値のうちいずれかを表す文字として $x$ を、確率変数 $Y$ が取りうる実際の値のうちいずれかを表す文字として $y$ を用いると、一般的に、条件付き確率は以下のように定義されます。\n",
"\n",
"$$\n",
"p(Y = y | X = x)\n",
"= \\frac{p(X = x, Y = y)}{p(X = x)}\n",
"$$\n",
"\n",
"このとき、条件付き分布が満たす条件は以下のように表せます。\n",
"\n",
"$$\n",
"\\sum_y p(Y = y | X = x) = 1\n",
"$$\n",
"\n",
"ここで、 $\\sum_x P(Y = y | X = x)$ は必ずしも1にならないということに注意してください。\n",
"\n",
"では、上の条件付き確率の定義を用いて、同時確率と周辺確率から条件付き確率を計算してみましょう。\n",
"\n",
"$$\n",
"\\begin{align}\n",
"p(Y = 0 | X = 1)\n",
"&= \\frac{p(X = 1, Y = 0)}{p(X = 1)} \\\\\n",
"&= \\frac{\\frac{1}{16}}{\\frac{7}{16}} \\\\\n",
"&= \\frac{1}{7}\n",
"\\end{align}\n",
"$$\n",
"\n",
"確かに、上で別の方法で求めた条件付き確率と一致しました。\n",
"\n",
"さて、上で触れた、同時確率と条件付き確率の関係について再度考えてみましょう。前述の「条件付き確率の定義」の式を変形すると、以下のようになります。以降では、簡単のために、確率変数の記述を省き、 $p(X = x)$ を $p(x)$ と記述します。確率変数 $X$ によって $x$ という値に対応付けられている事象が生じる確率、という意味です。\n",
"\n",
"$$\n",
"p(x, y) = p(y | x) p(x)\n",
"$$\n",
"\n",
"同時確率は、条件付き確率に、その条件となっている事象が生じる確率(周辺確率)を掛け合わせることで得られることが分かります。\n",
"\n",
"今回の例では、「雨が降っているかどうか」によって「客が傘を持っていたかどうか」は影響を受けるため、2つの確率変数 $Y, X$ は**従属**、と言います。一方、例えば「客が来たとき雨が降っていたかどうか」と「私が今お腹が空いているかどうか」が全く関係していないとします。後者について、お腹が空いているという事象を $1$ に、お腹が空いていないという事象を $0$ に対応付ける確率変数 $Z$ を導入すると、$Y$ と $Z$ が今**独立**であるという状況です。このとき、$Z$ の実現値を $z$ として、条件付き確率 $p(y | z)$ は、$Y$ がどうなるかが $Z$ がどうなるかに全く関係がないことから、 $p(y)$ と等しくなります。条件付けたとしても、条件付けなかったとしても、結果が変わらないためです。これを用いると、 $y$ と $z$ の同時確率は以下のように変形できます。\n",
"\n",
"$$\n",
"\\begin{align}\n",
"p(y, z) &= p(y | z) p(z) \\\\\n",
"p(y, z) &= p(y) p(z)\n",
"\\end{align}\n",
"$$\n",
"\n",
" $Y$ と $Z$ が独立であることから、 $p(y | z) = p(y)$ となることを用いました。この式から、**2つの確率変数が独立であるとき、同時確率はそれぞれの周辺確率の積で書ける**ということが言えます。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ベイズの定理\n",
"\n",
"前節で説明した条件付き確率は、ある前提が成り立っている状況下で着目する事象が生じる確率を記述するためのものでした。これは、**「ある\"原因\"が生じたという条件の下で、ある\"結果\"が生じる確率」**を考えていると捉えることができます。では、逆に「ある\"結果\"が観測されたというとき、ある事象が\"原因\"である確率」を考えるにはどうしたら良いでしょうか。今、原因となり得る事象が確率変数 $X$ で表され、結果となり得る事象が確率変数 $Y$ で表されるとします。このとき、原因として実際に $x$ が観測されたもとで結果が $y$ となる確率が条件付き確率\n",
"\n",
"$$\n",
"p(Y = y | X = x)\n",
"$$\n",
"\n",
"で表されました。前節の定義から、これに原因 $x$ がそもそも発生する確率 $p(X = x)$ を掛け合わせると、同時確率 $p(Y = y, X = x)$ になります。すなわち、\n",
"\n",
"$$\n",
"p(Y = y | X = x) p(X = x) = p(Y = y, X = x) \\hspace{2em} \\cdots (1)\n",
"$$\n",
"\n",
"です。では、結果が $y$ であったという観測の下で、原因が $x$ である確率はどのように表されるでしょうか。これは上の「条件の事象」と「着目する事象」を入れ替えた条件付き確率として、\n",
"\n",
"$$\n",
"p(X = x | Y = y)\n",
"$$\n",
"\n",
"と書くことができます。 $y$ という結果が観測されたもとで、原因が $x$ であった確率という意味です。これに結果 $y$ がそもそも発生する確率 $p(Y = y)$ をかけ合わせると、条件付き確率の定義から\n",
"\n",
"$$\n",
"p(X = x| Y = y) p(Y = y) = p(X = x, Y = y) \\hspace{2em} \\cdots (2)\n",
"$$\n",
"\n",
"が導かれます。ここで、式(1)と式(2)の右辺が同じになっていることに着目します。すると、式(1)と式(2)の左辺同士を等号で結ぶことができ、\n",
"\n",
"$$\n",
"p(Y = y | X = x) p(X = x) = p(X = x | Y = y) p(Y = y)\n",
"$$\n",
"\n",
"が成り立つことが分かります。この式を変形して、求めたい「結果 $y$ が生じたという**条件の下で**原因が $x$ である確率」を左辺に残すと、\n",
"\n",
"$$\n",
"p(X = x | Y = y) = \\frac{p(Y = y | X = x) p(X = x)}{p(Y = y)}\n",
"$$\n",
"\n",
"が導かれます。これを**ベイズの定理(Bayes' theorem)**と言います。これによって、ある結果が観測されたときに、ある事象が原因である確率を、\n",
"\n",
"1. 原因として考えている事象が(結果と関係なく)そもそも生じる確率( $p(X = x)$ )\n",
"2. 結果として観測した事象が(原因に関係なく)そもそも生じる確率( $p(Y = y)$ )\n",
"3. 考えている原因が実際に生じたという下で観測された結果が生じる確率( $p(Y = y | X = x)$ )\n",
"\n",
"の3つから、求めることができます。ベイズの定理に登場する左辺の条件付き確率と右辺の分子にある周辺確率には、特別な呼び方があります。まず右辺の分子にある周辺確率(上式では $p(X = x)$ )は、「結果」が観測する前(事前)に、原因 $x$ がそもそも生じる確率を表すので、**事前確率(prior probability)**と呼ばれます。一方、左辺の条件付き確率(上式では $p(X = x | Y = y)$ )は、ある「結果 $y$」が観測されたという条件の下で(事後に)、原因 $x$ が生じていたという確率を表すので、**事後確率(posterior probability)**と呼ばれます。\n",
"\n",
"ベイズの定理の応用事例として、スパムメールフィルターがあります。まず、 $N$ 個の着目する単語 $w_i (i=1, \\dots, N)$ を決めます(\"sale\", \"buy\", \"free\", ...など)。そして、メールにある単語 $w_i$ が含まれるとき $i$ という整数をとる確率変数を $W$ とし、「メールにある単語 $w_i$ が含まれる確率」を $p(W = i)$ とします。 $i$ は各単語に割り当てられるIDのようなものと考えてください。次に、メールがスパムメールであるとき $1$ となり、スパムメールでないとき $0$ となる確率変数を $Y$ とし、「スパムメールの存在確率」を $p(Y = 1)$ とします。このとき、「あるメールがスパムメールであったという**状況の下で**単語 $w_i$ が含まれていた」という確率は $p(W = i | Y = 1)$ となります。ここで、世の中にある大量のメールを集めて、各単語がどのくらいの確率で現れるかを調べると、 $p(W = i) \\ (i=1,\\dots,N)$ が求まります。また、集めたメールからスパムメールだけを抜き出します。すると、メールがスパムメールである確率 $p(Y = 1)$ が求まります。また、それらのスパムメール中に含まれる単語を調べ、どの単語がどういう確率で出現しているかを、着目している全単語について求めると、 $p(W = i | Y = 1) \\ (i=1, \\dots, N)$ が全て求まります。これらを用いると、「ある単語 $w_i$ が含まれているとき、そのメールがスパムメールである確率」を以下のように計算できます。\n",
"\n",
"$$\n",
"p(Y = 1 | W = i) = \\frac{p(W = i | Y = 1) p(Y = 1)}{p(W = i)}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 尤度と最尤推定\n",
"\n",
"これまでの節では、「**確率変数が取りうる様々な値に確率を対応させる**」確率分布は、表の形で表されていました。ここで、確率変数 $X$ が $x$ という値をとる確率 $p(X = x)$ を、表の代わりに、あるパラメータ $\\theta$ で特徴づけられた関数 $f(x; \\theta)$ によって表してみます。この関数は、「**確率変数** $X$ **が取りうる様々な値** $x$ **に確率を対応させる**」ので、 $X$ の確率分布を表しています。このような関数は**確率モデル(probabilistic model)**とも呼ばれ、特にパラメータによって形状が決定される関数を用いる場合は**パラメトリックモデル(parametric model)**と呼ばれます。\n",
"\n",
"確率モデルがどのくらい実際の観測データに即しているかを**尤度(ゆうど)(likelihood)**と言い、観測されたデータをモデルに入力し、その出力をかけ合わせたもので定義されます。\n",
"\n",
"例えば、 $N$ 個のデータ $x_i \\ (i=1,\\dots,N)$ が独立に観測されたとき、この観測データの下での確率モデル $f(x; \\theta)$ の**尤度**は\n",
"\n",
"$$\n",
"L(\\theta) = \\prod_{i=1}^N f(x_i; \\theta)\n",
"$$\n",
"\n",
"と計算されます。与えられたデータから、「どのようなデータがどのくらいよく観測されるか」を表す確率分布を推定[<sup>*5</sup>](#fn5)するために、予め用意した確率モデルのパラメータを、それらの観測データの下での**尤度が最大**になるように決定する方法を、**最尤(さいゆう)推定(maximum likelihood estimation)**と言います。\n",
"\n",
"<span id=\"fn5\"><sup>\\*5</sup>: <small>以降、このことを「データの分布を推定する」と言うことがあります。また、観測されたデータのみから各データの発生確率(頻度とも捉えられる)を求めたものは**経験分布(empirical distribution)**とも呼ばれ、本節で説明しているのは正確にはこの経験分布を確率モデルで近似する方法です。</small></span>\n",
"\n",
"上式の $\\prod$ という記号は、 $\\sum$ の掛け算版で、全ての値を掛け合わせるという意味です。複数データに対する尤度は、 $1$ より小さな値の積となるため、結果は非常に小さな数になり、コンピュータでこの計算を行う際にはアンダーフローという問題が発生しやすくなります。また尤度を最大化したい場合、積の形の式の最大化は難しいことが知られています。そこで尤度の対数をとった**対数尤度(log likelihood)**を考えます。 $y = log(x)$ は単調増加であるため、対数をとる前後で大小関係は変わりません。そのため対数尤度を最大にするときの $\\theta$ は、元の尤度も最大にします。\n",
"\n",
"$$\n",
"\\log L(\\theta) = \\sum_{i=1}^N \\log f(x_i; \\theta)\n",
"$$\n",
"\n",
"よって、この対数尤度を最大化するパラメータ $\\theta$ を求めることができれば、その値が観測データ $x_i (i=1,\\dots,N)$ の分布を最もよく表現する確率モデルのパラメータとなります。\n",
"\n",
"ここで、具体例として、コインの表・裏が出る確率を推定する問題を考えてみます。コインを投げて「表が出る」事象を $1$ に、「裏が出る」事象を $0$ に対応付ける確率変数を $X$ とします。このとき、 $p(X)$ をシンプルな確率モデル\n",
"\n",
"$$\n",
"f(x; \\theta) = \\theta^x (1 - \\theta)^{1 - x}\n",
"$$\n",
"\n",
"で表現することにします[<sup>*6</sup>](#fn6)。これは $x = 1$ のとき、すなわちコインが表であるとき $\\theta$ をそのまま返し、 $x = 0$ のとき、すなわちコインが裏であるとき $1 - \\theta$ を返すような関数となっています。ただし、 $0 \\leq \\theta \\leq 1$ を満たすこととします。今、コインを $10$ 回投げ、以下の観測結果が得られたとします。\n",
"\n",
"<span id=\"fn6\"><sup>\\*6</sup>: <small>この関数には、ベルヌーイ分布いう名前がついています。</small></span>\n",
"\n",
"| $\\ $ | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 | 6回目 | 7回目 | 8回目 | 9回目 | 10回目 |\n",
"|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|\n",
"| X | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |\n",
"\n",
"これらの観測データの下での確率モデルの尤度は\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"L(\\theta) &=\n",
"\\theta \\cdot\n",
"(1 - \\theta) \\cdot\n",
"\\theta \\cdot\n",
"\\theta \\cdot\n",
"\\theta \\cdot\n",
"(1 - \\theta) \\cdot\n",
"(1 - \\theta) \\cdot\n",
"\\theta \\cdot\n",
"(1 - \\theta) \\cdot\n",
"(1 - \\theta) \\\\\n",
"&= \\theta^{5} \\cdot (1 - \\theta)^{5}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"です。対数尤度は、\n",
"\n",
"$$\n",
"\\log L(\\theta) = 5 \\log \\theta + 5 \\log \\left( 1 - \\theta \\right)\n",
"$$\n",
"\n",
"となります。これが最大となるときの $\\theta$ は、この式を $\\theta$ で微分した式を $0$ とおいて解析的に解けばよく、\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\frac{5}{\\theta} + \\frac{5}{\\left( 1 - \\theta \\right)} &= 0 \\\\\n",
"\\therefore \\theta = \\frac{1}{2}\n",
"\\end{align}\n",
"$$\n",
"\n",
"と決定します。これが最尤推定です。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 事後確率最大化推定(MAP推定)\n",
"\n",
"前節で解説した最尤推定は、多くの場合で有用ですが、求めるパラメータに何らかの**事前知識**がある場合、それを活かすことができません。そのため、少ないサンプル数からパラメータを推定するとき、実際にはほとんどあり得ない結果が求まる場合があります。具体例を見てみましょう。\n",
"\n",
"再び、コインの表・裏が出る確率を推定する例を考えます。コインを $5$ 回投げたところ、**たまたま** ${\\bf 5}$ **回とも表が出た**とします。この場合、前節と同じ確率モデルを用いて尤度を計算し、最尤推定でモデルのパラメータを決定すると、 $0 \\leq \\theta \\leq 1$ を満たしながら、今回の観測データの下での尤度 $\\theta^5$ を最大にする $\\theta$ は $1$ となります。これは「表が出る確率が $1$ 」すなわち**「裏面が出る確率は** $0$**」**という推定結果が得られてしまったことを意味します。このような場合「裏が出る確率も $0$ よりは大きいだろう」という事前知識を活用することができれば、より良い推定ができそうです。\n",
"\n",
"事前知識も考慮しながら、観測データに基づいて確率モデルのパラメータを推定する方法には、**最大事後確率(maximum a posteriori, MAP)推定**があります。MAP推定でも、対象のデータの確率分布を表す確率モデルのパラメータをデータを利用して決定しますが、データだけでなく**パラメータも確率変数だと考える**点が最尤推定とは異なっています。パラメータを確率変数 $\\Theta$ とすると、このパラメータがどのような値を取るかを表す分布 $p(\\Theta)$ が導入できます。これを**事前分布(prior distribution)**と呼び、ここに「求めたいパラメータに対する事前知識」を反映させることができます。ここで、 $\\Theta = \\theta$ となる確率 $p(\\Theta = \\theta)$(以降は $p(\\theta)$ と略記)をデータの確率モデル $f(x; \\theta)$ とは別の確率モデル $g(\\theta; \\beta)$ で表せば、 $\\beta$ を人為的に与えるか、なんらかの方法で決定しておくことで、「どのような $\\theta$ が起こりやすいか」という事前知識を表現することができます。\n",
"\n",
"MAP推定では、観測データ $x_i \\ (i=1,\\dots,N)$ が観測されたという**条件の下で**最も確率が大きくなる $\\theta$ を求めます。すなわち、 $p(\\theta | x_1, \\dots, x_N)$ を最大とする $\\theta$ を求めます。これは「 $x_i \\ (i=1,\\dots,N)$ が観測された」という**結果**のもとで「データの確率分布を表すモデルのパラメータが $\\theta$ であったことが**原因**である」確率を意味するので、**事後確率**です。ベイズの定理から、事後確率は\n",
"\n",
"$$\n",
"p(\\theta | x_1,\\dots,x_N) = \\frac{p(x_1,\\dots,x_N | \\theta) p(\\theta)}{p(x_1,\\dots,x_N)}\n",
"$$\n",
"\n",
"と書けました。右辺に着目してください。分子にある $p(x_1,\\dots,x_N | \\theta)$ を、確率モデル $f(x; \\theta)$ を用いて $\\prod_{i=1}^N f(x_i; \\theta)$ と表すと、これは観測データ $x_i \\ (i=1,\\dots,N)$ の下での確率モデル $f(x; \\theta)$ の**尤度**です。また、その右の $p(\\theta)$ は、パラメータが $\\theta$ という値になる**事前確率**でした。これが $g(\\theta; \\beta)$ という確率モデルで表されるとします。\n",
"\n",
"今、事後確率を最大にするパラメータ $\\theta$ を求めるために、右辺を最大化する $\\theta$ を考えます。このとき、パラメータと無関係に決まる $p(x_1,\\dots,x_N)$ を無視し\n",
"\n",
"$$\n",
"p(x_1,\\dots,x_N | \\theta) p(\\theta)\n",
"$$\n",
"\n",
"だけに注目してこれを最大化するようにパラメータ $\\theta$ を決定すると、その $\\theta$ は求めたい左辺の事後確率を最大にする $\\theta$ に一致します。上式は、尤度と事前分布の積になっています。このことから、**事後分布は尤度と事前分布の積に比例する**ということが分かります。\n",
"\n",
"MAP推定では、この尤度 $\\times$ 事前確率を最大化するような $\\theta$ を求めることで、「データを観測した」という事後においてもっとも可能性の高い $\\theta$ を決定します。本節では具体的に事後確率最大化の計算は行いませんが、最尤推定とは異なり、 $p(\\theta)$ が考慮された上でパラメータの決定が行われることに注意してください。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 統計量\n",
"\n",
"本節では、いくつかよく用いられる統計量を説明します。統計量とは、**観測されたデータの特徴を要約する数値**のことを指します。代表的な統計量として平均、分散、標準偏差を紹介します。\n",
"\n",
"#### 平均\n",
"\n",
"**平均(mean)**は、観測された数値を合計し、その数値の個数で割ったもののことを言います。たとえば、300円、400円、500円の平均は、\n",
"\n",
"$$\n",
"\\frac{300 + 400 + 500}{3} = 400\n",
"$$\n",
"\n",
"です。一般に、 $N$ 個のデータ $x_i \\ (i=1,\\dots,N)$ が観測されたとき、その平均は\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\overline{x}\n",
"= \\frac{x_1 + x_2 + \\dots + x_N}{N}\n",
"= \\frac{1}{N} \\sum^{N}_{n=1} x_{n}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"と定義されます。平均を表す記号として、 $\\bar{x}$ や $\\mu$ がよく用いられます。データの分布において、平均はその重心に相当する値です。\n",
"\n",
"#### 分散\n",
"\n",
"次に、**分散**を紹介します。分散はよく $\\sigma^2$ と表され、\n",
"\n",
"$$\n",
"\\sigma^2 = \\frac{1}{N} \\sum_{n=1}^N \\left( x_n - \\overline{x} \\right)^2\n",
"$$\n",
"\n",
"と定義されます。各データ点 $x_i \\ (i=1,\\dots,N)$ の値から、それらの平均 $\\bar{x}$ を引き二乗した値( $(x_i - \\bar{x})^2 \\ (i=1,\\dots,N)$ )の平均を計算しています。これは、「データが自らの平均より平均的にどのくらいばらついているか」を表します。平均が同じデータでも、全てのデータが平均付近にある場合は分散は小さく、平均よりも極めて大きなデータ点や小さなデータ点が多数ある場合、分散は大きくなります。分散にはもう一種類あります。以下のようなものです。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"s^2 = \\frac{1}{N - 1} \\sum_{n=1}^N \\left( x_n - \\overline{x} \\right)^2\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"始めに登場した $\\sigma^2$ の定義では $\\frac{1}{N}$ となっていた部分が $\\frac{1}{N - 1}$ に変わっています。前者は**標本分散(sample variance)**といい、後者は**不偏分散(unbiased variance)**といいます。これらの式の導出は他の文献に譲るとして、ここではその使い分けについて説明します。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/12.png)\n",
"\n",
"例えば、全国の小学生の身長と体重の分散を調べたいとします。このとき、全国の小学生を一人の抜け漏れもなく調べたなら、集まったデータは**母集団(population)**と呼ばれます。一方、各都道府県の小学生を100人ずつ調べた場合、そのデータは**標本集団(sample population)**と言います。すなわち、母集団とは解析を行いたいデータ全ての集合を指し、標本集団とは母集団から抽出された一部のデータの集合を指します。**不偏分散**は、抽出するデータの数を増やしていったとき、いずれ母集団の分散に一致します。一方、標本分散の場合は、どこまでデータ数を増やしていっても、母集団の分散には一致しません。\n",
"\n",
"分散を利用すると、データのばらつきを定量評価することができるようになります。例えば、同じ現象を複数回観測する実験を行った際、結果のばらつきが大きければ、その観測方法には問題がある可能性があります。もしくは、同じだと思っていた現象は、実は観測のたびに異なる現象であった可能性があります。このように、多数の試行の結果がある値に集まっていることが望ましいような状況において、ばらつきの度合いを定量し評価することは重要です。\n",
"\n",
"#### 標準偏差\n",
"\n",
"\n",
"最後に**標準偏差(standard deviation)**を紹介します。分散はデータの平均からの差の**二乗**の平均でした。そのため単位は元の単位を二乗したものになります。例えばデータの単位が ${\\rm kg}$ であれば、分散の単位は ${\\rm kg}^2$ になります。そこで、分散 $\\sigma^2$ の平方根 $\\sigma$ を計算することで、データと単位が等しくなり、解釈が容易になります。この $\\sigma$ を標準偏差と呼びます。\n",
"\n",
"練習問題で具体的な計算手順の確認を行いましょう。以下の①と②のデータに対して、平均、分散、標準偏差を求めてください。ただし、今回は標本分散を使用することとします。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/13.png)\n",
"\n",
"①の解答は以下の通りです。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\bar{x} &= \\frac{1}{5} \\left( -2 -1 + 0 + 1 + 2 \\right) = 0 \\\\\n",
"\\sigma^{2} &= \\frac{1}{5} \\left\\{ \\left( -2 -0 \\right)^{2} + \\left( -1 -0 \\right)^{2} + (0 - 0)^{2} + (1 - 0)^{2} + (2 - 0)^{2} \\right \\} \\\\\n",
"&= \\frac{1}{5} \\times 10 = 2 \\\\\n",
"\\sigma &= \\sqrt{2}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"②の解答は以下の通りです。\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\overline{x} &= \\frac{1}{5} ( -4 -2 + 0 + 2 + 4 ) = 0 \\\\\n",
"\\sigma^2 &= \\frac{1}{5}\n",
"\\left\\{ (-4 -0)^2 + (-2 -0)^2 + (0 - 0)^2 + (2 - 0)^2 + (4 - 0)^2 \\right\\} \\\\\n",
"&= \\frac{1}{5} \\times 40 = 8 \\\\\n",
"\\sigma &= \\sqrt{8} = 2 \\sqrt{2}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"これより、②のケースの方が分散が大きく、データのばらつきが大きいことがわかります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 正規分布と正規化\n",
"\n",
"次に、確率・統計だけでなく機械学習を勉強していく過程でも度々登場する**正規分布(normal distribution)**について紹介します。**ガウス分布(Gaussian distribution)**とも呼ばれます。連続値の確率変数 $X$ が平均 $\\mu$ 、分散 $\\sigma^2$ の正規分布に従うとき、 $X$ が $x$ という値をとる確率 $p(X = x)$ は\n",
"\n",
"$$\n",
"p(X = x) = \\frac{1}{\\sqrt{2 \\pi \\sigma^2}} \\exp \\left\\{ -\\frac{(x - \\mu)^2}{2 \\sigma^2} \\right\\}\n",
"$$\n",
"\n",
"で表され、横軸に $x$ 、縦軸に $p(X = x)$ の値を取ったプロットは以下のような形になります。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/14.png)\n",
"\n",
"特に、平均 $\\mu = 0$ 分散 $\\sigma^2 = 1$ のものを**標準正規分布(standard normal distribution)**と呼びます。\n",
"\n",
"正規分布が色々なところでよく用いられる理由として、以下のような特徴があります。\n",
"\n",
"- 独立な複数の確率変数の和で表される確率変数の分布は、和をとる個数を大きくしていくと近似的に正規分布に収束する(**中心極限定理**)\n",
"- 正規分布に従う独立な確率変数の和で表される確率変数は正規分布に従う(**再生性**)\n",
"\n",
"また、世の中でみられる多くのデータが、しばしば正規分布に従うことが知られています(例えば、性別・年代別の身長、試験の点数、物理実験の測定誤差など)。一方で正規分布に従わないデータも多く存在します。正規分布に従わないデータに対し正規分布を仮定して推定を行うと、誤った結論を導く場合もあります。\n",
"\n",
"正規分布の平均 $\\mu$ と標準偏差 $\\sigma$ を用いて、ある範囲に収まるデータが全体の何%になるかを考え、これを利用する場合がよくあります。例えば、およそ $99.7%$ のデータは $\\mu \\pm 3\\sigma$ の範囲内に存在するため、その範囲外のデータは外れ値(他の値から大きく外れた値)として定義するといった使い方ができます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 標準偏差を利用したスケーリング\n",
"\n",
"データの値の範囲を変換するスケーリングという操作は、多くの機械学習アルゴリズムでデータの前処理として用いられます。\n",
"\n",
"例えば、2次元のデータ点が2つあるとします。1次元目の値を $x_1$、2次元目の値を $x_2$ という変数で表します。2点はそれぞれ $(x_1, x_2) = (100, 0.1)$ と $(x_1, x_2) = (1000, 1)$ という値をもっています。このデータ点間の違いを測るために、ユークリッド距離 $d$ を計算してみましょう。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/15.png)\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"d &= \\sqrt{(100 - 1000)^2 + (0.1 - 1)^2} \\\\\n",
"&= \\sqrt{900^2 + 0.9^2} \\\\\n",
"&= \\sqrt{810000 + 0.81} \\\\\n",
"&= \\sqrt{810000.81}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"上の図を見ると、各軸のスケールが大きく異なっています。このとき、2点の $x_2$ の値の差は $x_1$ の値の差に比べ非常に小さいため、その差異は計算された $d$ にほとんど影響を与えません。これでは、 $x_2$ の値の違いが表す意味が、データ点同士の違いを考慮する場合に重要だったとしても、それはほとんど考慮されません。こうした問題を解決する方法の一つが、**スケーリング**です。代表的なスケーリングの方法は2つあります。\n",
"\n",
"1つ目が、全てのデータの各次元を**最小値0**、**最大値1**にスケーリングする方法です。これを**Min-Max スケーリング**とよびます。 $N$ 個の $K$ 次元データ ${\\bf x}^{(i)} \\ (i=1,\\dots,N)$ があるとします。 $n$ 番目のデータ ${\\bf x}^{(n)}$ は、 ${\\bf x}^{(n)} = [x_1^{(n)}, x_2^{(n)}, \\dots, x_K^{(n)}]^{\\rm T}$ という $K$ 個の値を持ちます。このとき、まず各次元の最大値 $x_k^{\\rm max}$ と最小値 $x_k^{\\rm min}$ を計算します。それぞれ\n",
"\n",
"$$\n",
"\\begin{align}\n",
"x_k^{\\rm max} &= \\max_n x_k^{(n)} \\\\\n",
"x_k^{\\rm min} &= \\min_n x_k^{(n)}\n",
"\\end{align}\n",
"$$\n",
"\n",
"によって計算できます。これは $N$ 個のデータ全ての $k$ 次元目だけに着目し、その中で最大/最小の値を見つける操作です。\n",
"\n",
"次に、この各次元の最小値と最大値を使って、全てのデータの全次元をスケーリングします。具体的には、以下のような計算です。\n",
"\n",
"$$\n",
"x_k^{(n)} \\leftarrow \\frac{x_k^{(n)} - x_k^{\\min}}{x_k^{\\max} - x_k^{\\min}}\n",
"$$\n",
"\n",
"「 $\\leftarrow$ 」は、右辺の計算結果で左辺を置き換えるという意味です。この計算によって、全てのデータの全次元において最小値が $0$ かつ最大値が $1$ となります。\n",
" \n",
"Min-Maxスケーリングは計算がシンプルである反面、下図の例ように他のデータから大きく離れた外れ値が存在するような場合、各次元の最大値もしくは最小値が外れ値の値になってしまうため、スケーリングの計算自体が外れ値に大きな影響を受けてしまうという弱点があります。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/16.png)\n",
"\n",
"一方、もう1つのスケーリング方法として、**平均0**、**標準偏差1** になるようにスケーリングする方法があります。この操作を**標準化(standardization)** と呼びます。全てのデータから平均を引けば、その後の平均は $0$ になり、標準偏差で割れば、その後の標準偏差は $1$ になります。\n",
"\n",
"$$\n",
"x_k^{(n)} \\leftarrow \\frac{x_k^{(n)} - \\bar{x_k}}{\\sigma_k}\n",
"$$\n",
"\n",
"ただし、 $\\sigma_k$ は $k$ 次元目の値の標準偏差です。\n",
"\n",
"分散を計算した例題の①に対して、標準化を施すと\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"x_{1} &= \\frac{-2-0}{\\sqrt {2}} = -\\frac{2}{\\sqrt {2}} \\\\\n",
"x_{2} &= \\frac{-1-0}{\\sqrt {2}} = -\\frac{1}{\\sqrt {2}} \\\\\n",
"x_{3} &= \\frac{0-0}{\\sqrt {2}} = 0 \\\\\n",
"x_{4} &= \\frac{1-0}{\\sqrt {2}} = \\frac{1}{\\sqrt {2}} \\\\\n",
"x_{5} &= \\frac{2-0}{\\sqrt {2}} = \\frac{2}{\\sqrt {2}}\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"となります。標準化後の平均と標準偏差は\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\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\\\\\n",
"\\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}\n",
" +\\left( \\dfrac {1}{\\sqrt {2}}-0\\right) ^{2}+\\left( \\dfrac {2}{\\sqrt {2}}-0\\right) ^{2}\\right\\} =1\\\\\n",
"\\sigma &=\\sqrt {\\sigma ^{2}}=1\n",
"\\end{aligned}\n",
"$$\n",
"\n",
"となり、平均 $0$ 、標準偏差 $1$ が確かめられました。この方法はMin-Maxスケーリングより比較的少数の外れ値に対しては強いスケーリングが行えます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "g8ar8PRU6Id4"
},
"source": [
"### 外れ値除去\n",
"\n",
"以下のような時間によって変動するデータを扱うとします。例えば、横軸が時刻、縦軸が温度だとします。平均温度は一定であり、温度はランダムに変動しているものと仮定します。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/17.png)\n",
"\n",
"このデータから、温度計の異常や不具合による計測値の異常(**外れ値(outlier)**)を検出する方法を考えましょう。一つの方法として、値の**頻度**に着目する方法があります。\n",
"\n",
"![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/2/18.png)\n",
"\n",
"上図の左側に描かれた棒グラフに着目してください。これは、各時刻において計測された温度を離散化された温度値ごとに累積していくことで、どの温度値がよく現れるかを表すヒストグラムと呼ばれるものです。平均の温度が中央の赤い実践で示されています。ヒストグラムは平均の温度に最も高いピークを持つ釣鐘型の形状になっており、正規分布に近い形に見えます。そこで、データはおおよそ正規分布に従うものと仮定してみましょう。データが本当に正規分布に従うと言ってよいかどうかを統計的に確認したい場合は、正規性検定などを行う必要がありますが、ここでは省略します。それでは、データが従う正規分布の平均 $\\mu$ と標準偏差 $\\sigma$ を用いて算出できる値の範囲 $[\\mu - 3\\sigma, \\mu + 3\\sigma]$ は、図の2本の点線の内側です。データが本当に正規分布に従うならば、おおよそ $97.7%$ のデータはこの内側に含まれるはずなので、この外側にあるデータ点は全て「外れ値」であると定義しても良さそうです。これを**3σ法**と呼びます。ただし、外れ値が現れる回数が多かったり、外れ値が極端な値を持つ場合には、標本平均や標本分散の計算がそのような外れ値に大きな影響を受けてしまい、3σ法ではうまく対処できないことがあることに注意してください。\n",
"\n",
"そのような場合には、データを大きい順に並べて上位5%、下位5%を取り除くといった処理をすることもあります。"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "基礎的な数学(微分、線形代数、統計).ipynb",
"provenance": [],
"version": "0.3.2"
},
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment