分布に従う乱数の作り方
一様分布に従う確率変数 は、多くのプログラミング言語で容易に表現できる。たとえばPythonならば、random
モジュールの random.random()
を用いると 上の一様乱数を得ることができる。
つまり、確率変数を とするとき、 に対して
とかくことができる。ここに、集合 に対して は の定義関数(特性関数)である:
実は、 は不連続点の集合が高々可算なので、 可積分である。
ここで、ある分布の分布関数を とする。たとえば、正規分布 の確率密度関数は で与えられるから、その分布関数 は、
で表される。これは初等関数で表現できないことが知られている。
いま、 を狭義単調増加であると仮定すると、逆関数 が存在して も狭義単調増加であり、 であるから、 が成立つ。なお、 は分布関数なので単調増加、つまり単調非減少ではある。しかし、狭義単調増加でない場合には、一般に逆関数が存在しないので、この「 が狭義単調増加」という仮定は必要である(実は、この仮定がなくても、少し工夫すれば「逆関数」に相当する関数を定められるのだが、本稿では省略する)。
さて、このもとで、 を計算してみる。なお、この の中にある は すなわち を略した記号である(つまり、「関数 実数値」の不等式が に与えられているのではない):
ここで、 だから、この積分はかなり簡明になる:
したがって、 が成立つ。これは、確率変数 が、分布関数が で表される分布に従うことを示している。なお、ここでは「分布関数と分布が1対1に対応する」という定理を用いており、この事実から、分布関数と分布は同一視されることが多い。つまり、赤字の部分は、数式では
とかける。すなわち、一様乱数 を で歪めた は、分布 に従う。
ただし、この方法の難点は、たとえば正規分布であれば、複雑な分布関数の逆関数が必要な点である。
例
Pythonを用いて、正規分布 に従う乱数を生成しよう。なお、特殊な記法やライブラリを用いないので、大抵のプログラミング言語で同様のプログラムを書くことができると思う。
先に述べた通り、分布関数は
であるが、これの逆関数を得るのは明らかに面倒そうで、特殊なライブラリを用いる必要があったりする。たとえばPythonでは scipy.stats
の norm.ppf
関数がこれにあたるが、個人的に手元の環境で pip
が正常に動かないので、scipy
がインストールできずに詰まった。直そうとは思うのだが、沼に嵌りそうで、比較的忙しくPCを多用するいま、環境を無闇に変えたくなくて、あまりやりたくない。こういうことが gcc
についても前にあったのだが、直そうと思って色んなところをいじくり回していたら gcc
が #include <stdio.h>
を認識できなくなってしまって、それ以降ちょっとトラウマである。
話が逸れた。統計に強いPythonですらこれなのだから、他のプログラミング言語ではそもそも提供されているかも怪しい。いちいち探すのも面倒だから、普遍的な実装を一つ知っておいて、それで代用できるようになっておけばいい。
さて、その問題である逆関数であるが、数値解析、俗に言うNewton法(Newton-Raphson法)を用いる。こう書くとものすごく難しそうだが、その理論はさておいて実装は軽い:
def nr(f, y, df, x0, e): x = x0 while (abs(f(x) - y) >= e): x = x - (f(x) - y) / df(x) return x
この関数は、簡単に言うと の根 の近似解を求める。適当な初期値 から始めて、第 近似値を の における接線の 切片で与える:
を に近い正値とし、この第 近似値 が となった場合に近似を打ち切る、といった手法である。
ところで、このように、一律に閾値を定めて近似精度の尺度とするのはよくあることなのだが、実はあまりよくないことが知られている。 によっては、 だからといって が に近いとは限らないからである。たとえば が 軸付近で横這いだった場合を考えるとよい。しかし、今回は簡単のためにこの方法を採る。
また、分布関数
は、誤差補関数 を用いて とかける。誤差関数や誤差補関数は多くの言語で市民権を得ているように思う。また は、積分の微分だから簡単で、
となる。以上が分かれば、プログラムは次のようにかける:
# coding: utf-8 import math from random import random import functools def nr(f, y, df, x0, e): x = x0 while (abs(f(x) - y) >= e): x = x - (f(x) - y) / df(x) return x def f(e, v, x): return math.erfc(-(x-e) / ((2*v)**(1/2))) / 2 def df(e, v, x): return math.exp(-(x-e)**2 / (2*v)) / ((2*math.pi*v)**(1/2)) def main(): M = int(input("size:\t")) mean = float(input("mean:\t")) var = float(input("var:\t")) g = functools.partial(f, mean, var); dg = functools.partial(df, mean, var); print("Now sampling...") sample = [nr(g, random(), dg, mean, 10**(-5)) for _ in range(M)] exp = sum(sample) / M var = sum([(x - exp)**2 for x in sample]) / M print("Exp:\t", exp) print("Var:\t", var) if __name__ == '__main__': main()
functools.partial
というのを使っているが、これは多変数関数に特定の引数を指定した、新しい関数を作成するへルパ(helper)関数である。たとえば、 に のみを代入すると、 に関する関数 ができる。この関数 を表現するのが functools.partial(f, a)
である。これは便法のためであり、使わなくとも同等のコードは作れる。
実行結果は次の通り:
$ python3 nr.py size: 10000 mean: 1 var: 25 Now sampling... Exp: 0.9657192785266343 Var: 24.33909416336915
指定した平均および分散を有するように、ランダムな数を生成できていることが分かる。
加比の理の条件
加比の理を、
について, かつ ならば が成立つ
とする人がいますが、例えば だから となるので誤りです。
いま、
(*)
が成立するので、
(**)
であることから、
① なら(このときは )、(*)から であるので (**)の右辺が成立して○。
② なら(このときは )、同様に考えて○。
③ なら、 のときは○で、 のときは×。
④ なら、 のときは×で、 のときは○。
また、同様にして、
(***)
であることから、
① なら(このときは )、○。
② なら(このときは )、○。
③ なら、 のときは×で、 のときは○。
④ なら、 のときは○で、 のときは×。
以上から、(**)かつ(***)が成立つための十分条件として、「 または 」 であればよいので、加比の理は、
について, かつ かつ ならば が成立つ
とかけます。
包除の定理
〔参考文献:Williram Feller(河田龍夫ら訳)『確率論とその応用Ⅰ(上巻)』紀伊国屋書店, 2001.〕
(離散)標本集合を とし、その部分集合である 個の事象 を考える。「ちょうど 個の事象のみが起こる」という事象 の起こる確率は、
とおくとき( は 次の置換全体の集合)、
で求めることができる。長い式で少し嫌になる(特にΣで和をとる範囲が面倒そうに思える)のだが、実用の幅が広い定理で(冒頭に示した参考文献で、色々の応用を扱っている)、とても重要だと思ったので、メモする。
証明. 次の式で、指示関数(indicator) という関数:
を定める( は などとも書かれる)。 つまり は、 を入力とし、 ならば を, ならば を返すような関数である。この指示関数を用いると、
と表すことができる。記号の便宜で、
とおくことにしよう。よって となる。以上のことから、示したい式は
と書くことができるので、任意の について、
を示すことができれば証明が終わる(もはやこれは確率論というよりも集合論であることに注意されたい。この定理の本質はこの式に他ならない。 なお、例えば を有限集合と仮定して、 について で に含まれる元の個数を表すことにすれば、 を で置き換えるだけで上の議論をそのまま使って に関する同様の定理が証明できる)。
の場合。このとき、 はちょうど 個の事象 のみに含まれるのだったから、 となるので、 を示せばよい。 を昇順(小さい順)に並び替えて が一意に定まるので、 のΣのうちで、 なるただひとつの についての項のみが残り、この項の値は である。ゆえに となる。
の場合。 は のうちで、ちょうど 個 の事象に含まれるとする。 ならば となるから成立するので、以下 とする。なお、やはり は成立つので、示すべくは、
である。
は 個の事象に属するから、 について、 のΣのうちで、残る項は 個だけあり(これがポイントである。 という条件が附されているので、 個から 個を選ぶ組合せの総数と同じだけ項が残る)、その値はすべて であるから、 が成立つ。したがって、示す式は、
とかける。ここで が成立するので、
と変形できるが、この右辺の の中は の二項展開だから (右辺) が得られる。これで証明が終わった。終
この定理の効力を見るために、参考文献から一例を借用しよう。
と番号の書かれたカードが二組あって、一方を番号が昇順になるように、横一列に机に並べる。そのすぐ下に、他方をシャッフルして横一列に並べる。結果として机には二列の 枚のカードが並び、上は整列されていて、下は勝手に並んでいる、という状況になる。 ならば、例えば
という風に並んでいるのである。このとき、この二列を縦にみて、上下で数字が一致しているか否かを考えよう。この例では、 のみが一致している。
さて、下列の並び方は全部で 通りある。そこで、どの並び方も同じ確率 で起こると仮定するとき、ちょうど 個の数字が一致する確率はどれくらいだろうか?
下列の並び方を、数字をカンマ区切りで横に並べて括弧でまとめることで表現しよう。先の例なら と表すことができる。逆に、 個の数字によるこの表記から、ある一つの下列の並べ方が対応するので、下列の並び方のすべてをこのような表記で統一的に表すことができる。従って、直積を用いて標本空間 は とかける。
事象 を「番号 が一致する」ことによって定める 。厳密に言えば とかくことができる。含まれる元の個数は である。求めたい確率は、事象 を「 のうちでちょうど 個のみの事象が起こる」ことと定義して とかけるので、定理の記号で、
であるから、
と求めることができる。特に が十分大ならば、 であることから、
と近似できる。さらに とすれば、
であるが、これは「十分多い 枚のカードのもとで、ひとつも数字が一致しない並び方となる確率」を表している。
は、すべての について となるとき撹拌置換と呼ばれる。この言葉を使えば、 次の撹拌置換を得る確率は概ね 程度である。
三囚人問題
有名問題。
ある刑務所長は3人の囚人の中からランダムに1人を選んで解放し, 残りの2人を処刑する. 看守は誰が解放されるか知っているが, どの囚人にも彼が開放されるかどうか教えることは禁止されている. 囚人を と呼ぶことにしよう. は看守に か のどちらが処刑されるか尋ね, 私は か のどちらかが処刑されることは知っているので, 看守がどちらが処刑されるかを教えても, 私の状態について情報を漏らしたことにはならないと主張した. 看守は に が処刑されることを伝えた. は, 彼か のどちらかが解放されるので, 彼が解放される確率は今や であり, 以前より幸せに感じている. 彼は正しいか, それとも彼のチャンスはまだ のままか?説明せよ.
〔出典:T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein: Introduction to Algorithm (3rd Edition), MIT Press, 2009. (浅野哲夫, 岩野和生, 梅尾博司, 山下雅史, 和田幸一(訳)『アルゴリズムイントロダクション 第3版』近代科学社, 2013) 〕
問題について
モンティホール問題と同様に、一見してどっちが正しいのか分からなくなるような問である。
*
最初に正しい考え方を示して、その後に誤った考え方を示そう。
確率を議論するためには、起こり得るすべての結果の全体の集合である、標本空間 を定めねばならない。起こり得るすべての結果は、それぞれ(解放される囚人, 看守の情報)という二つ組で表現できるので、
と表せる。いま、解放される囚人は同様に確からしいから、
が成立つ。 であるから、これら三つの確率は で等しい。さらに、看守が無作為の選択をすることに注意する。解放される囚人が であった場合は も も処刑されるので、看守は に伝える囚人として、 と のうちどちらか一方を選択しなければならないが、問題の記述からこれは無作為であると仮定せざるを得ない。したがって、
が成立つ。ここで、 であったから、これら二つの確率は で等しい。以上をまとめると、次のようになる。
求める確率は、「 看守が を伝える」もとで、「 が解放される」ような条件付確率 である。 であるので、
つまり の解放される確率は看守の助言によって変化しない。さて、次のように考えるのはどうだろうか?
我々は「起こり得るすべての結果は、それぞれ(解放される囚人, 看守の情報)という二つ組で表現できる」として話を進めたが、結果として看守は 「 が処刑される」と言うのだから、結果を表すのに看守の情報はもはや必要なく、標本空間 は と考えてよい。解放される囚人は無作為に決定されるのだから、 であり、 であるので となるから、 の考えは正しい。
この考え方は誤っている。看守が 「 が処刑される」と助言できるのは、解放される囚人を無作為に選んだ後にのみ可能であることに注意すると、この誤答では因果関係が逆転していることに気づくだろう。看守の助言は、解放される囚人の無作為な選択に依存して定まる。確率を定義するためには、それ以前に標本空間が与えられていることを前提とするので、これでは最初の「無作為に解放囚人を選ぶ」とき以前に標本空間が与えられていないことになって不合理を生ずる。つまり、「標本空間を定める」→「無作為に解放囚人を選ぶ」→「看守から助言を受ける」が正しい依存関係であるのに、「無作為に解放囚人を選ぶ」→「看守から助言を受ける」→「標本空間を定める」としてしまっているので意味がない。標本空間は過程の初めに定まっていなければならない。 これが確率の定義であり、このことを忘れると結果を誤りがちである。
モンティホール問題
有名問題。
あなたはあるクイズショウの参加者である. 3つあるカーテンのうちの1つの後ろに賞品が隠されていて, 正しいカーテンを選べばこの賞品を獲得できる. あなたが1つのカーテンを選んだ後, そのカーテンを引き上げる前に司会者は残りのカーテンの中から1つを引き上げ, 空であることを示して, あなたに決心を変えるかどうか尋ねる. あなたが決心を変えたとき, あなたが賞品を得るチャンスは変わるか?
〔出典:T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein: Introduction to Algorithm (3rd Edition), MIT Press, 2009. (浅野哲夫, 岩野和生, 梅尾博司, 山下雅史, 和田幸一(訳)『アルゴリズムイントロダクション 第3版』近代科学社, 2013) 〕
問題について
多くの人が、「最終的に二択になるんだから単純に半々の確率では?」と思うようで、実際自分もそう思ったが、違うらしく、正解は 「選び直せば2/3、選び直さなければ1/3で当てることができる」という、直観にいくらか反したものである。具体的に計算すれば確かにその通りになる。詳しくは↓
「ああ確かに」と納得してしまえばそれまでだが、もう少し考えてみた。正しい答は知ったが、なぜ間違えたのかという本質的な問題がしばらく解消できなかった。つまり、やはり直観による答も正しいように思えて、直観の何が正しく何が間違っているのかが判然としなかった。今日ずっと考えて、自分なりに整理できたような気がするので、まとめておきたい。
*
確率を定めるためには、起こり得るすべての結果を含む集合である標本空間 を表現しなければならない(これは当たり前のように聞こえるが、とても重要なことである)。このゲームの進み方は
①最初に無作為に選んだカーテンの番号
②司会者から教わった外れのカーテンの番号
③最後に選んだカーテンの番号
という三つの数の組合せで表現することができる。カーテンの番号を順に 番とする。例えば は、①最初に0番のカーテンを選び、②司会者から1番が外れだと教わり、③決心を変えずに0番を選んだ-という進行を表現するものとしよう。いま、このゲームで言う「正しいカーテン」が0番であると固定すると、進行の全体の集合 は次のようにかける:
ここが誤解だが、これらすべての結果が同確率で起こる(つまり、「同様に確からしい」)わけではないことに注意したい。「同様に確からしい」という概念は、無作為に選んだ結果に仮定できる条件である。我々は①で、最初の番号を無作為に選んでいるので、
を結論づけることはできる。しかし、
というように、すべての結果が同確率で起こると仮定するには根拠がない。とはいえ、「根拠がない」と一蹴して終わるのも味気ないので、実際にこの仮定の下で話を進めて、間違っていることを見てみよう。確率の性質によって、 であり、部分集合 について ならば が成立つことを用いると、
であって、すべての結果が同確率で起こるという仮定から、すべての結果は確率 で起こることが分かる。すると、番号を変えて当たる確率は
であり、番号を変えずに当たる確率も
となって、番号を変えようが変えまいが同じ確率になって、正しい答が得られていないのが分かる。
本題に戻る。先のことから、
は成立つのだった。 だから、これら三つの確率は で等しいことが分かる。ここで、司会者も無作為の選択をしていることに注意する。挑戦者が見事①で正解 を選んだ場合、司会者が空ける外れのカーテンの番号の候補は二つあり、問題の仮定から、司会者はこの二つから空けるカーテンの番号を同確率で選ぶと考えざるを得ない。したがって、①で0が選ばれた場合に、②で選ばれる進行は同様に確からしい。ゆえに、
が成立つので、 であることから、これら二つの確率は で等しい。得られた結果を整理すると、次のようになる。
番号を変える場合と変えない場合で、当たる確率と外れる確率をそれぞれ求めよう。
番号を変える場合。 が得られるから、
従って、「変えて当たる確率」は で、「変えて外れる確率」は となる。
番号を変えない場合。 が得られるから、
従って、「変えないで当たる確率」は で、「変えないで外れる確率」は となる。
司会者の闖入により、最後の③で「決心を変える」「決心を変えない」という二択を迫られるので、「では?」と思ってしまいがちだが、これは考えている標本空間を取り違えてしまっていることに起因する誤りである。詳しくは三囚人問題を参照のこと。
ceil(x/(ab))=ceil(ceil(x/a)/b)
面白い証明を見つけたのでメモします。出典は↓
任意の と整数 , について,
を示せ.
証明. まず, 任意の整数 と実数 について, 同値 を示す. だから は明らか. 逆に ならば, ceil関数の定義から として かつ であるから .
したがって, 任意の整数 について, 次の同値が成立つ:
.
特に と が成立つので, 結論を得る. 終
極限の問題
(問題) を求めよ.
(コメント)ついさっき締切られたレポートの問題を解くのに必要になった問です。僕なんかはこれ「 で、 のとき みたいなものだから だ」と高を括ってしまいましたが、そうじゃないんですね。答を見れば分かりますが、 の方が よりも減りが大きいぽいです。同じような問題をやさ理かハイ理で見かけて、同じように間違えた気がします。今ならちゃんと説明できるので、戒めとして記します。
(解答)あとで とおけばよいので, まず の における極限を求める. をとれば となるが, Taylorの公式から,
( であったから)
であり, よって,
のとき であるから, の連続性によって である. したがって,
が成立つ. この極限の特別な場合()として,
(答)