rで学ぶ逆変換(逆関数)法
DESCRIPTION
第27回R勉強会@東京(#TokyoR)用のトーク資料。R言語を用いて乱数生成法の1つである逆変換方について解説。TRANSCRIPT
で学ぶ『逆(変換|関数)法』
第27回R勉強会@東京(#TokyoR)
@teramonagi
自己紹介
• @teramonagi
•乱数を撒くお仕事
• C++・R・python・VBA・F#
•数理物理・データ分析
2
季節の変わり目ですね。 ご自愛ください。
もくじ
•乱数を撒くお仕事からの逆変換法
•教科書的な逆変換法の説明
• Rで学ぶ逆変換法
•まとめ
3
自己紹介
• @teramonagi
•乱数を撒くお仕事 • C++・R・python・VBA・F#
4
季節の変わり目ですね。 ご自愛ください。
5
乱数を撒くお仕事
6
乱数を撒くお仕事
7
撒かれる乱数?
8
おじちゃん!乱数はどこから仕入れてくるの?
9
八百屋・・・?
10
魚屋・・・?
11
雑貨屋・・・?
12
困ったわね…どこか
ら乱数を仕入れればいいのかしら…
13
君らエンジニアじゃろう?無ければ作りなさい!
CEOのアドバイス
乱数作り方、いろいろ
14
逆変換法
合成法
重畳法 棄却採択法
マルコフ連鎖モンテカルロ法
(今回の)前提条件
15
[0,1]の一様乱数はある ||
メルセンヌ・ツイスター ||
runif()
[0,1]の一様乱数(runif)
16
0
20
40
60
0.00 0.25 0.50 0.75 1.00
count
逆変換法とは
17
[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)
1
XF
からの乱数 XF
u
x
変換
逆変換法とは
18
[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)
1
XF
正規分布
u
x
変換
二項分布
指数分布
逆変換法とは
1. [0,1]区間の一様乱数 を取得
2. として を計算
3. は累積分布関数 からの乱数
19
XF uFx X
1
ux
x
[0,1)の乱数 (例:0.1153…, 0.892…, 0.722…)
変換
1
XF
からの乱数 XF
u x
(例)逆変換法で指数分布
•累積分布関数
•累積分布関数の逆関数を計算
20
x
X exF 1
x
X exFu 1:
ux 1log1
uuFX 1log11
Xに ついて解く
(例)逆変換法で指数分布 1. rand.exponential <- function(lambda, u)
2. {
3. - 1.0/lambda * log(1-u)
4. }
5. #λ=0.5とした指数分布に従う10000個生成
6. x <- sapply(runif(10000), function(u)rand.exponential(0.5,u))
7. #plot
8. qplot(x, geom = "blank") +
9. geom_histogram(aes(y=..density..),fill="bisque",colour="black") +
10. stat_function(fun=dexp,color="red",size=1,arg=list(rate=0.5)) +
11. scale_x_continuous(limits = c(0, 10))
21
(例)逆変換法で指数分布
22
0.0
0.1
0.2
0.3
0.4
0.5
0.0 2.5 5.0 7.5 10.0
x
de
nsity
Rで作った頻度分布 VS 実際の密度関数
23
何でこれでいいんだろう?
もくじ
•乱数を撒くお仕事からの逆変換法
•教科書的な逆変換法の説明
• Rで学ぶ逆変換法
•まとめ
24
計算機シミュレーションのための
確率分布乱数生成法
25 2.2.1 逆関数法(Inverse Transform method)
パターン認識と機械学習 下
26 11.1.1 標準的な分布
Rによるモンテカルロ法入門
27 2.1.2 逆変換
自然科学の統計学
28 11.4.1 逆関数法
そんなテキストらによくある証明
29
xFxFU
xUFxX
XX
X
Pr
PrPr1
30
(昔の俺)お手上げ
Yahoo知恵袋にも仲間が!
31
32
もう少し直感的な説明が欲しいわね
もくじ
•乱数を撒くお仕事からの逆変換法
•教科書的な逆変換法の説明
• Rで学ぶ逆変換法
•まとめ
33
34
お題 カジノにいるSEが作る
ルーレット(二択)
ルーレットの設定(当選確率)
35
あたり
はずれ
50% 50%
36
うちのカジノで使うからさ~逆変換法でちょいちょいっと作ってよ!ちょいちょいっと!
37
ええと・・・「0~1」までの数値をあたり・はずれ共に50%になるよう
に変換するにはどうしたら・・・
逆変換法的に考えて・・・
38
[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)
1
XF
u
あたり:50% はずれ:50%
x
変換
単純に考えて・・・
39
0.0 0.5 1.0
あたり はずれ
アルゴリズム的に考えて・・・
40
)1,0(Uniform
0.15.0if,
5.00.0if,
~
はずれ
あたり結果
u
u
u
R的に考えて・・・ 1.#uは一様乱数(runifの結果)
2.example.1 <- function(u)
3.{
4. if(u < 0.5){
5. "あたり" 6. }
7. else{
8. "はずれ"
9. }
10.}
41
こんな感じでPLOTしてます 1. library(grid)
2. library(ggplot2)
3. sampling <- function(size, generator)
4. {
5. data.frame(table(sapply(runif(size), unction(u)generator(u)),dnn=c("Result")))
6. }
7. plot.bar <- function(x,colors)
8. {
9. ggplot() +
10. geom_bar(data=x, aes(x=Result, y=Freq,fill=Result),width=.8) +
11. theme(
12. legend.key.size=unit(2,"cm"),
13. legend.text =element_text(size=20),
14. legend.title=element_text(size=20),
15. axis.text.x =element_text(size=25),
16. axis.text.y =element_text(size=25),
17. axis.title.x=element_text(size=25),
18. axis.title.y=element_blank()
19. ) +
20. scale_fill_manual(values=colors)
21. }
22. plot.bar(sampling(10,example.1),c("#4F81BD","#C0504D"))
42
43 徹夜でコーディング
10回回した結果
44
0
2
4
6
あたり はずれResult
Result
あたり
はずれ
100回回した結果
45
0
20
40
あたり はずれResult
Result
あたり
はずれ
1000回回した結果
46
0
100
200
300
400
500
あたり はずれResult
Result
あたり
はずれ
47
大体50%ずつの確
率になってるね!いいじゃないか!儲けさせてもらったよ!
48
今月末は還元祭だから確率いじってよ!逆変換法でちょいちょいだろ!ちょいちょい!
ルーレットの設定(当選確率)
49
あたり
はずれ
30%
70%
50
ええと・・・「0~1」までの数値をから、あたり70%・はずれが30%に
なるように変換するにはどうしたら・・・
単純に考えて・・・
51
0.0 0.7 1.0
あたり はずれ
アルゴリズム的に考えて・・・
52
)1,0(Uniform
0.17.0if,
7.00.0if,
~
はずれ
あたり結果
u
u
u
R的に考えて・・・ 1.example.2 <- function(u)
2.{
3. if(u < 0.7){
4. "あたり" 5. }
6. else{
7. "はずれ"
8. }
9.}
53
54 徹夜でコーディング
1000回回した結果
55
0
200
400
600
あたり はずれResult
Result
あたり
はずれ
56
大体あたり70%・はずれ30%の確
率になってるね!いいじゃないか!
57
プロジェクトの終了
58
束の間の休息…
59
But… 更なる嵐の予感…
60
新アトラクション導入!
くじ引き(三択)
61
新しくくじ引き入れるからさ~逆変換法でちょいちょいっと頼むわ!ちょいちょいっと!
くじ引きの設定
62
青
赤
緑
33% 33%
33%
63
ええと・・・「0~1」までの数値をから、青33%・赤33% ・緑33%で
出るように変換するにはどうしたら・・・
逆変換法的に考えて・・・
64
[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)
1
XF
u
青: 33% 赤:33%, 緑: 33%
x
変換
単純に考えて・・・
65
0.0 0.333… (1/3)
1.0
赤 青 緑
0.666… (2/3)
13
2if,
3
2
3
1if,
3
10if,
u
u
u
アルゴリズム的に考えて・・・
66 )1,0(Uniform~u
赤
青
緑
くじ
R的に考えて・・・ 1.example.3 <- function(u)
2.{
3. if(u < 1/3){
4. "青"
5. }else if((1/3 <= u) & (u < 2/3)){
6. "赤"
7. }else if((2/3 <= u) & (u < 1.0)){
8. "緑"
9. }
10.}
67
3
13
1
68 徹夜でコーディング
1000回回した結果
69
0
100
200
300
青 赤 緑Result
Result
青
赤
緑
70
いいね!
71
もっと儲けたいからさ~くじに細工してくれる?なぁに逆変換法でちょいちょいだろ?
くじ引きの設定
72
青
赤
緑
10%
70% 20%
73
ええと・・・「0~1」までの数値をから、青10%・赤20%・緑70%で
出るように変換するにはどうしたら・・・
逆変換法的に考えて・・・
74
[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)
1
XF
u
青: 10% 赤:20%, 緑: 70% x
変換
単純に考えて・・・
75
0 0.1 (10%)
1.0
赤 青 緑
0.3 (30%)
0.13.0if,
3.01.0if,
1.00.0if,
u
u
u
アルゴリズム的に考えて・・・
76 )1,0(Uniform~u
赤
青
緑
くじ
R的に考えて・・・ 1.example.4 <- function(u)
2.{
3. if(u < 0.1){
4. "青"
5. }else if((0.1 <= u) & (u < 0.3)){
6. "赤"
7. }else if((0.3 <= u) & (u < 1.0)){
8. "緑"
9. }
10.}
77
3
13
1
78 徹夜でコーディング
1000回回した結果
79
0
200
400
600
青 赤 緑Result
Result
青
赤
緑
80
儲かりすぎて笑いが止まらないよ!ハハハッハ!!
81
あのちょいちょい野郎がいる限り僕のデスマは止まらない・・・なんとか先回りしないと!
0.13.0if,
3.01.0if,
1.00.0if,
u
u
u
アルゴリズム的に考えて・・・
82 )1,0(Uniform~u
赤
青
緑
くじ
83
赤 3.01.0if, u
84
0.1や0.3って数字はどこから来たのかしら・・・
85
赤 3.01.0if, u
86
赤 3.01.0if, u
青が出る確率(10%)
青が出る確率(10%)+ 赤が出る確率(20%)
0.13.0if,
3.01.0if,
1.00.0if,
u
u
u
アルゴリズム的に考えて・・・
87 )1,0(Uniform~u
赤
青
緑
くじ
0.13.0if, u
88
緑
0.13.0if, u
89
緑
青が出る確率(10%)+ 赤が出る確率(20%)
青が出る確率(10%)+ 赤が出る確率(20%)+ 緑が出る確率(70%)
90
何か法則性がありそうだな…
0.13.0if,
3.01.0if,
1.00.0if,
u
u
u
91 )1,0(Uniform~u
赤
青
緑
くじ
アルゴリズム的に考えて・・・
0.13.0if,
3.01.0if,
1.00.0if,
u
u
u
結果を文字式へ
92 )1,0(Uniform~u
2x
3x
1x
X
確率を文字式へ
93 )1,0(Uniform~u
2x
3x
1x
X 211if, xPxPuxP
10if, xPu
32121if, xPxPxPuxPxP
94
2x
3x
1x
211if, xPxPuxP
10if, xPu
32121if, xPxPxPuxPxP
95
2x
3x
1x
2
1
1
1
if,i
i
i
i xPuxP
和の記号(Σ)を使って書く
3
1
2
1
if,i
i
i
i xPuxP
1
1
0
1
if,i
i
i
i xPuxP
96
2x
3x
1x
3
1
2
1
if,i
i
i
i pup
和の記号(Σ)を使って書く
自分の番号(2)から1引いた数値(1)と同じ番号(2)で和をとる
2
1
1
1
if,i
i
i
i xPuxP
1
1
0
1
if,i
i
i
i xPuxP
97
素晴らしい洞察力!
でわ、これを一般化してみよう!
98
題材
くじ引き(N択)
くじ引きの設定
99
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 … x_N-1 xN
単純に考えて・・・
100
0 1.0
1x 2x 4x 5x 6x 1Nx Nx3x・・・
・・・
101
2x
2
1
12
1
if,i
i
i
i xPuxP
N択くじの2番目結果は?
自分の番号から1引いた数値と同じ番号で和をとる
102
N択くじのn番目結果は?
自分の番号から1引いた数値と同じ番号で和をとる
nx
n
i
i
n
i
i xPuxP1
1
1
if,
連続 離散
Nを∞にすると・・・
nx x dxxp xP
Nを∞にすると・・・
104
nx
n
i
i
n
i
i xPuxP1
1
1
if,
x
xx
dxxpudxxp ''''if,
105
udxxpxFx
X ''
uFx X
1
かける 1
XF両辺に
逆変換法とは(再掲)
1. [0,1]区間の一様乱数 を取得
2. として を計算
3. は累積分布関数 からの乱数
106
XF uFx X
1
ux
x
[0,1)の乱数 (例:0.1153…, 0.892…, 0.722…)
変換
1
XF
からの乱数 XF
u x
逆変換法とは(再掲)
1. [0,1]区間の一様乱数 を取得
2. として を計算
3. は累積分布関数 からの乱数
107
XF uFx X
1
ux
x
[0,1)の乱数 (例:0.1153…, 0.892…, 0.722…)
変換
1
XF
からの乱数 XF
u x
108
ぎゃ、逆変換法じゃねーか!
109
Congratulation!!!
まとめ
110
二択・三択の練習問題
N→∞
逆変換法
N択のくじ引き
一般化