.. _sec_prob: 確率と統計 ========== いずれにせよ、 機械学習は不確実性そのものである。 教師あり学習では、既知の情報(\ *特徴量*\ )から未知の情報(\ *ターゲット*\ )を予測することを目指す。 目的に応じて、最も可能性の高いターゲットの値を予測したり、 ターゲットとの期待距離が最小になるような値を予測したりすることがある。 また、単に値を予測するだけでなく、\ *不確実性を定量化*\ したい場合もある。 たとえば、患者のデータから、その人が将来心臓発作を起こす\ *可能性がどの程度あるか*\ を知りたいといったケースである。 教師なし学習では、しばしば不確実性が重要である。 測定値の集合が異常かどうかを判断するには、 関心のある母集団においてどのような値が観測される可能性が高いかを知ることが役立ちる。 さらに、強化学習では、 さまざまな環境で賢く行動するエージェントを開発したいと考える。 そのためには、環境がどのように変化すると予想されるか、 また利用可能な各行動に対してどのような報酬が得られると期待されるかを 推論する必要がある。 *確率*\ は、不確実性の下での推論を扱う数学分野である。 ある過程の確率モデルが与えられれば、 さまざまな事象の起こりやすさについて推論できる。 コイン投げのような繰り返し可能な事象の頻度を 確率で表すことは、かなり異論の少ない考え方である。 実際、\ *頻度主義*\ の研究者は、 *繰り返し可能な事象にのみ*\ 適用される確率の解釈を支持する。 これに対して、\ *ベイズ主義*\ の研究者は、 不確実性の下での推論を形式化するために、 より広い意味で確率の言語を用いる。 ベイズ確率には2つの特徴がある。 (i) ダムが崩壊する\ *確率*\ はどれくらいか、といった 繰り返し不可能な事象に対しても信念の度合いを割り当てること、 (ii) 主観性である。ベイズ確率は、 新しい証拠に照らして信念をどのように更新すべきかについて 明確な規則を与えるが、 異なる個人が異なる\ *事前*\ 信念から出発することを許する。 *統計学*\ は、データの収集と整理から始まり、そのデータを生成した背景にあるプロセスについて、どのような推論が可能かを逆向きに考えるための学問である。 データセットを分析して、 より広い母集団を特徴づけるかもしれないパターンを探すとき、 私たちは統計的思考を用いている。 確率と統計の研究に捧げられた講義、専攻、学位論文、職業、学科、企業、機関は数多くある。 この節ではその表面をなぞるにすぎないが、 モデル構築を始めるために必要な基礎を提供する。 .. raw:: html
pytorchmxnetjaxtensorflow
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline from d2l import torch as d2l import random import torch from torch.distributions.multinomial import Multinomial .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline from d2l import mxnet as d2l from mxnet import np, npx from mxnet.numpy.random import multinomial import random npx.set_np() .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline from d2l import jax as d2l import random import jax from jax import numpy as jnp import numpy as np .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python %matplotlib inline from d2l import tensorflow as d2l import random import tensorflow as tf from tensorflow_probability import distributions as tfd .. raw:: html
.. raw:: html
簡単な例:コイン投げ -------------------- コインを投げると計画し、 表(対して裏)がどれくらい起こりやすいかを定量化したいとする。 コインが\ *公平*\ なら、 両方の結果(表と裏)は同じ確率で起こりる。 さらに、コインを :math:`n` 回投げる予定なら、 *期待される*\ 表の割合は、 *期待される*\ 裏の割合とちょうど一致するはずである。 これを直感的に見る一つの方法は対称性である。 :math:`n_\textrm{h}` 回の表と :math:`n_\textrm{t} = (n - n_\textrm{h})` 回の裏からなる あらゆる可能な結果に対して、 :math:`n_\textrm{t}` 回の表と :math:`n_\textrm{h}` 回の裏からなる 同じ確率の結果が存在する。 これは、平均すると投げた回数の :math:`1/2` が表、 :math:`1/2` が裏になると期待できる場合にのみ可能である。 もちろん、この実験を :math:`n=1000000` 回の投げで何度も行っても、 :math:`n_\textrm{h} = n_\textrm{t}` がぴったり成り立つ試行を 一度も見ないかもしれない。 形式的には、量 :math:`1/2` は\ *確率*\ と呼ばれ、 ここでは任意の1回の投げで表が出る確実性を表している。 確率は、関心のある結果、すなわち\ *事象*\ に対して :math:`0` から :math:`1` の間の値を割り当てる。 ここで関心のある事象は :math:`\textrm{heads}` であり、 対応する確率を :math:`P(\textrm{heads})` と表す。 確率が :math:`1` なら絶対確実を意味し (両面が表のイカサマコインを想像してほしい)、 確率が :math:`0` なら不可能を意味する (たとえば両面が裏なら)。 頻度 :math:`n_\textrm{h}/n` と :math:`n_\textrm{t}/n` は確率ではなく、 むしろ\ *統計量*\ である。 確率は、データ生成プロセスの背後にある\ *理論的*\ な量である。 ここでは、確率 0.5 はコインそのものが持つ物理的な性質と言える。 これに対し統計量は、観測されたデータの関数として計算される\ *経験的*\ な量である。 確率的・統計的な量への関心は 切り離せないほど密接に結びついている。 私たちはしばしば、データセットを与えると 確率のようなモデルパラメータの\ *推定値*\ を生成する *推定量*\ と呼ばれる特別な統計量を設計する。 さらに、その推定量が\ *一致性*\ と呼ばれる よい性質を満たすなら、 推定値は対応する確率に収束する。 そして、そのように推定された確率は、 将来出会うかもしれない同じ母集団からのデータの 統計的性質がどのようなものかを教えてくれる。 真の :math:`P(\textrm{heads})` を知らない 実際のコインを見つけたとしよう。 この量を統計的手法で調べるには、 (i) いくつかのデータを収集し、 (ii) 推定量を設計する必要がある。 ここでのデータ取得は簡単である。 コインを何度も投げて、すべての結果を記録すればよいのである。 形式的には、ある基礎となるランダム過程から 実現値を引き出すことを\ *サンプリング*\ と呼ぶ。 ご想像のとおり、 自然な推定量の一つは、 観測された\ *表*\ の数を 投げた総回数で割った比率である。 さて、そのコインが実際には公平、 すなわち :math:`P(\textrm{heads}) = 0.5` だったとする。 公平なコインの投げをシミュレートするには、 任意の乱数生成器を呼び出せる。 確率 :math:`0.5` の事象をサンプルする簡単な方法はいくつかある。 たとえば Python の ``random.random`` は 区間 :math:`[0,1]` の数を返し、 任意の部分区間 :math:`[a, b] \subset [0,1]` に入る確率は :math:`b-a` に等しくなる。 したがって、返された浮動小数点数が ``0.5`` より大きいかどうかを判定することで、 ``0`` と ``1`` をそれぞれ確率 ``0.5`` で得られる。 .. raw:: latex \diilbookstyleinputcell .. code:: python num_tosses = 100 heads = sum([random.random() > 0.5 for _ in range(num_tosses)]) tails = num_tosses - heads print("heads, tails: ", [heads, tails]) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output heads, tails: [43, 57] より一般には、可能な結果の数が有限な任意の変数 (コイン投げやサイコロ投げのようなもの)からの複数回の抽出は、 multinomial 関数を呼び出し、 第1引数に抽出回数、 第2引数に各可能な結果に対応する確率のリストを与えることでシミュレートできる。 公平なコインを10回投げるには、 確率ベクトル ``[0.5, 0.5]`` を割り当て、 インデックス 0 を表、 インデックス 1 を裏として解釈する。 この関数は、可能な結果の数(ここでは2)と同じ長さのベクトルを返し、 最初の成分が表の出現回数、 2番目の成分が裏の出現回数を表す。 .. raw:: html
pytorchmxnetjaxtensorflow
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python fair_probs = torch.tensor([0.5, 0.5]) Multinomial(100, fair_probs).sample() .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output tensor([58., 42.]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python fair_probs = [0.5, 0.5] multinomial(100, fair_probs) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output [07:21:03] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([46, 54], dtype=int64) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python fair_probs = [0.5, 0.5] # jax.random does not have multinomial distribution implemented np.random.multinomial(100, fair_probs) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([54, 46]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python fair_probs = tf.ones(2) / 2 tfd.Multinomial(100, fair_probs).sample() .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output WARNING:tensorflow:From /home/ci/.local/lib/python3.10/site-packages/tensorflow_probability/python/internal/batched_rejection_sampler.py:102: calling while_loop_v2 (from tensorflow.python.ops.control_flow_ops) with back_prop=False is deprecated and will be removed in a future version. Instructions for updating: back_prop=False is deprecated. Consider using tf.stop_gradient instead. Instead of: results = tf.while_loop(c, b, vars, back_prop=False) Use: results = tf.nest.map_structure(tf.stop_gradient, tf.while_loop(c, b, vars)) .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output .. raw:: html
.. raw:: html
このサンプリング過程を実行するたびに、 前回の結果とは異なるかもしれない 新しい乱数値が得られる。 投げた回数で割ると、 データ中の各結果の\ *頻度*\ が得られる。 これらの頻度は、 それらが推定しようとしている確率と同様に、 合計すると :math:`1` になる。 .. raw:: html
pytorchmxnetjaxtensorflow
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python Multinomial(100, fair_probs).sample() / 100 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output tensor([0.5200, 0.4800]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python multinomial(100, fair_probs) / 100 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([0.53, 0.47]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python np.random.multinomial(100, fair_probs) / 100 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([0.48, 0.52]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python tfd.Multinomial(100, fair_probs).sample() / 100 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output .. raw:: html
.. raw:: html
ここでは、シミュレートしたコインは公平であるにもかかわらず (私たち自身が確率 ``[0.5, 0.5]`` を設定した)、 表と裏の回数は一致しないかもしれない。 それは、比較的少数のサンプルしか取っていないからである。 もしシミュレーションを自分で実装しておらず、 結果だけを見ていたとしたら、 コインが少し不公平なのか、 それとも :math:`1/2` からのずれが単にサンプルサイズの小ささによるものなのか、 どうやって判断すればよいだろうか? 10,000回投げをシミュレートするとどうなるか見てみよう。 .. raw:: html
pytorchmxnetjaxtensorflow
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = Multinomial(10000, fair_probs).sample() counts / 10000 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output tensor([0.4953, 0.5047]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = multinomial(10000, fair_probs).astype(np.float32) counts / 10000 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([0.4952, 0.5048]) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = np.random.multinomial(10000, fair_probs).astype(np.float32) counts / 10000 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output array([0.4904, 0.5096], dtype=float32) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = tfd.Multinomial(10000, fair_probs).sample() counts / 10000 .. raw:: latex \diilbookstyleoutputcell .. parsed-literal:: :class: output .. raw:: html
.. raw:: html
一般に、繰り返し事象(コイン投げのようなもの)の平均については、 繰り返し回数が増えるにつれて、 推定値は真の基礎確率に収束することが保証される。 この現象の数学的定式化は\ *大数の法則*\ と呼ばれ、 *中心極限定理*\ は、多くの状況で サンプルサイズ :math:`n` が増えるにつれて これらの誤差が :math:`(1/\sqrt{n})` の速度で 減少すべきことを示す。 投げる回数を1回から10,000回まで増やしたときに 推定値がどのように変化するかを調べて、 もう少し直感を得よう。 .. raw:: html
pytorchmxnetjaxtensorflow
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = Multinomial(1, fair_probs).sample((10000,)) cum_counts = counts.cumsum(dim=0) estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True) estimates = estimates.numpy() d2l.set_figsize((4.5, 3.5)) d2l.plt.plot(estimates[:, 0], label=("P(coin=heads)")) d2l.plt.plot(estimates[:, 1], label=("P(coin=tails)")) d2l.plt.axhline(y=0.5, color='black', linestyle='dashed') d2l.plt.gca().set_xlabel('Samples') d2l.plt.gca().set_ylabel('Estimated probability') d2l.plt.legend(); .. figure:: output_probability_bfb2c4_65_0.svg .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = multinomial(1, fair_probs, size=10000) cum_counts = counts.astype(np.float32).cumsum(axis=0) estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = np.random.multinomial(1, fair_probs, size=10000).astype(np.float32) cum_counts = counts.cumsum(axis=0) estimates = cum_counts / cum_counts.sum(axis=1, keepdims=True) .. raw:: html
.. raw:: html
.. raw:: latex \diilbookstyleinputcell .. code:: python counts = tfd.Multinomial(1, fair_probs).sample(10000) cum_counts = tf.cumsum(counts, axis=0) estimates = cum_counts / tf.reduce_sum(cum_counts, axis=1, keepdims=True) estimates = estimates.numpy() .. raw:: html
.. raw:: html
各実線はコインの2つの値の一方に対応し、 各実験グループの後にその値が出る確率の推定値を示す。 黒の破線は真の基礎確率を表す。 実験を重ねてより多くのデータを得るにつれて、 曲線は真の確率へ収束していきる。 統計学者を悩ませる、より高度な問いの形が すでに見え始めているかもしれない。 この収束はどれくらい速く起こるのか? もし同じ工場で製造されたコインを すでに多数試していたら、 その情報をどのように取り込めるだろうか? より形式的な扱い ---------------- ここまででかなり進んだ。 確率モデルを立て、 合成データを生成し、 統計的推定量を実行し、 収束を経験的に評価し、 誤差指標(ずれの確認)を報告した。 しかし、さらに先へ進むには、 より厳密である必要がある。 ランダム性を扱うとき、可能な結果の集合を :math:`\mathcal{S}` と表し、 これを\ *標本空間*\ または\ *結果空間*\ と呼ぶ。 ここで各要素は異なる可能な\ *結果*\ である。 1回のコイン投げの場合、 :math:`\mathcal{S} = \{\textrm{heads}, \textrm{tails}\}` である。 1回のサイコロ投げでは、 :math:`\mathcal{S} = \{1, 2, 3, 4, 5, 6\}` である。 2枚のコインを投げると、可能な結果は :math:`\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails}), (\textrm{tails}, \textrm{heads}), (\textrm{tails}, \textrm{tails})\}` である。 *事象*\ は標本空間の部分集合である。 たとえば、「1枚目のコイン投げが表になる」という事象は 集合 :math:`\{(\textrm{heads}, \textrm{heads}), (\textrm{heads}, \textrm{tails})\}` に対応する。 ランダム実験の結果 :math:`z` が :math:`z \in \mathcal{A}` を満たすとき、事象 :math:`\mathcal{A}` が起こったと言いる。 1回のサイコロ投げについて、 「5が出る」(\ :math:`\mathcal{A} = \{5\}`\ ) と「奇数が出る」(\ :math:`\mathcal{B} = \{1, 3, 5\}`\ ) という事象を定義できる。 この場合、サイコロが5なら、 :math:`\mathcal{A}` と :math:`\mathcal{B}` の両方が起こったと言える。 一方、\ :math:`z = 3` なら、 :math:`\mathcal{A}` は起こらず、 :math:`\mathcal{B}` は起こりる。 *確率*\ 関数は事象を 実数値へ写像する :math:`{P: \mathcal{A} \subseteq \mathcal{S} \rightarrow [0,1]}`\ 。 与えられた標本空間 :math:`\mathcal{S}` における事象 :math:`\mathcal{A}` の確率を :math:`P(\mathcal{A})` と表し、次の性質を持つ。 - 任意の事象 :math:`\mathcal{A}` の確率は非負の実数である。すなわち :math:`P(\mathcal{A}) \geq 0`; - 標本空間全体の確率は :math:`1` である。すなわち :math:`P(\mathcal{S}) = 1`; - *互いに排反*\ な可算個の事象列 :math:`\mathcal{A}_1, \mathcal{A}_2, \ldots`\ (すなわち、すべての :math:`i \neq j` について :math:`\mathcal{A}_i \cap \mathcal{A}_j = \emptyset`\ )に対して、それらのどれかが起こる確率は各確率の和に等しい。すなわち :math:`P(\bigcup_{i=1}^{\infty} \mathcal{A}_i) = \sum_{i=1}^{\infty} P(\mathcal{A}_i)`\ 。 確率論のこれらの公理は、 :cite:t:`Kolmogorov.1933` によって提案され、 多くの重要な帰結を素早く導くことができる。 たとえば、任意の事象 :math:`\mathcal{A}` *または* その補集合 :math:`\mathcal{A}'` が起こる確率は 1 であることが すぐに従います (\ :math:`\mathcal{A} \cup \mathcal{A}' = \mathcal{S}` だからです)。 また、\ :math:`P(\emptyset) = 0` も証明できる。 なぜなら :math:`1 = P(\mathcal{S} \cup \mathcal{S}') = P(\mathcal{S} \cup \emptyset) = P(\mathcal{S}) + P(\emptyset) = 1 + P(\emptyset)` だからである。 したがって、任意の事象 :math:`\mathcal{A}` *かつ* その補集合 :math:`\mathcal{A}'` が同時に起こる確率は :math:`P(\mathcal{A} \cap \mathcal{A}') = 0` である。 非形式的に言えば、これは不可能な事象の起こる確率はゼロであることを意味する。 確率変数 -------- サイコロの目が奇数になることや、 1回目のコイン投げが表になることのような事象について話すとき、 私たちは\ *確率変数*\ の概念を用いていた。 形式的には、確率変数は 基礎となる標本空間から (場合によっては多数の)値の集合への写像である。 確率変数と標本空間はどちらも結果の集合なので、 何が違うのか疑問に思うかもしれない。 重要なのは、確率変数は生の標本空間よりも はるかに粗くできるということである。 たとえば、基礎となる標本空間が 0 と 1 の線分上の点のように無限であっても、 「0.5より大きい」といった二値の確率変数を定義できる。 さらに、複数の確率変数が 同じ基礎標本空間を共有することもある。 たとえば、「自宅の警報装置が鳴るかどうか」と 「家に泥棒が入ったかどうか」は、 どちらも同じ基礎標本空間を共有する二値の確率変数である。 したがって、ある確率変数が取る値を知ると、 別の確率変数が取りうる値について何かを知ることができる。 警報が鳴ったと分かれば、 家に泥棒が入った可能性が高いと疑うかもしれない。 確率変数が取る各値は、 基礎となる標本空間の部分集合に対応する。 したがって、確率変数 :math:`X` が値 :math:`v` を取る事象、すなわち :math:`X=v` は\ *事象*\ であり、 :math:`P(X=v)` はその確率を表す。 この記法はときに煩雑になるため、 文脈が明らかな場合には記法を流用できる。 たとえば、\ :math:`P(X)` を広く :math:`X` の\ *分布*\ 、 すなわち :math:`X` が任意の値を取る確率を与える関数を指すのに使うことがある。 また、\ :math:`P(X,Y) = P(X) P(Y)` のような式を書くこともある。 これは、確率変数 :math:`X` と :math:`Y` が取りうるすべての値に対して成り立つ文を簡潔に表すためのもので、 すなわちすべての :math:`i,j` について :math:`P(X=i \textrm{ and } Y=j) = P(X=i)P(Y=j)` が成り立つという意味である。 さらに、確率変数が文脈から明らかなときには :math:`P(v)` と書いて記法を流用することもある。 確率論における事象は標本空間の結果の集合なので、 確率変数が取る値の範囲を指定できる。 たとえば、\ :math:`P(1 \leq X \leq 3)` は事象 :math:`\{1 \leq X \leq 3\}` の確率を表す。 *離散*\ 確率変数(コイン投げやサイコロ投げのようなもの)と、 *連続*\ 確率変数(母集団から無作為に抽出した人の体重や身長のようなもの)の間には、 微妙な違いがあることに注意しよ。 この場合、私たちは誰かの正確な身長を それほど気にすることはほとんどない。 さらに、十分に精密に測定すれば、 地球上でまったく同じ身長の人は 一人もいないことが分かるだろう。 実際、十分に細かく測れば、 起床時と就寝時で同じ身長になることもない。 誰かの身長が 1.801392782910287192 メートルである 正確な確率を問うことには、ほとんど意味がない。 むしろ通常は、誰かの身長が たとえば 1.79 メートルから 1.81 メートルの間に入るかどうかを 知ることの方が重要である。 このような場合には、確率\ *密度*\ を扱いる。 ちょうど 1.80 メートルである確率はないが、 密度はゼロではない。 区間に割り当てられる確率を求めるには、 その区間上で密度を\ *積分*\ しなければならない。 複数の確率変数 -------------- 前節を通り抜けるだけでも、 複数の確率変数の相互作用を含む記述を 避けられなかったことに気づいたかもしれない (\ :math:`P(X,Y) = P(X) P(Y)` を思い出してほしい)。 機械学習の大部分は、 このような関係を扱っている。 ここでの標本空間は関心のある母集団、 たとえば企業と取引する顧客、 インターネット上の写真、 あるいは生物学者に知られているタンパク質などである。 各確率変数は、異なる属性の(未知の)値を表す。 母集団から個体をサンプルするたびに、 各確率変数の実現値を観測する。 確率変数が取る値は、 重なりうる、部分的に重なりうる、 あるいは完全に互いに素な標本空間の部分集合に対応するため、 ある確率変数の値を知ると、 別の確率変数が取りうる値についての信念を更新することになる。 患者が病院に来て、 呼吸困難があり、 嗅覚を失っていることが観測されたなら、 呼吸困難もなく嗅覚も正常な場合よりも、 COVID-19 にかかっている可能性が高いと考える。 複数の確率変数を扱うとき、 変数が同時に取りうる値のあらゆる組合せに対応する事象を構成できる。 これらの各組合せ (たとえば :math:`A=a` かつ :math:`B=b`\ )に確率を割り当てる関数は *同時確率*\ 関数と呼ばれ、 対応する標本空間の部分集合の共通部分に割り当てられた確率をそのまま返す。 確率変数 :math:`A` と :math:`B` がそれぞれ値 :math:`a` と :math:`b` を取る事象に割り当てられる *同時確率*\ は :math:`P(A = a, B = b)` と表され、 ここでカンマは「かつ」を意味する。 任意の値 :math:`a` と :math:`b` に対して、次が成り立つことに注意しよ。 .. math:: P(A=a, B=b) \leq P(A=a) \textrm{ and } P(A=a, B=b) \leq P(B = b), なぜなら、\ :math:`A=a` と :math:`B=b` が起こるには、 :math:`A=a` が起こり、\ *かつ* :math:`B=b` も起こらなければならないからである。 興味深いことに、同時確率は、 これらの確率変数について確率論的な意味で知りうるすべてを教えてくれ、 個々の分布 :math:`P(A)` と :math:`P(B)` を復元することを含む 多くの有用な量を導くために使える。 :math:`P(A=a)` を復元するには、 確率変数 :math:`B` が取りうるすべての値 :math:`v` について :math:`P(A=a, B=v)` を足し合わせればよいのである。 :math:`P(A=a) = \sum_v P(A=a, B=v)`\ 。 比 :math:`\frac{P(A=a, B=b)}{P(A=a)} \leq 1` は 非常に重要であることが分かりる。 これは\ *条件付き確率*\ と呼ばれ、 “:math:`\mid`” 記号で表される。 .. math:: P(B=b \mid A=a) = P(A=a,B=b)/P(A=a). これは、\ :math:`A=a` が起こったという事実を条件にしたときの、 事象 :math:`B=b` に対応する新しい確率を教えてくれる。 この条件付き確率は、 標本空間のうち :math:`A=a` に対応する部分だけに注意を向け、 その後、すべての確率の和が 1 になるように再正規化したものと考えられる。 条件付き確率は実際には通常の確率にすぎず、 したがって、すべての項を同じ事象で条件づけて 同じ標本空間に注意を限定する限り、 すべての公理に従いる。 たとえば、互いに素な事象 :math:`\mathcal{B}` と :math:`\mathcal{B}'` に対して、 :math:`P(\mathcal{B} \cup \mathcal{B}' \mid A = a) = P(\mathcal{B} \mid A = a) + P(\mathcal{B}' \mid A = a)` が成り立ちる。 条件付き確率の定義を用いると、 有名な結果である\ *ベイズの定理*\ を導ける。 定義により、\ :math:`P(A, B) = P(B\mid A) P(A)` かつ :math:`P(A, B) = P(A\mid B) P(B)` である。 両式を組み合わせると :math:`P(B\mid A) P(A) = P(A\mid B) P(B)` となり、したがって .. math:: P(A \mid B) = \frac{P(B\mid A) P(A)}{P(B)}. この単純な式は、条件づけの順序を逆転できるため、 深い意味を持つ。 :math:`P(B\mid A)`\ 、\ :math:`P(A)`\ 、\ :math:`P(B)` をどのように推定するかが分かれば、 :math:`P(A\mid B)` を推定できる。 一方を直接推定する方が他方より簡単なことがよくあり、 そのときベイズの定理が助けになる。 たとえば、ある病気に対する症状の有病率と、 それぞれ病気および症状全体の有病率が分かっていれば、 症状に基づいてその人が病気である可能性を決定できる。 場合によっては、症状の有病率のような :math:`P(B)` に直接アクセスできないこともある。 この場合、ベイズの定理の簡略版が役立ちる。 .. math:: P(A \mid B) \propto P(B \mid A) P(A). :math:`P(A \mid B)` は 1 に正規化されなければならない、 すなわち :math:`\sum_a P(A=a \mid B) = 1` であることが分かっているので、 次を計算できる。 .. math:: P(A \mid B) = \frac{P(B \mid A) P(A)}{\sum_a P(B \mid A=a) P(A = a)}. ベイズ統計では、観測者は 利用可能な仮説の妥当性についての ある(主観的な)事前信念を *事前分布* :math:`P(H)` に符号化して持ち、 仮説の各クラスに対して 収集された証拠の各値を観測する確率を表す *尤度関数* :math:`P(E \mid H)` を持つと考える。 ベイズの定理は、 利用可能な証拠 :math:`E` に照らして 初期の\ *事前* :math:`P(H)` をどのように更新し、 *事後*\ 信念 :math:`P(H \mid E) = \frac{P(E \mid H) P(H)}{P(E)}` を得るかを教えてくれるものとして解釈される。 非形式的には、 「事後は事前に尤度を掛けて証拠で割ったもの」 と表現できる。 ここで証拠 :math:`P(E)` はすべての仮説で同じなので、 仮説全体で正規化するだけで済みる。 :math:`\sum_a P(A=a \mid B) = 1` は、 確率変数を\ *周辺化*\ することも可能にする。 つまり、\ :math:`P(A, B)` のような同時分布から変数を取り除けるのである。 実際、 .. math:: \sum_a P(B \mid A=a) P(A=a) = \sum_a P(B, A=a) = P(B). 独立性もまた、統計学の多くの重要な考え方の基盤をなす 根本的に重要な概念である。 要するに、2つの変数は、 :math:`A` の値で条件づけても :math:`B` に対応する確率分布に変化が生じず、 その逆も同様であれば\ *独立*\ である。 より形式的には、\ :math:`A \perp B` と表される独立性は、 :math:`P(A \mid B) = P(A)`\ 、したがって :math:`P(A,B) = P(A \mid B) P(B) = P(A) P(B)` を要求する。 独立性はしばしば適切な仮定である。 たとえば、確率変数 :math:`A` が 1枚目の公平なコインを投げた結果を表し、 確率変数 :math:`B` が 別のコインを投げた結果を表すなら、 :math:`A` が表だったかどうかは :math:`B` が表になる確率に影響すべきではない。 独立性は、基礎となる分布からのデータの連続した 抽出の間で成り立つとき(強い統計的結論を導けるため)、 あるいはデータ中のさまざまな変数の間で成り立つとき(その独立構造を符号化したより単純なモデルを扱えるため)、 特に有用である。 一方で、確率変数間の依存関係を推定することこそが 学習の目的そのものであることも少なくない。 症状から病気の確率を推定したいのは、 病気と症状が\ *独立ではない*\ と考えているからである。 条件付き確率も正しい確率であるため、 独立と従属の概念はそれにも適用されることに注意しよ。 3つ目の変数 :math:`C` が与えられたとき、 2つの確率変数 :math:`A` と :math:`B` が\ *条件付き独立*\ であるとは、 :math:`P(A, B \mid C) = P(A \mid C)P(B \mid C)` が成り立つことと同値である。 興味深いことに、2つの変数は一般には独立でも、 3つ目の変数で条件づけると従属になることがある。 これはしばしば、2つの確率変数 :math:`A` と :math:`B` が 3つ目の変数 :math:`C` の原因に対応するときに起こりる。 たとえば、骨折と肺がんは 一般集団では独立かもしれないが、 病院にいることを条件にすると、 骨折は肺がんと負の相関を持つかもしれない。 それは、骨折がその人が病院にいる理由を\ *説明し尽くす*\ ため、 肺がんのために入院している可能性を下げるからである。 逆に、2つの従属な確率変数が 3つ目の変数で条件づけると独立になることもある。 これは、もともと無関係な2つの事象に 共通の原因があるときによく起こりる。 小学生の間では、靴のサイズと読解力は 強く相関しているが、 年齢で条件づけるとこの相関は消える。 .. _subsec_probability_hiv_app: 例 -- 技能を試してみよう。 医師が患者に HIV 検査を行うとする。 この検査はかなり正確で、 患者が健康なのに病気と報告される場合、すなわち健康な患者が陽性と判定される場合にのみ、 1% の確率で失敗する。 さらに、患者が実際に HIV に感染している場合には、 見逃すことはない。 診断を :math:`D_1 \in \{0, 1\}` で表し (0 は陰性、1 は陽性)、 HIV の状態を :math:`H \in \{0, 1\}` で表す。 ========================= =========== =========== 条件付き確率 :math:`H=1` :math:`H=0` ========================= =========== =========== :math:`P(D_1 = 1 \mid H)` 1 0.01 :math:`P(D_1 = 0 \mid H)` 0 0.99 ========================= =========== =========== 列の和はすべて 1 であるが、行の和はそうではないことに注意しよ。 これは条件付き確率だからである。 検査結果が陽性だったときに患者が HIV に感染している確率、 すなわち :math:`P(H = 1 \mid D_1 = 1)` を計算しよう。 直感的には、これは病気の一般的な有病率に依存する。 なぜなら、それが偽陽性の数に影響するからである。 母集団では病気がかなり少ないとし、たとえば :math:`P(H=1) = 0.0015` とする。 ベイズの定理を適用するには、周辺化を用いて次を求める必要がある。 .. math:: \begin{aligned} P(D_1 = 1) =& P(D_1=1, H=0) + P(D_1=1, H=1) \\ =& P(D_1=1 \mid H=0) P(H=0) + P(D_1=1 \mid H=1) P(H=1) \\ =& 0.011485. \end{aligned} これにより、 .. math:: P(H = 1 \mid D_1 = 1) = \frac{P(D_1=1 \mid H=1) P(H=1)}{P(D_1=1)} = 0.1306. 言い換えると、検査はかなり正確であるにもかかわらず、 患者が実際に HIV に感染している確率は わずか 13.06% しかない。 ご覧のとおり、確率は直感に反することがある。 このような恐ろしい知らせを受けた患者はどうすべきだろうか? おそらく、患者は医師にもう一度検査をしてもらい、 はっきりさせたいと頼むだろう。 2回目の検査は性質が異なり、 1回目ほど良くはない。 ========================= =========== =========== 条件付き確率 :math:`H=1` :math:`H=0` ========================= =========== =========== :math:`P(D_2 = 1 \mid H)` 0.98 0.03 :math:`P(D_2 = 0 \mid H)` 0.02 0.97 ========================= =========== =========== 残念ながら、2回目の検査も陽性でした。 条件付き独立を仮定して、 ベイズの定理を適用するために必要な確率を計算しよう。 .. math:: \begin{aligned} P(D_1 = 1, D_2 = 1 \mid H = 0) & = P(D_1 = 1 \mid H = 0) P(D_2 = 1 \mid H = 0) =& 0.0003, \\ P(D_1 = 1, D_2 = 1 \mid H = 1) & = P(D_1 = 1 \mid H = 1) P(D_2 = 1 \mid H = 1) =& 0.98. \end{aligned} これで周辺化を適用し、両方の検査が陽性となる確率を得られる。 .. math:: \begin{aligned} &P(D_1 = 1, D_2 = 1)\\ &= P(D_1 = 1, D_2 = 1, H = 0) + P(D_1 = 1, D_2 = 1, H = 1) \\ &= P(D_1 = 1, D_2 = 1 \mid H = 0)P(H=0) + P(D_1 = 1, D_2 = 1 \mid H = 1)P(H=1)\\ &= 0.00176955. \end{aligned} 最後に、両方の検査が陽性であるときに患者が HIV に感染している確率は .. math:: P(H = 1 \mid D_1 = 1, D_2 = 1) = \frac{P(D_1 = 1, D_2 = 1 \mid H=1) P(H=1)}{P(D_1 = 1, D_2 = 1)} = 0.8307. つまり、2回目の検査によって、 すべてが順調ではないという確信をかなり高めることができた。 2回目の検査は1回目よりかなり精度が低いにもかかわらず、 それでも推定を大きく改善した。 2つの検査が互いに条件付き独立であるという仮定は、 より正確な推定を得るうえで決定的でした。 極端な例として、同じ検査を2回行う場合を考えてみよう。 この状況では、2回とも同じ結果になると期待されるため、 同じ検査をもう一度行っても追加の洞察は得られない。 鋭い読者は、診断が 見え透いた分類器のように振る舞っており、 患者が健康かどうかを判断する能力は より多くの特徴量(検査結果)を得るにつれて高まることに気づいたかもしれない。 期待値 ------ しばしば、意思決定には 個々の事象に割り当てられた確率を見るだけでなく、 それらを組み合わせて、 指針を与えてくれる有用な集約量を作ることが必要である。 たとえば、確率変数が連続的なスカラー値を取るとき、 私たちは平均的にどの値が期待されるかを知りたいことがよくある。 この量は形式的には\ *期待値*\ と呼ばれる。 投資を行う場合、 最初に関心を持つ量は、 起こりうるすべての結果にわたって平均した 期待収益かもしれない (適切な確率で重みづけする)。 たとえば、50% の確率で 投資が完全に失敗し、 40% の確率で 2\ :math:`\times` のリターンを生み、 10% の確率で 10\ :math:`\times` のリターンを生むとする。 期待収益を計算するには、 すべてのリターンについて、 それぞれに起こる確率を掛けて足し合わせる。 すると期待値は :math:`0.5 \cdot 0 + 0.4 \cdot 2 + 0.1 \cdot 10 = 1.8` となる。 したがって、期待収益は 1.8\ :math:`\times` である。 一般に、確率変数 :math:`X` の\ *期待値*\ (または平均)は次のように定義される。 .. math:: E[X] = E_{x \sim P}[x] = \sum_{x} x P(X = x). 同様に、密度に対しては :math:`E[X] = \int x \;dp(x)` を得る。 ときには、\ :math:`x` のある関数の期待値に関心がある。 これらの期待値は次のように計算できる。 .. math:: E_{x \sim P}[f(x)] = \sum_x f(x) P(x) \textrm{ and } E_{x \sim P}[f(x)] = \int f(x) p(x) \;dx それぞれ離散確率と密度に対してである。 上の投資の例に戻ると、 :math:`f` はリターンに対応する\ *効用*\ (幸福度)かもしれない。 行動経済学では、人々は 1ドルを稼ぐことで得られる効用よりも、 お金を失うことに対してより大きな不効用を感じることが 長く指摘されてきた。 さらに、お金の価値はしばしば準線形である。 10万ドルを持つこととゼロドルであることの違いは、 家賃を払えるか、十分に食べられるか、 質の高い医療を受けられるか、 それともホームレスとして苦しむかの違いになりえる。 一方で、20万ドルと10万ドルの差による利益は それほど劇的ではない。 このような考え方は、 「お金の効用は対数的である」という決まり文句を動機づける。 総損失に対応する効用が :math:`-1` で、 リターン :math:`1`\ 、\ :math:`2`\ 、\ :math:`10` に対応する効用が それぞれ :math:`1`\ 、\ :math:`2`\ 、\ :math:`4` だとすると、 投資の期待幸福度は :math:`0.5 \cdot (-1) + 0.4 \cdot 2 + 0.1 \cdot 4 = 0.7` (期待効用損失 30%)になる。 もし本当にこれがあなたの効用関数なら、 お金を銀行に預けておくのが最善かもしれない。 金融上の意思決定では、 投資がどれだけ\ *リスクが高い*\ かも測りたいかもしれない。 ここでは期待値だけでなく、 実際の値がこの値に対してどれだけ\ *変動*\ しやすいかに関心がある。 実際の値と期待値の差の期待値を そのまま取ることはできない点に注意しよ。 差の期待値は期待値の差だからである。 すなわち、\ :math:`E[X - E[X]] = E[X] - E[E[X]] = 0` である。 しかし、この差の任意の非負関数の期待値を見ることはできる。 確率変数の\ *分散*\ は、 *二乗*\ 差の期待値を見ることで計算される。 .. math:: \textrm{Var}[X] = E\left[(X - E[X])^2\right] = E[X^2] - E[X]^2. ここで等式は、 :math:`(X - E[X])^2 = X^2 - 2 X E[X] + E[X]^2` を展開し、各項の期待値を取ることで得られる。 分散の平方根は、\ *標準偏差*\ と呼ばれる 別の有用な量である。 分散と標準偏差は同じ情報を伝えますが (どちらか一方から他方を計算できる)、 標準偏差には、 元の確率変数が表す量と同じ単位で表される という利点がある。 最後に、確率変数の関数の分散は 同様に次のように定義される。 .. math:: \textrm{Var}_{x \sim P}[f(x)] = E_{x \sim P}[f^2(x)] - E_{x \sim P}[f(x)]^2. 投資の例に戻ると、 投資の分散を計算できる。 それは :math:`0.5 \cdot 0 + 0.4 \cdot 2^2 + 0.1 \cdot 10^2 - 1.8^2 = 8.36` である。 あらゆる意味で、これはリスクの高い投資である。 数学的慣習として、平均と分散はしばしば :math:`\mu` と :math:`\sigma^2` で表されることに注意しよ。 これは特に、ガウス分布をパラメータ化するときによく使われる。 スカラー確率変数に対して期待値と分散を導入したのと同様に、 ベクトル値の確率変数にも同じことができる。 期待値は要素ごとに適用できるので簡単である。 たとえば、\ :math:`\boldsymbol{\mu} \stackrel{\textrm{def}}{=} E_{\mathbf{x} \sim P}[\mathbf{x}]` の各成分は :math:`\mu_i = E_{\mathbf{x} \sim P}[x_i]` である。 *共分散*\ はより複雑である。 これは、確率変数とその平均との差の\ *外積*\ の期待値として定義する。 .. math:: \boldsymbol{\Sigma} \stackrel{\textrm{def}}{=} \textrm{Cov}_{\mathbf{x} \sim P}[\mathbf{x}] = E_{\mathbf{x} \sim P}\left[(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top\right]. この行列 :math:`\boldsymbol{\Sigma}` は共分散行列と呼ばれる。 その効果を理解する簡単な方法は、 :math:`\mathbf{x}` と同じ大きさのベクトル :math:`\mathbf{v}` を考えることである。 すると次が成り立ちる。 .. math:: \mathbf{v}^\top \boldsymbol{\Sigma} \mathbf{v} = E_{\mathbf{x} \sim P}\left[\mathbf{v}^\top(\mathbf{x} - \boldsymbol{\mu}) (\mathbf{x} - \boldsymbol{\mu})^\top \mathbf{v}\right] = \textrm{Var}_{x \sim P}[\mathbf{v}^\top \mathbf{x}]. したがって、\ :math:`\boldsymbol{\Sigma}` は、 :math:`\mathbf{x}` の任意の線形関数の分散を 単純な行列積で計算できるようにする。 非対角成分は各成分の相関の強さを示す。 0 なら相関なし、 より大きな正の値なら より強く相関していることを意味する。 議論 ---- 機械学習では、不確実なことがたくさんある。 入力が与えられたときのラベルの値について不確実であることもあれば、 推定されたパラメータの値について不確実であることもある。 さらには、運用時に到着するデータが 学習データと同じ分布から来ているかどうかさえ 不確実であることがある。 *偶然的不確実性*\ とは、 問題に内在する不確実性であり、 観測変数では説明できない真のランダム性によるものを指す。 *認識的不確実性*\ とは、 モデルのパラメータに関する不確実性であり、 より多くのデータを集めることで減らせると期待できる種類の不確実性である。 コインが表になる確率については 認識的不確実性を持つかもしれないが、 その確率が分かった後でも、 将来の任意の投げの結果については 偶然的不確実性が残る。 誰かが公平なコインを投げるのをどれだけ長く見ていても、 次の投げが表になると50%より高くも低くも確信することはできない。 これらの用語は機械的モデリングに由来する (この側面の\ `不確実性定量化 `__\ については、たとえば :cite:t:`Der-Kiureghian.Ditlevsen.2009` のレビューを参照されたい)。 ただし、これらの用語はやや言葉の流用であることに注意する価値がある。 *epistemic* という語は\ *知識*\ に関するあらゆるものを指すため、 哲学的な意味では、あらゆる不確実性は認識的不確実性である。 未知の確率分布からデータをサンプリングすることで、 データ生成分布のパラメータを推定するために使える情報が得られることを見た。 とはいえ、これが可能になる速度はかなり遅いことがある。 コイン投げの例(および多くの他の例)では、 サンプルサイズ :math:`n` に対して :math:`1/\sqrt{n}` の速度で収束する推定量を設計する以上のことはできない。 これは、10個の観測から1000個の観測へ増やすと (通常は十分達成可能な課題です) 不確実性が10分の1に減る一方で、 次の1000個の観測は比較的あまり役に立たず、 1.41倍の削減しかもたらさないことを意味する。 これは機械学習における持続的な特徴である。 しばしば容易な改善はあるが、 さらに改善するには非常に大量のデータ、 そしてしばしば膨大な計算量が必要になる。 大規模言語モデルに関するこの事実の実証的レビューについては :cite:t:`Revels.Lubin.Papamarkou.2016` を参照しよ。 また、統計モデリングのための言語と道具も洗練された。 その過程で、条件付き確率と、 統計学で最も重要な方程式の一つであるベイズの定理について学んだ。 これは、データが伝える情報を、 観測 :math:`B` がパラメータの選択 :math:`A` にどれだけ適合するかを表す尤度項 :math:`P(B \mid A)` と、 そもそも特定の :math:`A` の選択がどれほど妥当だったかを支配する事前確率 :math:`P(A)` によって 切り分けるための有効な道具である。 特に、この規則が、 検査の有効性と病気そのものの有病率(すなわち事前)に基づいて、 診断に確率を割り当てるためにどのように適用できるかを見た。 最後に、特定の確率分布の効果についての 最初の非自明な問い、 すなわち期待値と分散を導入した。 確率分布には線形期待値や二次期待値以外にも 多くのものがあるが、 この2つだけでも分布の起こりうる振る舞いについて かなりの知識を与えてくれる。 たとえば、\ `チェビシェフの不等式 `__ は :math:`P(|X - \mu| \geq k \sigma) \leq 1/k^2` を述べる。 ここで :math:`\mu` は期待値、\ :math:`\sigma^2` は分散、 :math:`k > 1` は任意に選べる信頼パラメータである。 これは、分布からのサンプルが 少なくとも 50% の確率で 期待値を中心とする :math:`[-\sqrt{2} \sigma, \sqrt{2} \sigma]` 区間内に入ることを教えてくれる。 演習 ---- 1. より多くのデータを観測することで、結果に関する不確実性を任意に低いレベルまで減らせる例を挙げよ。 2. より多くのデータを観測しても、不確実性がある点までしか減らず、その後はそれ以上減らない例を挙げよ。なぜそうなるのか、またその点がどこにあると予想されるかを説明せよ。 3. コイン投げにおける平均への収束を経験的に示した。\ :math:`n` 個のサンプルを得た後に表が出る確率の推定値の分散を計算せよ。 1. 分散は観測数に対してどのようにスケールするか。 2. チェビシェフの不等式を用いて期待値からのずれを上界づけよ。 3. それは中心極限定理とどう関係するか。 4. 平均0、分散1の確率分布から :math:`m` 個のサンプル :math:`x_i` を得ると仮定する。平均 :math:`z_m \stackrel{\textrm{def}}{=} m^{-1} \sum_{i=1}^m x_i` を計算せよ。各 :math:`z_m` に対して独立にチェビシェフの不等式を適用できるか。なぜか。 5. 確率 :math:`P(\mathcal{A})` と :math:`P(\mathcal{B})` を持つ2つの事象が与えられたとき、\ :math:`P(\mathcal{A} \cup \mathcal{B})` と :math:`P(\mathcal{A} \cap \mathcal{B})` の上界と下界を求めよ。ヒント:\ `ベン図 `__ を使って状況を図示せよ。 6. :math:`A`\ 、\ :math:`B`\ 、\ :math:`C` という確率変数列があり、\ :math:`B` は :math:`A` のみに依存し、\ :math:`C` は :math:`B` のみに依存すると仮定する。このとき同時確率 :math:`P(A, B, C)` を簡単化できるか。ヒント:これは\ `マルコフ連鎖 `__\ である。 7. :numref:`subsec_probability_hiv_app` では、2つの検査結果が独立ではないと仮定せよ。特に、各検査単独の偽陽性率が10%、偽陰性率が1%であるとする。すなわち、\ :math:`P(D =1 \mid H=0) = 0.1` かつ :math:`P(D = 0 \mid H=1) = 0.01` とする。さらに、\ :math:`H = 1`\ (感染)では検査結果は条件付き独立、すなわち :math:`P(D_1, D_2 \mid H=1) = P(D_1 \mid H=1) P(D_2 \mid H=1)` だが、健康な患者では結果が :math:`P(D_1 = D_2 = 1 \mid H=0) = 0.02` を通じて結びついていると仮定する。 1. ここまでの情報に基づいて、\ :math:`H=0` のときの :math:`D_1` と :math:`D_2` の同時確率表を作成せよ。 2. 1回目の検査が陽性だった後に患者が病気(\ :math:`H=1`\ )である確率を導出せよ。以前と同じ基準確率 :math:`P(H=1) = 0.0015` を仮定してよい。 3. 両方の検査が陽性だった後に患者が病気(\ :math:`H=1`\ )である確率を導出せよ。 8. あなたが投資銀行の資産運用担当者で、投資先として株式 :math:`s_i` を選べるとする。ポートフォリオは各株式に対して重み :math:`\alpha_i` を用いて合計が 1 になる必要がある。株式の平均収益率は :math:`\boldsymbol{\mu} = E_{\mathbf{s} \sim P}[\mathbf{s}]`\ 、共分散は :math:`\boldsymbol{\Sigma} = \textrm{Cov}_{\mathbf{s} \sim P}[\mathbf{s}]` である。 1. 与えられたポートフォリオ :math:`\boldsymbol{\alpha}` の期待収益を計算せよ。 2. ポートフォリオの収益を最大化したいなら、投資をどのように選ぶべきか。 3. ポートフォリオの\ *分散*\ を計算せよ。 4. 分散に上限制約を課しつつ収益を最大化する最適化問題を定式化せよ。これはノーベル賞を受賞した\ `マルコヴィッツのポートフォリオ `__\ です :cite:`Mangram.2013`\ 。これを解くには二次計画法ソルバが必要であり、本書の範囲をはるかに超えている。