コンピュータサイエンス系勉強ノート

計算機科学に限らず日々学んだことを色々まとめていきます

大数の法則を確かめてみる(Python)

ご存知の方も多いと思いますが確率統計の分野で大数の法則というのがあります.大数の法則とは簡単に言えば,ある試行をN回繰り返して X_1, X_2,...X_Nのような確率変数が手に入ったとすると,

 Z_N = \frac{X_1 + X_2 + ... + X_N}{N} ・・・(1)

(1式)で求めた確率変数の平均が期待値に収束するというものです.

平均値と期待値の違い

平均値と期待値は別物で,平均値は確率的に揺らぐ値ですが期待値は全ての確率を考慮して重みづけされた揺らがない値です.

この大数の法則は揺らぐ値である平均値が無限回の試行で揺らがない値に収束すると言っています.どういうことなの・・

大数の法則を確かめる

よく分からないのでプログラムを組んで大数の法則を実際に確かめてみました.今回は6面のサイコロを複数回投げた場合を考えてみます.各面が出る確率は1/6で期待値は3.5です.サイコロを何回も投げて出た値の平均が3.5に収束していれば大数の法則が確かめられます.ソースコードは以下の通り.下手糞なコードですいません..

#encoding:utf-8
import random
import matplotlib.pyplot as plt
import numpy as np

#サイコロの期待値
def expected_value():
    prob = 1 / 6.0
    return sum([i * prob for i in range(1, 7)])

#サイコロを複数回振る
def LawOfLargeNumbers():
    iter = np.linspace(1, 5000, dtype=np.int)
    for i in range(10):
        values = []
        for j in iter:
            sum = 0
            for k in range(0, j):
                sum += random.randint(1, 6)
            values.append(sum / float(j))
        plt.plot(iter, values)
    plt.show()

def main():
    print(expected_value())
    LawOfLargeNumbers()

main()

f:id:clientver2:20151110143924p:plain

横軸が試行回数,縦軸が平均値です.10回試して10回とも確かに3.5付近に収束しています.大数の法則は本当の様です.

大数の法則の理屈

独立な試行をN回行って平均をとると分散が1/Nになるため,無限回の試行を行うと分散が0になり平均値が全く揺らがなくなります.即ち期待値に一致します.これを式で書くと,

 V[Z_N] = V[\frac{X_1 + X_2 + ... + X_N}{N}] = \frac{V[X_1 + X_2 + ... + X_N]}{N^2} = \frac{NV[Z_N]}{N^2} = \frac{V[Z_N]}{N}

ということだそうです.確かに分散が1/Nになることが分かります.