復元抽出法 2018/05/16

復元抽出で任意データが少なくとも1回選ばれる確率を求める.


復元抽出はブートストラップ法等で用いられる, サンプリング法で, N個のデータの集合からサンプルしたデータを戻し, N回抽出(サンプリング)する手法である. 復元抽出において, 任意のデータが少なくとも1回選ばれる確率は,

p' = 1 - (1 - 1/N)N   で表される. ここで 1 - 1/N は1回の抽出であるデータが抽出されない確率を,
           そのN乗はN回の抽出であるデータが1度も抽出されない確率を示している.
           右辺の第2項がネイピア数の定義式と似ている. Nが ∞ の場合,

  ≈ 1 - e-1 = 0.632  となる.

上記はサンプル数Nを ∞ と仮定した場合である. 以下にサンプル数に依る上式の妥当性を確認する例を示す.

#! /usr/bin/python3
import numpy as np

def sampling_with_replacement(sample_num):
  sample_1 = []
  for i in range(1, sample_num):
    sample_1.append(i)
  sample_1_np = np.array(sample_1)
  sample_random_1_np = np.random.choice(sample_1_np, sample_num, replace=True)
  print(str(np.unique(np.sort(sample_random_1_np)).shape[0]/sample_num*100) + "%")

上記のプログラムをN="100", "1,000", "10,000", "100,000", "1,000,000"に対してそれぞれ3回ずつ実行した.

     sampling_with_replacement(100)      -> 63.0%, 71.0%, 65.0%
     sampling_with_replacement(1000)     -> 63.5%, 62.7%, 61.4%
     sampling_with_replacement(10000)    -> 63.15%, 63.34%, 62.67%
     sampling_with_replacement(100000)   -> 63.13%, 63.21%, 63.26%
     sampling_with_replacement(1000000)  -> 63.22%, 63.19%, 63.18%
     sampling_with_replacement(10000000) -> 63.21%, 63.22%, 63.22%

 63.2%とかに収束しているので, いい感じじゃね?