tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

任意の連続関数に従って乱数を生成する - 「Think Stats」第4章

numpy.randomにはたくさんの関数が用意されていて分布だけでもかなりの種類があるが、今回はそれ以外の関数について値を得たい場合について考える。

実装

cdf-1(random.random_sample())

とすればいい。

説明

簡単のため離散的に考える。pdfが与えられた時、いくつかのxについてのみ考える。pmfはpdfから

\[ \rm pm f = \rm pdf\Delta_{x} \] として計算できる。

ここで、\(\rm cmf = \rm cumsum(pm f)\)なので、幅1の直方体を用いて、pmfを面積に対応させて図示すると、

f:id:kuyata:20140501203011j:plain

これから[0,1)の範囲で生成した乱数とcmfを比較すれば必要だったxが得られ、これを連続な場合に置き換えると、xはcdfの逆関数に対応していることが分かる。

直接は関係ないが高速な復元抽出の直感的な説明の説明のイラストがわかりやすかったので参考にした。