目次と前回の記事
Python のバージョンとこれまでに作成したモジュール
本記事のプログラムは Python のバージョン 3.13 で実行しています。また、numpy のバージョンは 2.3.5 です。
| リンク | 説明 |
|---|---|
| marubatsu.py | Marubatsu、Marubatsu_GUI クラスの定義 |
| ai.py | AI に関する関数 |
| mbtest.py | テストに関する関数 |
| util.py | ユーティリティ関数の定義 |
| tree.py | ゲーム木に関する Node、Mbtree クラスなどの定義 |
| gui.py | GUI に関する処理を行う基底クラスとなる GUI クラスの定義 |
AI の一覧とこれまでに作成したデータファイルについては、下記の記事を参照して下さい。
大数の法則
今回の記事では 大数の法則 の 定義 について説明します。
大数の法則 には 大数の弱法則 と 大数の強法則 の 2 種類があり、大数の強法則 の方が より強い主張 を行います。大数の強法則 の 証明がかなり難しい 点と、モンテカルロ法による円周率の近似 や今後の記事で説明する 原始モンテカルロ法による AI の作成 を行う場合は、大数の弱法則の性質で十分 だと思いますので本記事では 大数の弱法則の方を説明 します。
なお、以後の説明では 大数の弱法則 の事を 単に大数の法則と表記 することにします。
参考までに 大数の法則 のWikipedia のリンクを下記に記します。
大数の法則の定義
下記は Wikipedia に記載されている 大数の弱法則の定義 です。なお、若干言い回しを変えていますが、意味は同じです。
- 独立同分布 に従う 可積分 な 確率変数 の 無限列 $\boldsymbol{X_1}$、$\boldsymbol{X_2}$、… が与えられたとき、その 平均 を $\boldsymbol{μ}$ とおく
-
標本サイズ が $\boldsymbol{n ≧ 1}$ の 標本平均 を表す 確率変数 $\boldsymbol{\bar{X_n}}$ を下記の式で定義する
$\boldsymbol{\bar{X_n} = \frac{1}{n}\sum_{i=1}^n X_i}$ - 標本平均 $\boldsymbol{\bar{X_n}}$ のとる値 が $\boldsymbol{μ}$ の近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
上記の $\boldsymbol{X_i}$ と $\boldsymbol{\bar{X_n}}$ は 似たような表記 ですが、下記のように 大きく異なる意味を表す 点に注して下さい。
- $\boldsymbol{X_i}$ は $\boldsymbol{i}$ 個目 の 標本の値 を表す確率変数
- $\boldsymbol{\bar{X_n}}$ は 標本サイズ が $\boldsymbol{n}$ の標本の 標本平均 を表す確率変数
下記は 上記の 3 を表す数式 で、大数の法則 は上記の 1、2 の条件が満たされた場合 に 標本平均の性質 を表す 下記の式が成り立つ ことを表す法則です。
$\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
大数の強法則 は、上記と同じ条件 で $\boldsymbol{n}$ を 無限大まで大きくする と $\boldsymbol{\bar{X_n}}$ が $\boldsymbol{μ}$ に一致する確率 が 1 に近づく というもので、式で表現すると下記のようになります。
$\boldsymbol{P(\lim_{n \to \infty} \bar{X_n} = μ)= 1}$
弱法則と何が違うのかが良くわからない人が多いのではないかと思いますが、弱法則よりも厳しい条件 を表しています。弱法則との違い や 強法則の証明 は かなり難しい ので本記事では説明を省略します。興味がある方は調べてみて下さい。
大数の法則の定義の言い換え
おそらく多くの方は上記の定義の意味が良くわからないのではないでしょうか。上記の 大数の法則の定義 を 母集団から無作為復元抽出 を行った場合の 標本平均の性質 で説明すると以下のようになります。
- 母集団の 母平均 $\boldsymbol{μ}$ が計算できる ものとする
- その 母集団 から $\boldsymbol{n}$ 個の要素 を 無作為復元抽出 した 標本 の 標本平均 を $\boldsymbol{\bar{x_n}}$ とする
- $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の近傍 から 外れる確率 は 十分大きな $\boldsymbol{n}$ を取れば いくらでも小さくできる
その理由についてはこの後で詳しく説明しますが、上記の 3 を要約 すると「試行回数を増やせば増やすほど、その 結果の平均(標本平均) は 理論上の平均(母平均)に近づいていく」という 数学の用語を使わない 場合の 大数の法則の説明 になります。
大数の法則の定義を上記のように 言い換えることができる理由 と、下記の式 が 大数の法則を表す理由 について説明します。
$\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
独立同分布に従う確率変数の意味
最初に、大数の法則の 定義の 1、2 から 可積分と平均に関する記述を除いた 下記の説明を行います。
- 独立同分布 に従う 確率変数の無限列 $\boldsymbol{X_1}$、$\boldsymbol{X_2}$、… が与えられたものとする
-
標本サイズ が $\boldsymbol{n ≧ 1}$ の 標本平均 を表す 確率変数 $\boldsymbol{\bar{X_n}}$ を下記の式で定義する
$\boldsymbol{\bar{X_n} = \frac{1}{n}\sum_{i=1}^n X_i}$
大数法則 の 定義の 3 は 標本サイズが $\boldsymbol{n}$ の標本の 標本平均の性質 を表しています。また、上記の 1、2 からその 標本平均 を表す 確率変数 $\boldsymbol{\bar{X_n}}$ は 独立同分布 に従う 確率変数 $\boldsymbol{X_1}$、$\boldsymbol{X_2}$、...、$\boldsymbol{X_n}$ によって計算 されます。
以前の記事 で説明したように、独立同分布 とは、複数の確率変数 が 互いに影響を与えず(独立)、同じ確率分布に従う(同分布) という性質を表しており、母集団 から 複数回の無作為復元抽出 を行うと それぞれの抽出結果 を表す 確率変数 は 独立同分布 に従います。
また、大数の法則 の 定義の 2 では、標本サイズ を表す $\boldsymbol{n}$ に 上限を設けていない ことから 独立同分布に従う、無限個の確率変数 $\boldsymbol{X_1}$、$\boldsymbol{X_2}$、・・・ が 存在する必要 があります。
これらのことから、大数の法則 の 定義の 1、2 から 可積分と平均に関する記述を除いた ものは、下記のように 母集団から無作為復元抽出 を行った場合の 標本平均に関する説明で表現 することができます。
- 母集団 から $\boldsymbol{n}$ 個の要素 を 無作為復元抽出 した 標本 の 標本平均 を $\boldsymbol{\bar{x_n}}$ とする
先程と同様に、$\boldsymbol{x_i}$ と $\boldsymbol{\bar{x_n}}$ は 似たような表記 ですが、下記のように 大きく異なる意味を表す 点に注して下さい。
- $\boldsymbol{x_i}$ は $\boldsymbol{i}$ 個目 の 標本の値
- $\boldsymbol{\bar{x_n}}$ は 標本サイズ が $\boldsymbol{n}$ の標本の 標本平均
また、大文字 の $\boldsymbol{X_i}$ は 確率変数、小文字 の $\boldsymbol{x_i}$ はその 実現値 です。
可積分の意味
下記の 大数の法則 の 定義の 1 の「可積分 な 確率変数」とは、簡単に言うと 確率変数の期待値(平均) を 有限な値として計算できる という意味を表しています。このような条件が必要となる理由は、期待値を有限な値として計算できない確率分布が存在 し、そのような確率分布に対しては 大数の法則は満たされない からです。
- 独立同分布 に従う 可積分 な 確率変数 の 無限列 $\boldsymbol{X_1}$、 $\boldsymbol{X_2}$、… が与えられたとき、その 平均 を $\boldsymbol{μ}$ とおく
従って、上記の 大数の法則 の 定義の 1 は 下記のように言い換える ことができます。
- 母集団の 母平均 $\boldsymbol{μ}$ が計算できる ものとする
なお、期待値を有限な値として計算できない確率分布 の具体例については 後述 します。
可積分の定義 は以下のように、確率変数の期待値 が 有限な値として計算できる ことを表します。
確率変数 $\boldsymbol{X}$ に対して $\boldsymbol{E[|X|] < ∞}$ を満たす状態
なお、Wikipedia の可積分の項目は、用語は同じですが上記の可積分とは異なる分野の異なる意味の用語のようです。
標本平均のとる値の意味
下記は 大数の法則 の 定義 3 の再掲です。
- 標本平均 $\boldsymbol{\bar{X_n}}$ のとる値 が $\boldsymbol{μ}$ の近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
標本平均 $\boldsymbol{\bar{X_n}}$ のとる値 とは 確率変数 $\boldsymbol{\bar{X_n}}$ の実現値 $\boldsymbol{\bar{x_n}}$ のことなので、上記は 下記のように言い換える ことができます。
- $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
従って、大数の法則の定義 は下記のように 言い換える ことができます。
- 母集団の 母平均 $\boldsymbol{μ}$ が計算できる ものとする
- その 母集団 から $\boldsymbol{n}$ 個の要素 を 無作為復元抽出 した 標本 の 標本平均 を $\boldsymbol{\bar{x_n}}$ とする
- $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
大数の法則の定義 3 の意味と定義 3 を表す数式
下記の 大数の法則 の 定義 3 の 意味が良くわからない 人が多いのではないかと思いますので解説します。
- $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
また、上記を下記の式で表すことができる理由 を説明します。
$\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
ε 近傍の意味と定義
上記の 大数の法則 の 定義 3 では 近傍 という用語が使われています。一般用語 としての 近傍 は、何かの 近く(近辺、付近) を意味しますが、そのような 漠然とした表現 では 数学的な証明を行うことはできない ので、近傍 の 数学的な定義 を説明します。
数学の 近傍 には いくつかの種類 がありますが、大数の法則 の 近傍 は下記の 実数 の $\boldsymbol{ε}$ 近傍1 のことを表します。なお、$\boldsymbol{ε}$ はギリシャ文字の小文字で イプシロン と読みます。
実数 $\boldsymbol{a}$ の $\boldsymbol{ε}$ 近傍 は 任意の正の実数 $\boldsymbol{ε}$ に対して 下記の式を満たす実数 $\boldsymbol{b}$ の集合 を表す。
$\boldsymbol{|b - a| < ε}$
上記の 絶対値を外す と以下のようになり、$\boldsymbol{a}$ の 前後 が $\boldsymbol{ε}$ の範囲 の数値を表します。
$\boldsymbol{a - ε < b < a + ε}$
$\boldsymbol{ε}$ 近傍 は 実数や 2 次元平面上の点のような 距離の概念がある空間2上の点 に対して 定義 される 近傍の一種 で、点からの 距離が $\boldsymbol{ε}$ 以内 の 点の集合 を表します。
例えば、(x, y) のような 2 次元の空間上の点に対しても $|b - a| < ε$ という式で $ε$ 近傍が定義され、その場合の $|b - a|$ は 点 $a$ と $b$ の距離3を表します。従って、2 次元の点の $ε$ 近傍は 点 $a$ を中心とする半径が $ε$ の円の内部の点の集合を表します。3 次元以上の場合も同様で、3 次元の点の場合は点 $a$ を中心とする半径が $ε$ の球の内部の点の集合を表します。
なお、距離の概念を持たない空間が含まれる位相空間と呼ばれる空間に対しても近傍を定義することができますが、位相空間は大学の数学で学ぶ複雑な概念である点と、大数の法則の証明には必要がないので説明は省略します。
参考までに Wikipedia の 近傍 の項目のリンクを下記に示します。なお、下記のリンク先の近傍の説明はかなり難しいので意味がわからない場合は無理に理解する必要はないでしょう。
$\boldsymbol{ε}$ 近傍 という 概念 では $\boldsymbol{ε}$ の具体的な値を設定せず、近さを表す $\boldsymbol{ε}$ を 正の任意の実数 という 変数 として定義することで、あらゆる範囲を持つ近傍 を 表す柔軟な概念 として利用することができます。
例えば $\boldsymbol{a = 10}$、$\boldsymbol{ε = 10000}$ の場合の $\boldsymbol{a}$ の $\boldsymbol{ε}$ 近傍は $\boldsymbol{|b - 10| < 10000}$、すなわち $\boldsymbol{-9990 < b < 10010}$ という 大きな範囲 の実数を表します。$\boldsymbol{a = 10}$、$\boldsymbol{ε = 0.000001}$ の場合は $\boldsymbol{|b - 10| < 0.000001}$、すなわち $\boldsymbol{9.999999 < b < 10.000001}$ というの 非常に狭い範囲 の実数を表します。
後述しますが、あらゆる範囲を表すことができる ということは、0 にいくらでも近い範囲を表現することができる ことを意味するので、数列や関数 の 極限値 を $\boldsymbol{ε}$ 近傍 を利用して 厳密に定義 することができます。
近傍から外れる確率の意味
大数の法則 の 定義 3 の中に「近傍から外れる確率」という表現があります。この表現の近傍 は上記で説明した $\boldsymbol{ε}$ 近傍のこと を表していますが、その際に 具体的 な $\boldsymbol{ε}$ の値に言及していない ので、任意の $\boldsymbol{ε}$ に対して成り立つ ということを意味します。
従って 大数の法則 の 定義 3 は以下のように 言い換える ことができます。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
いくらでも小さくできるの意味
大数の法則 の 定義 3 の いくらでも小さくできる は 確率 を表しており、確率の値の範囲 は 0 以上 1 以下 なので 最小値は 0 です。従って 大数の法則 の 定義 3 は以下のように 言い換える ことができます。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる
近傍から外れる確率を表す式
先程説明した $\boldsymbol{ε}$ 近傍 の定義から、$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍に含まれる ことは 下記の式 で表されます。
$\boldsymbol{|\bar{x_n} - μ| < ε}$
$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍から外れる ということは、$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍に含まれない ことを表すので 下記の式 で表されます。
$\boldsymbol{|\bar{x_n} - μ| ≧ ε}$
$\boldsymbol{\bar{x_n}}$ は確率変数 $\boldsymbol{\bar{X_n}}$ の 実現値 なので、$\boldsymbol{|\bar{x_n} - μ|}$ は $\boldsymbol{|\bar{X_n} - μ|}$ で定義 される 確率変数の実現値 です。従って、標本平均 $\boldsymbol{\bar{X_n}}$ の 実現値 $\boldsymbol{\bar{x_n}}$が 平均 $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍 から 外れる確率 は下記の式で表現できます。
$\boldsymbol{P(|\bar{X_n} - μ| ≧ ε)}$
従って 大数の法則 の 定義 3 は以下のように 言い換える ことができます。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{P(|\bar{X_n} - μ| ≧ ε)}$ は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる
なお、Wikipedia の 大数の法則の定義 の式では下記のように 不等号 が $\boldsymbol{≧}$ ではなく、$\boldsymbol{>}$ となっている ようです。詳細は省略しますが、どちらの不等号を使って大数の法則を定義しても問題はない ので本記事では以後は Wikipedia に合わせて 下記の式で表す ことにします。なお、大数の法則の定義の式を上記のように $\boldsymbol{≧}$ を使って表現する場合もある ようです。
$\boldsymbol{P(|\bar{X_n} - μ| > ε)}$
任意の ε に対して成り立つという条件を表す全称記号
任意の(for all)正の実数 $\boldsymbol{ε}$ に対して 成り立つ という 条件 を数学では A をさかさま にした $\boldsymbol{\forall}$ という 全称記号 を用いて表現します。例えば、正の実数 である 任意の $\boldsymbol{ε}$ で成り立つ という 条件 は下記のように記述します。なお、全称記号 は「すべて(任意)の~に対して」(英語では for all)のように 読みます。
$\boldsymbol{\forall ε > 0}$
全称記号による条件 は 式の前 に 直接記述 するか、式の後 に ()で囲って記述 します。下記は、大数の法則 の 定義 3 を 全称記号 を使って 言い換えたもの です。
$\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる、($\boldsymbol{\forall ε > 0}$)
全称記号による条件を先頭に記述する場合は下記のようになります。
$\boldsymbol{\forall ε > 0}$、$\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる
同様の記号 に、条件を満たす値 が 少なくとも一つは存在(exist)する ことを表す、E を逆さま にした $\boldsymbol{\exists}$(存在記号)があります。
数列による大数の法則の定義 3 の言い換え
$\boldsymbol{\bar{x_n}}$ は 標本サイズ を $\boldsymbol{n}$ とすると $\boldsymbol{\bar{x_n} = \frac{1}{n}\sum_{i=1}^n x_i}$ によって計算 されるので、大数の法則 の 定義 3 の中の $\boldsymbol{|\bar{x_n} - μ| > ε}$ となる確率 を表す $\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ は 標本サイズによって決まる確率 です。標本サイズを $\boldsymbol{n}$ とした場合の $\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ を $\boldsymbol{a_n}$ と表記 し、標本サイズの小さい順に並べる と $\boldsymbol{a_1}$、$\boldsymbol{a_2}$、・・・ という 無限個の数列で表現 することができます。
従って、大数の法則 の 定義 3 は下記のように 言い換える ことができます。
- $\boldsymbol{a_n}$ を 標本サイズが $\boldsymbol{n}$ の場合の $\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ とすると下記が成り立つ
$\boldsymbol{a_n}$ は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる、($\boldsymbol{\forall ε > 0}$)
この「$\boldsymbol{a_n}$ は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 0 に近づけることができる」という説明は 下記の式 で表される 数列の極限値 を 大学の数学 で学ぶ $\boldsymbol{ε-N}$ 論法によって定義 したものです。
$\boldsymbol{\lim_{n \to \infty} a_n = 0}$
従って上記の式の $\boldsymbol{a_n}$ を $\boldsymbol{P(|\bar{X_n} - μ| > ε)}$ で置き換えると 大数の法則 の 定義 3 は 下記の式で表現 することができます。
$\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
このような性質を、確率変数 $\boldsymbol{\bar{X_n}}$ が $\boldsymbol{μ}$ に 確率収束 すると呼びます。
ε-N 論法による数列の極限値の定義
$\boldsymbol{ε-N}$ 論法 による 極限値の定義 について 理解しなくても大数の法則を説明 することはできますが、せっかくなのでその説明を行うことにします。高校の数学では習わない 少し難しい概念なので 意味がわからない方は飛ばしても構わない でしょう.
高校の数学 では、無限数列 $\boldsymbol{a_n}$ が $\boldsymbol{n}$ を大きくする と 有限な値 である $\boldsymbol{b}$ に限りなく近づく ときに $\boldsymbol{b}$ のことを $\boldsymbol{a_n}$ の 極限、または 極限値 と呼ぶと 定義 し、下記の式 で 極限値を表現 します。
$\boldsymbol{\lim_{n \to \infty} a_n = b}$
例えば $\boldsymbol{a_n = \frac{1}{n}}$ の場合は $\boldsymbol{n}$ を大きくする と $\boldsymbol{\frac{1}{n}}$ は 限りなく 0 に近づく ので 極限値は 0 で、下記の式で表現します。
$\boldsymbol{\lim_{n \to \infty} a_n = 0}$
この定義では、限りなく近づく という 扱いが難しい無限を意味する用語 が使われているので、大学の数学 では 数列の極限値 を下記の より厳密 な $\boldsymbol{ε-N}$ 論法 で 定義 します。なお、論法の名前の由来 は $\boldsymbol{ε}$ と $\boldsymbol{N}$ という記号 を用いていることです。
任意の正の実数 $\boldsymbol{ε}$ に対して 下記の性質 が成り立つ。
- $\boldsymbol{|a_N - b| < ε}$ となる 自然数 $\boldsymbol{N}$ が存在 する
- 任意 の $\boldsymbol{n ≧ N}$ を満たす 自然数 $\boldsymbol{n}$ に対して $\boldsymbol{|a_n - b| < ε}$ が成り立つ
上記の $\boldsymbol{|a_N - b| < ε}$ と $\boldsymbol{|a_n - b| < ε}$ は、$\boldsymbol{a_N}$ と $\boldsymbol{a_n}$ が $\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 であることを表します。従って、上記は下記のように $\boldsymbol{ε}$ 近傍 を用いた表現に 言い換える ことができます。
任意の正の実数 $\boldsymbol{ε}$ に対して 下記の性質 が成り立つ。
- $\boldsymbol{a_N}$ が $\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 となる 自然数 $\boldsymbol{N}$ が存在 する
- 任意 の $\boldsymbol{n ≧ N}$ を満たす 自然数 $\boldsymbol{n}$ に対して $\boldsymbol{a_n}$ は $\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 となる
また、上記を 言葉で説明 すると、下記のようになります。
どれだけ小さい正の実数 $\boldsymbol{ε}$ を設定しても $\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 となる $\boldsymbol{a_N}$ が存在 し、$\boldsymbol{a_N}$ 以降 の すべての数列の値 も $\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 となる。
$\boldsymbol{ε}$ は いくらでも 0 に近い値を取る ことができますが 0 ではない有限な値 です。同様に $\boldsymbol{N}$ も いくらでも大きな値を取る ことができますが 有限な値 です。このように $\boldsymbol{ε-N}$ 論法 では 有限な値 を用いて 極限値を定義 するという点が 高校での極限の定義と異なります。また、詳細は省略しますが そのように極限値を定義 することで、高校の数学での極限値の定義ではできなかった 極限値の証明 を 厳密に行うことができる ようになります。
また、高校の数学 の 極限の定義 では、数列が特定の値に限りなく近づく際に どのように近づくかについては言及 されていません。一方、$\boldsymbol{ε-N}$ 論法 では ある $\boldsymbol{ε_1}$ に対して $\boldsymbol{|a_N - b| < ε_1}$ を満たす最小の $\boldsymbol{N}$ を $\boldsymbol{N_1}$ とすると、$\boldsymbol{0 < ε_2 < ε_1}$ となる $\boldsymbol{ε_2}$ に対して $\boldsymbol{|a_{N_1} - b| < ε_2}$ が 満たされるとは限りません。そのため、$\boldsymbol{ε_2 < ε_1}$ の場合は $\boldsymbol{N_2 ≧ N_1}$ となります。このことから、$\boldsymbol{ε-N}$ 論法によって定義 された 数列の極限値 は下記のような性質を持ちます。
$\boldsymbol{b}$ の $\boldsymbol{ε}$ 近傍 の $\boldsymbol{ε}$ を小さくする と、$\boldsymbol{ε}$ 近傍 に 属する $\boldsymbol{a_n}$ の最小の $\boldsymbol{n}$ の値 は 単調増加(同じかそれ以上の値になる)する。
若干不正確 になりますが、数学的な用語をなるべく使わずに説明すると以下のようになります。また、このような性質を 収束する と呼びます。
$\boldsymbol{n}$ を大きくするにつれて 数列が 極限値へ向かって単調に近づいていく。
慣れるまで数式の意味がわかりづらいと思いますが、数列の極限値 を表す $\boldsymbol{\lim_{n \to \infty} a_n = b}$ の $\boldsymbol{ε-N}$ 論法による定義 は、全称記号 $\boldsymbol{\forall}$ と 存在記号 $\boldsymbol{\exists}$ を用いた 下記の式 で表されます。
$\boldsymbol{\forall{ε > 0}}$、$\boldsymbol{\exists{N>0}}$、$\boldsymbol{\forall{n ≧ N}}$、$\boldsymbol{|a_n - b| < ε}$
また、上記の式を 読み上げる と以下のようになります。
すべての $\boldsymbol{ε > 0}$ に対してある $\boldsymbol{N>0}$ が存在し、すべての $\boldsymbol{n ≧ N}$ に対して $\boldsymbol{|a_n - b| < ε}$ が成り立つ。
非常に紛らわしい ですが、大数の法則 を表す 下記の式 の $\boldsymbol{ε}$ と $\boldsymbol{P(|\bar{X_n} - μ|> ε)}$ の極限値が 0 になる ことに対する $\boldsymbol{ε-N}$ 論法 で使われる $\boldsymbol{ε}$ とは 別のもの です。
$\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
下記は、上記の式の最後の ($\boldsymbol{\forall ε > 0}$) を除いた 前半の極限値を表す式だけ を $\boldsymbol{ε-N}$ 論法 で定義した式です。
$\boldsymbol{\forall{ε > 0}}$、$\boldsymbol{\exists{N>0}}$、$\boldsymbol{\forall{n ≧ N}}$、$\boldsymbol{|a_n - 0| = |a_n| < ε}$
上記の $\boldsymbol{a_n}$ を $\boldsymbol{P(|\bar{X_n} - μ|> ε)}$ で 置き換える と下記の式になりますが、上記の式の $\boldsymbol{ε}$ と $\boldsymbol{P(|\bar{X_n} - μ|> ε)}$ の中にある $\boldsymbol{ε}$ は同じ記号でも 全く異なる意味を持つ ので、下記の式は間違った式です。また、式の最初と最後に 同じ $\boldsymbol{\forall ε > 0}$ が 2 回出現する ことからも おかしな式である ことがわかります。
$\boldsymbol{\forall{ε > 0}}$、$\boldsymbol{\exists{N>0}}$、$\boldsymbol{\forall{n ≧ N}}$、$\boldsymbol{|P(|\bar{X_n} - μ|> ε)| < ε}$、($\boldsymbol{\forall ε > 0}$)
そのため、最初の式 の $\boldsymbol{ε}$ を $\boldsymbol{α}$ などの 別の記号で置き換えた 下記の式で表す必要があります。
$\boldsymbol{\forall{ε > 0}}$、$\boldsymbol{\exists{N>0}}$、$\boldsymbol{\forall{n ≧ N}}$、$\boldsymbol{|P(|\bar{X_n} - μ|> α)| < ε}$、($\boldsymbol{\forall α > 0}$)
なお、上記の式の $\boldsymbol{α}$ と $\boldsymbol{ε}$ は下記のような意味を持ちます。
- $\boldsymbol{α}$ は 標本平均と母平均の間 の データの誤差 の 許容範囲
- $\boldsymbol{ε}$ は 上記のデータの誤差 が $\boldsymbol{α}$ を超えてしまう確率 が 0 に近づく際 の 許容範囲
このように 大数の法則 は データの誤差 と 確率の誤差 という 2 つの異なる誤差を扱う法則 で、そのうちの データの誤差を固定した場合 の 確率の誤差の極限値が 0 になる ことを表します。
下記の大数の強法則は、大数の弱法則に対して、データの誤差の極限値も 0 になるということ表す法則です。ただし、その証明は大数の弱法則と比べて非常に難解です。
$\boldsymbol{P(\lim_{n \to \infty} \bar{X_n} = μ)= 1}$
下記の式で表される 関数の極限値 は $\boldsymbol{ε-N}$ 論法 と ほぼ同様の考え方 の $\boldsymbol{ε-δ}$ 論法 で定義します。
$\boldsymbol{\lim_{x \to a}f(x) = b}$
参考までに 極限 と $\boldsymbol{ε-δ}$ 論法 の Wikipedia の項目を下記に示します。
大数の法則の定義 3 の意味
大数の法則 を 表す式 は大数の法則を 証明する際に必要 ですが、意味がわかりづらい ので改めて 言葉で説明 することにします。
下記は式に直す前の 大数の法則 の 定義 3 です。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍 から 外れる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも小さくできる
上記の「$\boldsymbol{ε}$ 近傍を外れる確率 が いくらでも小さくできる」ということは、逆に言えば $\boldsymbol{ε}$ 近傍を外れない、すなわち $\boldsymbol{ε}$ 近傍に含まれる確率 を いくらでも大きくできる ということを表します。従って、大数の法則 の 定義 3 は下記のように 言い換える ことができます。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍に含まれる確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも大きくできる
$\boldsymbol{ε}$ 近傍 の定義から、 $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ の $\boldsymbol{ε}$ 近傍に含まれる ことは 下記の式 で表されます。
$\boldsymbol{μ - ε < \bar{x_n} < μ + ε}$
従って、大数の法則 の 定義 3 は下記のように 言い換える ことができます。
-
任意の正の実数 $\boldsymbol{ε}$ に対して 下記が成り立つ
$\boldsymbol{μ - ε < \bar{x_n} < μ + ε}$ となる 確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも大きくできる
上記は 任意の正の実数 $\boldsymbol{ε}$ に対して成り立つので、どのような小さな正の実数 $\boldsymbol{ε}$ に対しても 成り立ちます。また、確率の最大値は 1 なので、上記は下記のように 言い換える ことができます。
-
どのような小さな正の実数 $\boldsymbol{ε}$ に対しても 下記が成り立つ
$\boldsymbol{μ - ε < \bar{x_n} < μ + ε}$ となる 確率 は、十分大きな $\boldsymbol{n}$ を取れば、いくらでも 1 に近くできる
上記をさらに 言い換える と下記のようになります。
- 十分大きな $\boldsymbol{n}$ を取れば、どのような小さな正の実数 $\boldsymbol{ε}$ に対しても $\boldsymbol{μ - ε < \bar{x_n} < μ + ε}$ となる 確率 を いくらでも 1 に近くできる
$\boldsymbol{ε}$ は $\boldsymbol{μ}$ からのずれ を表す値です。従って、$\boldsymbol{ε}$ を小さくした場合 に $\boldsymbol{μ - ε < \bar{x_n} < μ + ε}$ となる 確率 を いくらでも 1 に近くできる ということは、$\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ に近くなる確率 を ほぼ 100 % に限りなく高めることができる ということを意味します。
従って、大数の法則 の 定義 3 は下記のように 言い換える ことができます。
十分大きな $\boldsymbol{n}$ を取れば、標本平均 $\boldsymbol{\bar{x_n}}$ が $\boldsymbol{μ}$ に近くなる確率 を ほぼ 100 % に限りなく高めることができる。
これは先ほど説明した下記の 一般的な大数の法則の説明 を表します。
試行回数($\boldsymbol{n}$)を増やせば増やすほど、その 結果の平均(標本平均$\boldsymbol{\bar{x_n}}$) は 理論上の平均(母平均$\boldsymbol{μ}$)に近づいていく。
高校の極限値の定義には「試行回数($n$)を増やせば増やすほど」を保証する性質はありませんが、 $ε-N$ 論法による極限値の定義では先ほど説明したように数列が極限値に向かって単調に近づいていく(収束していく)ことが定義されているので、「試行回数($n$)を増やせば増やすほど」という性質が保証されます。
大数の法則の証明方法
下記は Wikipedia の 大数の法則の再掲 です。ただし、定義 3 は 先ほど説明した式で置き換えました。
- 独立同分布 に従う 可積分 な 確率変数 の 無限列 $\boldsymbol{X_1}$、 $\boldsymbol{X_2}$、… が与えられたとき、その 平均 を $\boldsymbol{μ}$ とおく
-
標本サイズ が $\boldsymbol{n ≧ 1}$ の 標本平均 を表す 確率変数 $\boldsymbol{\bar{X_n}}$ を下記の式で定義する
$\boldsymbol{\bar{X_n} = \frac{1}{n}\sum_{i=1}^n X_i}$ - $\boldsymbol{\lim_{n \to \infty} P(|\bar{X_n} - μ|> ε) = 0}$、($\boldsymbol{\forall ε > 0}$)
従って、大数の法則 は 上記の定義 1、2 の条件 に対して、定義 3 の式が成り立つことを示す ことで 証明する ことができます。なお、具体的な証明方法については次回の記事で説明します。
期待値を持たない確率分布
大数の法則 は 試行回数を重ねる と 平均 が 確率分布の期待値(平均)に近づいていく というものなので、当然ですが 確率分布の期待値が有限でない 場合は 成り立ちません。
今回の記事の最初で、有限な期待値を持たない確率分布が存在する ことを説明しましたので、具体例を挙げながら そのような確率分布が大数の法則を満たさない ことを示します。
有限な期待値を持たない確率分布の具体例
下記の 確率質量関数 の 確率分布 に従う 確率変数 $\boldsymbol{X}$ を考えます。ただし、$\boldsymbol{n}$ は自然数であるものとします。
- $\boldsymbol{P(X=2^{n-1}) = (\frac{1}{2})^{n}}$ ($\boldsymbol{n}$ が自然数 の場合)
- $\boldsymbol{P(X=x) = 0}$ ($\boldsymbol{x}$ が $\boldsymbol{2^{n-1}}$ 以外の場合)
下記はこの確率変数の $\boldsymbol{n}$ が 5 まで の 確率分布 を表す表で、確率変数が倍 になると 確率が 1/2 になることがわかります。
| 確率変数 $X$ の実現値 | 1 | 2 | 4 | 8 | 16 | ・・・ |
|---|---|---|---|---|---|---|
| 確率 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | ・・・ |
$\boldsymbol{n}$ は 自然数 なので $\boldsymbol{0 < (\frac{1}{2})^n < 1}$ から $\boldsymbol{0 ≦ P(X=x) ≦ 1}$ を満たします。
また、$\boldsymbol{\sum_{x} P(X=x) = \sum_{i = 1}^{∞} (\frac{1}{2})^i = 1/2 + 1/4 + 1/8 + ・・・ = 1}$ なので、すべての確率変数 $\boldsymbol{X}$ の 実現値を取る確率の合計 が 1 になることから $\boldsymbol{X}$ は 確率変数 です。
上記の式は以前の記事で説明した下記の等比数列の和の公式から計算できます。
$\sum_{i=0}^{n-1}ar^i = a\frac{1 - r^n}{1 - r}$、(ただし、$r ≠ 1$)
$-1 < r < 1$ の場合は $\lim_{n \to \infty}r^n = 0$ なので、無限等比数列の和の場合は下記のようになります。
$\sum_{i=0}^{∞}ar^i = \frac{a}{1 - r}$、(ただし、$-1 < r < 1$)
従って、$a = \frac{1}{2}$、$r = \frac{1}{2}$ の場合は下記ようになります。
$\sum_{i=0}^{∞}\frac{\frac{1}{2}}{1 - \frac{1}{2}} = 1$
下記の式から 確率変数 $\boldsymbol{X}$ の 期待値 $\boldsymbol{E[X]}$ は 無限大に発散する ので、期待値を計算することはできません。
$\boldsymbol{E[X] = \sum_{x} xP(X=x)}$
$\boldsymbol{= \sum_{i = 1}^{∞} 2^{i-1}(\frac{1}{2})^{i}}$
$\boldsymbol{= \sum_{i = 1}^{∞} \frac{1}{2} = \frac{1}{2} × ∞ = ∞}$
この確率分布の意味と由来
この確率分布 は以下のような 賭け事での賞金額 を 確率変数 とした 確率分布 です。
- 表と裏が 1/2 の確率 ででるコインを 表が出るまで投げる
- $\boldsymbol{n}$ 回目 に 表が出た場合 に $\boldsymbol{2^{n-1}}$ の賞金 を受け取ることができる
$\boldsymbol{n}$ 回目 で 表が出る確率 は、$\boldsymbol{n -1}$ 回連続裏が出た後 に 表が出る確率 なので、その確率は下記のようになります。
$\boldsymbol{(\frac{1}{2})^{n-1} × \frac{1}{2} = (\frac{1}{2})^n}$
$\boldsymbol{n}$ 回目で表が出た場合 に受け取ることができる 賞金 は $\boldsymbol{2^{n-1}}$ なので 確率質量関数 は先ほど説明した下記のようになります。
- $\boldsymbol{P(X=2^{n-1}) = (\frac{1}{2})^{n}}$ ($\boldsymbol{n}$ が自然数 の場合)
- $\boldsymbol{P(X=x) = 0}$ ($\boldsymbol{x}$ が $\boldsymbol{2^{n-1}}$ 以外の場合)
一見すると風変わりな この確率分布 は確率論や経済学の歴史において非常に有名な サンクトペテルブルクのパラドックス に出てくる確率分布で、このパラドックスの問い は 以下の通り です。
この賭けの 参加費がいくらまで であれば この賭けに参加すべき であるか。
この賭けの 賞金額の期待値 は先ほど計算したように 無限大 なので、掛け金がいくらであっても参加すべきであると思えるかもしれませんが、先程示した 下記の確率分布の表 からわかるように、1/2 + 1/4 + 1/8 = 7/8 なので、ほとんどの場合の賞金額 は 1、2、4 のような 少額 になります。一方、例えば 10 回目で表が出た場合 は $\boldsymbol{2^{10-1} = 512}$ という 大きな賞金 がもらえますが、その確率 は $\boldsymbol{\frac{1}{2^{10}} = \frac{1}{1024}}$ で極めて低い ため、直観的 には ほとんどもうからないと思える という点が パラドックス になっています。
| 賞金額 | 1 | 2 | 4 | 8 | 16 | ・・・ |
|---|---|---|---|---|---|---|
| 確率 | 1/2 | 1/4 | 1/8 | 1/16 | 1/32 | ・・・ |
このパラドックスの詳細に関する下記の Wikipedia の項目を示しますので、興味がある方はそちらを見て下さい。
この確率分布が大数の法則を満たさないことの実証
この確率分布 は 期待値が無限大 なので、大数の法則を満たしません。そのことを実際に プログラムで検証 してみることにします。
下記はこの 賭け(bet)を 1 回 行った際に得られる 賞金額を計算して返す bet という関数を定義するプログラムです。。
-
4 行目:コインを投げた回数を数える変数を
0で初期化する - 5 行目:表が出るまでコインを投げる処理を行うために無限ループを行う
-
6 行目:これからコインを投げるので投げた回数を表す変数に
1を足す -
7、8 行目:
random.randint(0, 1)で 0 と 1 を等確率で発生させる乱数を計算し、0が発生した場合にコインの表が出たとみなしてbreak文で無限ループを終了する。1が発生した場合は裏が出たとみなして無限ループを続行する -
9 行目:無限ループが終了した時点での
countに表が出た時のコインを投げた回数が代入されているので、賞金額を表す2 ** (count - 1)を返り値として返す
1 import random
2
3 def bet():
4 count = 0
5 while True:
6 count += 1
7 if random.randint(0, 1) == 0:
8 break
9 return 2 ** (count - 1)
行番号のないプログラム
import random
def bet():
count = 0
while True:
count += 1
if random.randint(0, 1) == 0:
break
return 2 ** (count - 1)
下記は、上記の関数で 10 回の賭け を行った 結果を表示 するプログラムです。実行結果から 2 のべき乗の賞金額が毎回得られる こと、1 回で表が出る確率 が 最も高い のでその場合の賞金額である 1 が最も多く得られた ことが確認できます。なお、結果は乱数による確率で決まる ので 1 が最も多くならない場合もあります し、運が良ければ 128 のような 大きな賞金額が得られる場合もあります。
for _ in range(10):
print(bet())
実行結果
4
16
2
1
2
1
1
8
1
1
下記は、上記の関数で 10000 回の賭け を行い、1 ~ 10000 回まで の それぞれの回数まで で得られた 賞金額の平均を計算 して グラフで表示 するプログラムです。
- 4 行目:各回の賞金額の平均(mean)を記録する変数を空の list で初期化する
- 5 行目:賞金額(prize)の合計(total)を記録する変数を 0 で初期化する
- 6 行目:1 万回の繰り返し処理を行う
-
7 行目:
bet()で賭けを行い、返り値をtotalprizeに加算して賞金額の合計を計算する -
8 行目:賞金額の合計を賭けを行った回数を表す
i + 1で割ることで得られた賞金額の平均を計算し、list の要素に追加する。なお、iは 0 から数えるので平均を計算する際にはi + 1で割り算する必要がある点に注意すること - 10 ~ 12 行目:各回までの平均を表す list を折れ線グラフで描画する
1 import matplotlib.pyplot as plt
2 import japanize_matplotlib
3
4 mean = []
5 totalprize = 0
6 for i in range(10000):
7 totalprize += bet()
8 mean.append(totalprize / (i + 1))
9
10 plt.plot(mean)
11 plt.xlabel("賭けの回数")
12 plt.ylabel("賞金の平均")
行番号のないプログラム
import matplotlib.pyplot as plt
import japanize_matplotlib
mean = []
totalprize = 0
for i in range(10000):
totalprize += bet()
mean.append(totalprize / (i + 1))
plt.plot(mean)
plt.xlabel("賭けの回数")
plt.ylabel("賞金の平均")
実行結果
実行結果のグラフから、賞金額の平均 が 時々大きく変動する ため、平均 が 特定の値に向かって収束しない ことが確認できます。なお、平均が大きく変動 するのは、表が出た時の回数が大きく、高額な賞金が得られた場合 を表します。
下記は 同じプログラムを 2 回実行 した場合のグラフで、3 つのグラフが 全く異なるグラフになる ことからも 平均 が 特定の値に向かって収束しない ことが確認できます。
他の期待値が計算できない確率変数
期待値が計算できない確率分布 の他の例としては、コーシー分布 が有名です。参考までに コーシー分布の Wikipedia の項目を下記に示します。
bet の改良
以下の説明はおまけです。
先程のプログラムはあまり 効率が良くない ため、より効率の良いプログラム を紹介します。例えば、実行結果は示しませんが、先程のプログラムで 1000 万回 の賭けを行いグラフを描画すると、筆者のパソコンでは 約 16 秒 ほど時間がかかりました。
先程定義した bet が行う処理は、賞金を計算する際に コインの表を表す 0 が計算されるまで乱数を発生させる という繰り返し処理を行っているので、0 がなかなか計算されない場合 は 何回も乱数を発生させる必要が生じる という点で 効率が悪い という問題があります。
そこで、乱数を 1 回だけ発生 させて 賞金額を計算する プログラムに 改良 することにします。具体的には下記の手順で賞金を計算します。
- それぞれの賞金額 に対して、その賞金額に対応する確率 と 同じ範囲の数値 を 0 以上 1 未満 の数値から 別々に割り当てる
- 0 以上 1 未満 の 一様乱数を発生 させ、発生した 乱数の値に対応する賞金額を計算 する
それぞれの 賞金額 に 割り当てる数値の範囲 について少し考えてみて下さい。
賞金に対する数値の範囲の割り当て方法
どのように割り当てても構わない のですが、下記のように割り当てる ことで 乱数の値から賞金額を比較的簡単に計算 することができます。
$\boldsymbol{2^{n-1}}$ の賞金額 に 対応する確率 は $\boldsymbol{(\frac{1}{2})^n}$ です。そこで、$\boldsymbol{2^{0}}$、$\boldsymbol{2^{1}}$、$\boldsymbol{2^{2}}$、・・・ の賞金額に 対応 する確率である $\boldsymbol{(\frac{1}{2})^1}$、$\boldsymbol{(\frac{1}{2})^2}$、$\boldsymbol{(\frac{1}{2})^3}$、・・・を 1 から順 に対応させます。なお、0 から対応させることもできますが、1 から対応 させたほうが 乱数の値から賞金額の計算が簡単 になります。
下記は $\boldsymbol{2^{0}}$、$\boldsymbol{2^{1}}$、$\boldsymbol{2^{2}}$ に割り当てた 数値の範囲 を表す表です。
| 賞金額 | 確率 | 割り当てた数値の範囲 |
|---|---|---|
| $2^0$ | $(\frac{1}{2})^1$ | $1 - (\frac{1}{2})^1$ 以上 $1$ 未満 |
| $2^1$ | $(\frac{1}{2})^2$ | $1 - (\frac{1}{2})^1 - (\frac{1}{2})^2$ 以上 $1 - (\frac{1}{2})^1$ 未満 |
| $2^2$ | $(\frac{1}{2})^2$ | $1 - (\frac{1}{2})^1 - (\frac{1}{2})^2- (\frac{1}{2})^3$ 以上 $1 - (\frac{1}{2})^1- (\frac{1}{2})^2$ 未満 |
上記の表からわかるように、$\boldsymbol{2^{n-1}}$ の賞金額 に割り当てる 数値の範囲 の 最小値 は 1 から それまでの賞金額に対応する 確率の合計を引き算 した値になるので 下記の式で計算 することができ、その値が $\boldsymbol{(\frac{1}{2})^n}$ になることがわかります。
$\boldsymbol{1 - \sum_{i=1}^{n} (\frac{1}{2})^i}$
$\boldsymbol{=1 - \sum_{i=1}^{n} \frac{1}{2}(\frac{1}{2})^{i-1}}$
$\boldsymbol{=1 - \sum_{i=0}^{n-1} \frac{1}{2}(\frac{1}{2})^{i}}$
$\boldsymbol{=1 - \frac{1}{2}\frac{1-(\frac{1}{2})^n}{1-\frac{1}{2}}}$
$\boldsymbol{=1 - \frac{1}{2}\frac{1-(\frac{1}{2})^n}{\frac{1}{2}}}$
$\boldsymbol{=1 - (1-(\frac{1}{2})^n)}$
$\boldsymbol{=(\frac{1}{2})^n}$
$\boldsymbol{n> 1}$ の場合の $\boldsymbol{2^{n-1}}$ の賞金額 に割り当てる 数値の範囲 の 最大値 は、一つ前の $\boldsymbol{2^{n-2}}$ に割り当てる 数値の範囲 の 最小値 なので $\boldsymbol{(\frac{1}{2})^{n-1}}$ となります。
$\boldsymbol{n = 1}$ の場合の $\boldsymbol{2^{n-1}}$ の賞金額 に割り当てる 数値の範囲 の 最大値 は 1 ですが、$\boldsymbol{(\frac{1}{2})^{1-1} = (\frac{1}{2})^{0} = 1}$ なので、この場合も $\boldsymbol{(\frac{1}{2})^{n-1}}$ という式で計算 できます。
従って、$\boldsymbol{2^{n-1}}$ の賞金額 に割り当てる 数値の範囲 は下記のようになります。
$\boldsymbol{(\frac{1}{2})^{n}}$ 以上 $\boldsymbol{(\frac{1}{2})^{n-1}}$ 未満
乱数から賞金額を計算するアルゴリズム
上記のように賞金額に対する数値の範囲を割り当てることで、0 以上 1 未満の一様乱数 から下記のアルゴリズムで 賞金額を計算 することができます。
- 乱数に対して 2 を底とする対数 を計算する
- 小数点以下 の値を 切り捨てて整数 にする
- -1 を乗算 して 正の値 にした値を $\boldsymbol{n}$ とする
- $\boldsymbol{2^{n-1}}$ を計算する
上記のアルゴリズムが正しい ことを示します。
2 を底とする対数 は、数値を何乗したら 2 になるか を計算します。$\boldsymbol{(\frac{1}{2})^n = 2^{-n}}$ なので、$\boldsymbol{\log_{2} (\frac{1}{2})^n = \log_{2} 2^{-n} = -n}$ になります。対数は単調増加 するので $\boldsymbol{2^{n-1}}$ の賞金額 に割り当てる 数値の範囲 に対して 2 の対数を計算 すると下記のようになります。
$\boldsymbol{log_{2}(\frac{1}{2})^{n}= -n} $ 以上 $\boldsymbol{log_{2}(\frac{1}{2})^{n-1} = -(n-1)}$ 未満
つまり、下記のようになります。
$\boldsymbol{-n} $ 以上 $\boldsymbol{-(n-1)}$ 未満
$\boldsymbol{n}$ は整数 なので 小数点以下を切り捨てる と $\boldsymbol{-n}$ となり、それに -1 を乗算 すると $\boldsymbol{n}$ になり、その $\boldsymbol{n}$ から $\boldsymbol{2^{n-1}}$ を計算 すると 賞金額 になります。
下記は、$\boldsymbol{n}$ が 1 ~ 3 まで の $\boldsymbol{2^{n-1}}$ の賞金額 に対して 割り当てられる数値の範囲 と、その範囲に対して 上記のアルゴリズムで計算 を行う表で、賞金額が正しく計算される ことが確認できます。
| 賞金額 | $\boldsymbol{2^0}$ | $\boldsymbol{2^1}$ | $\boldsymbol{2^2}$ |
|---|---|---|---|
| 割り当てた数値の範囲 | $2^{-1}$ 以上 $2^0$ 未満 | $2^{-2}$ 以上 $2^{-1}$ 未満 | $2^{-3}$ 以上 $2^{-2}$ 未満 |
| 2 を底とする対数 | -1 以上 0 未満 | -2 以上 -1 未満 | -3 以上 -2 未満 |
| 小数点以下を削除 | -1 | -2 | -3 |
| -1 を乗算 | 1 | 2 | 3 |
| 2 の $\boldsymbol{n-1}$ 乗を計算 | $\boldsymbol{2^0}$ | $\boldsymbol{2^1}$ | $\boldsymbol{2^2}$ |
bet2 の定義
0 以上 1 未満 の 一様乱数 は random モジュールの random という関数で発生させることができます。
2 を底とする対数 と数値の 小数点以下の切り捨て は math モジュールの log2 と floor という関数で計算することができます。
従って、Python のプログラムで 賭けの賞金 は下記のアルゴリズムで 1 回の乱数を発生させるだけ で計算することができます。
-
random.randomで 0 以上 1 未満の一様乱数を発生させる -
math.log2で乱数に対して 2 を底とする対数を計算する -
math.floorで小数点以下の値を切り捨てて整数にする - -1 を乗算して正の値にする
- 2 の「その値 - 1」のべき乗を計算する
下記はそのような計算を行う bet2 を定義 するプログラムです。なお、下記のプログラムでは 1 つの式で上記の 5 つの計算をまとめて 行っていますが、わかりづらいと思った方は上記の 1 つ 1 つの手順の計算結果を変数に代入して計算を行うと良いでしょう。
1 import math
2
3 def bet2():
4 return 2 ** (-(math.floor(math.log2(random.random()))) - 1)
行番号のないプログラム
import math
def bet2():
return 2 ** (-(math.floor(math.log2(random.random()))) - 1)
下記は bet2() で 10 回の賭けの賞金額を計算 して表示するプログラムです。実行結果から bet の場合と同様の結果 が表示されることが確認できました。
for _ in range(10):
print(bet2())
実行結果
1
2
1
2
8
2
1
2
1
1
下記は bet2 で先程の bet と同様のグラフを描画 するプログラムで、実行結果から bet と同様の収束しないグラフが描画される ことが確認できました。
mean = []
totalprize = 0
for i in range(10000):
totalprize += bet2()
mean.append(totalprize / (i + 1))
plt.plot(mean)
plt.xlabel("賭けの回数")
plt.ylabel("賞金の平均")
実行結果
下記は bet と bet2 の 処理時間を計測 するプログラムです。実行結果から bet2 のほうが 処理速度が約 5 倍になる ことが確認できました。
%timeit bet()
%timeit bet2()
実行結果
1.09 μs ± 2.41 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
201 ns ± 1.58 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
random.random、math.log2、math.floor の詳細については下記のリンク先を参照して下さい。
Python の float 型のデータは 0 に近い数値の表現の精度に限界があるため、上記のアルゴリズムでは表が 1075 回以降に出た時の賞金額が計算されることはありません。そのことは、下記の $2^{-1075}$ の計算結果が 0 になることから確認できます。
print(2 ** -1074)
print(2 ** -1075)
実行結果
5e-324
0.0
ただし、表が 1075 回目以降にはじめて出る確率は実質的に 0 と考えても良いので、bet2 で賞金額を計算しても大きな問題はないでしょう。
numpy を利用した改良
numpy を利用 することで上記のアルゴリズムで 複数の賞金額をまとめて高速に計算 することができます。下記は必要な numpy の関数と簡単な説明です。なお、関数名はその関数の numpy のドキュメントへのリンクとなっています。
| 関数 | 説明 |
|---|---|
np.random.uniform |
一様乱数を計算する |
np.log2 |
2 を底とする対数を計算する |
np.floor |
小数点以下の切り捨てを計算する |
np.pow |
べき乗を計算する |
np.cumsum |
ndarray の累積和を計算する |
np.arange |
等間隔で増減する要素を持つ ndarray を計算する |
下記は、仮引数 size に代入された 個数の賞金額 を計算し、それらを要素として持つ 1 次元の ndarray を返す bet3 を定義 するプログラムです。
np.random.uniform(size=size) で size 個 の 0 以上 1 未満の 一様乱数を要素として持つ 1 次元の ndarray を計算 し、先程のアルゴリズムで まとめて賞金額を計算 しています。
1 import numpy as np
2
3 def bet3(size):
4 return np.pow(2, -np.floor(np.log2(np.random.uniform(size=size))) - 1)
行番号のないプログラム
import numpy as np
def bet3(size):
return np.pow(2, -np.floor(np.log2(np.random.uniform(size=size))) - 1)
下記は bet3 で 10 回の賭けの賞金額 をまとめて計算するプログラムです。実行結果から bet と同様の性質 を持つ 10 個の賞金額を要素として持つ 1 次元の ndarray が計算 されていることが確認できます。
print(bet3(10))
実行結果
[ 8. 1. 64. 2. 1. 8. 2. 1. 1. 16.]
先程は 賞金額の平均の計算 を行うために、賭けを行うたび に 賞金額をそれまでの合計に加算 し、それに対して 賭けの回数を割り算 するという処理を行っていました。numpy には、ndarray の要素 の 先頭からインデックス番までの合計 を表す 累積和(cumulative sum)を要素として持つ ndarray を計算する np.cumsum という関数が定義されているので、それを利用することで 各回の賞金額の合計を簡単に計算 することができます。
下記は np.cumsum の例で、[1, 2, 3, 4, 5] を 先頭から合計 した [1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5] = [1, 3, 6, 10, 15] が 正しく計算されることが確認 できます。
print(np.cumsum([1, 2, 3, 4, 5]))
実行結果
[ 1 3 6 10 15]
各回までの賞金額の平均を計算 するためには、np.cumsum で計算した 累積和 を 先頭の要素から順番 に 1、2、3、・・・のように コインを投げた回数 を表す 1 ずつ増えていく値 が要素に代入された 1 次元の ndarray で割り算 を行います。そのような ndarry は np.arange を利用して作成 することができます。np.arange の 仮引数 は 組み込み関数 range と同様 ですが、整数以外の値を要素として持つ ndarray を計算できる 点が異なります。
下記は bet3 を上記で説明した方法で 各回までの賞金額の平均を計算してグラフを描画 するように修正したプログラムです。
def bet3(size):
prize = np.pow(2, -np.floor(np.log2(np.random.uniform(size=size))) - 1)
mean = np.cumsum(prize) / np.arange(1, size + 1)
plt.plot(mean)
plt.xlabel("賭けの回数")
plt.ylabel("賞金の平均")
下記は bet3 で 1000 万回 の賭けを行った際の 各回の賞金額の平均を計算してグラフを描画 するプログラムです。実行結果から、1000 万回 でも 期待値が収束する様子がない ことが確認できます。また、筆者のパソコンでは下記の処理を 約 2 秒 で行ったので、numpy を利用 することで処理速度が先程の約 16 秒の 約 8 倍 になることが確認できました。
bet3(10000000)
実行結果
今回の記事のまとめ
今回の記事では大数の法則の数学的な定義とその解説を行いました。また、有限な期待値を持たない確率分布が大数の法則に従わないことを具体例を挙げて示しました。
本記事で入力したプログラム
| リンク | 説明 |
|---|---|
| marubatsu.ipynb | 本記事で入力して実行した JupyterLab のファイル |
次回の記事
近日公開予定です

