rで学ぶ逆変換(逆関数)法

110
で学ぶ『逆(変換|関数)法』 27R勉強会@東京(#TokyoR) @teramonagi

Upload: tera-monagi

Post on 15-Jan-2015

11.054 views

Category:

Technology


4 download

DESCRIPTION

第27回R勉強会@東京(#TokyoR)用のトーク資料。R言語を用いて乱数生成法の1つである逆変換方について解説。

TRANSCRIPT

Page 1: Rで学ぶ逆変換(逆関数)法

で学ぶ『逆(変換|関数)法』

第27回R勉強会@東京(#TokyoR)

@teramonagi

Page 2: Rで学ぶ逆変換(逆関数)法

自己紹介

• @teramonagi

•乱数を撒くお仕事

• C++・R・python・VBA・F#

•数理物理・データ分析

2

季節の変わり目ですね。 ご自愛ください。

Page 3: Rで学ぶ逆変換(逆関数)法

もくじ

•乱数を撒くお仕事からの逆変換法

•教科書的な逆変換法の説明

• Rで学ぶ逆変換法

•まとめ

3

Page 4: Rで学ぶ逆変換(逆関数)法

自己紹介

• @teramonagi

•乱数を撒くお仕事 • C++・R・python・VBA・F#

4

季節の変わり目ですね。 ご自愛ください。

Page 5: Rで学ぶ逆変換(逆関数)法

5

乱数を撒くお仕事

Page 6: Rで学ぶ逆変換(逆関数)法

6

乱数を撒くお仕事

Page 7: Rで学ぶ逆変換(逆関数)法

7

撒かれる乱数?

Page 8: Rで学ぶ逆変換(逆関数)法

8

おじちゃん!乱数はどこから仕入れてくるの?

Page 9: Rで学ぶ逆変換(逆関数)法

9

八百屋・・・?

Page 10: Rで学ぶ逆変換(逆関数)法

10

魚屋・・・?

Page 11: Rで学ぶ逆変換(逆関数)法

11

雑貨屋・・・?

Page 12: Rで学ぶ逆変換(逆関数)法

12

困ったわね…どこか

ら乱数を仕入れればいいのかしら…

Page 13: Rで学ぶ逆変換(逆関数)法

13

君らエンジニアじゃろう?無ければ作りなさい!

CEOのアドバイス

Page 14: Rで学ぶ逆変換(逆関数)法

乱数作り方、いろいろ

14

逆変換法

合成法

重畳法 棄却採択法

マルコフ連鎖モンテカルロ法

Page 15: Rで学ぶ逆変換(逆関数)法

(今回の)前提条件

15

[0,1]の一様乱数はある ||

メルセンヌ・ツイスター ||

runif()

Page 16: Rで学ぶ逆変換(逆関数)法

[0,1]の一様乱数(runif)

16

0

20

40

60

0.00 0.25 0.50 0.75 1.00

count

Page 17: Rで学ぶ逆変換(逆関数)法

逆変換法とは

17

[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)

1

XF

からの乱数 XF

u

x

変換

Page 18: Rで学ぶ逆変換(逆関数)法

逆変換法とは

18

[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)

1

XF

正規分布

u

x

変換

二項分布

指数分布

Page 19: Rで学ぶ逆変換(逆関数)法

逆変換法とは

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

Page 20: Rで学ぶ逆変換(逆関数)法

(例)逆変換法で指数分布

•累積分布関数

•累積分布関数の逆関数を計算

20

x

X exF 1

x

X exFu 1:

ux 1log1

uuFX 1log11

Xに ついて解く

Page 21: Rで学ぶ逆変換(逆関数)法

(例)逆変換法で指数分布 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

Page 22: Rで学ぶ逆変換(逆関数)法

(例)逆変換法で指数分布

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 実際の密度関数

Page 23: Rで学ぶ逆変換(逆関数)法

23

何でこれでいいんだろう?

Page 24: Rで学ぶ逆変換(逆関数)法

もくじ

•乱数を撒くお仕事からの逆変換法

•教科書的な逆変換法の説明

• Rで学ぶ逆変換法

•まとめ

24

Page 25: Rで学ぶ逆変換(逆関数)法

計算機シミュレーションのための

確率分布乱数生成法

25 2.2.1 逆関数法(Inverse Transform method)

Page 26: Rで学ぶ逆変換(逆関数)法

パターン認識と機械学習 下

26 11.1.1 標準的な分布

Page 27: Rで学ぶ逆変換(逆関数)法

Rによるモンテカルロ法入門

27 2.1.2 逆変換

Page 28: Rで学ぶ逆変換(逆関数)法

自然科学の統計学

28 11.4.1 逆関数法

Page 29: Rで学ぶ逆変換(逆関数)法

そんなテキストらによくある証明

29

xFxFU

xUFxX

XX

X

Pr

PrPr1

Page 30: Rで学ぶ逆変換(逆関数)法

30

(昔の俺)お手上げ

Page 31: Rで学ぶ逆変換(逆関数)法

Yahoo知恵袋にも仲間が!

31

Page 32: Rで学ぶ逆変換(逆関数)法

32

もう少し直感的な説明が欲しいわね

Page 33: Rで学ぶ逆変換(逆関数)法

もくじ

•乱数を撒くお仕事からの逆変換法

•教科書的な逆変換法の説明

• Rで学ぶ逆変換法

•まとめ

33

Page 34: Rで学ぶ逆変換(逆関数)法

34

お題 カジノにいるSEが作る

ルーレット(二択)

Page 35: Rで学ぶ逆変換(逆関数)法

ルーレットの設定(当選確率)

35

あたり

はずれ

50% 50%

Page 36: Rで学ぶ逆変換(逆関数)法

36

うちのカジノで使うからさ~逆変換法でちょいちょいっと作ってよ!ちょいちょいっと!

Page 37: Rで学ぶ逆変換(逆関数)法

37

ええと・・・「0~1」までの数値をあたり・はずれ共に50%になるよう

に変換するにはどうしたら・・・

Page 38: Rで学ぶ逆変換(逆関数)法

逆変換法的に考えて・・・

38

[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)

1

XF

u

あたり:50% はずれ:50%

x

変換

Page 39: Rで学ぶ逆変換(逆関数)法

単純に考えて・・・

39

0.0 0.5 1.0

あたり はずれ

Page 40: Rで学ぶ逆変換(逆関数)法

アルゴリズム的に考えて・・・

40

)1,0(Uniform

0.15.0if,

5.00.0if,

はずれ

あたり結果

u

u

u

Page 41: Rで学ぶ逆変換(逆関数)法

R的に考えて・・・ 1.#uは一様乱数(runifの結果)

2.example.1 <- function(u)

3.{

4. if(u < 0.5){

5. "あたり" 6. }

7. else{

8. "はずれ"

9. }

10.}

41

Page 42: Rで学ぶ逆変換(逆関数)法

こんな感じで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

Page 43: Rで学ぶ逆変換(逆関数)法

43 徹夜でコーディング

Page 44: Rで学ぶ逆変換(逆関数)法

10回回した結果

44

0

2

4

6

あたり はずれResult

Result

あたり

はずれ

Page 45: Rで学ぶ逆変換(逆関数)法

100回回した結果

45

0

20

40

あたり はずれResult

Result

あたり

はずれ

Page 46: Rで学ぶ逆変換(逆関数)法

1000回回した結果

46

0

100

200

300

400

500

あたり はずれResult

Result

あたり

はずれ

Page 47: Rで学ぶ逆変換(逆関数)法

47

大体50%ずつの確

率になってるね!いいじゃないか!儲けさせてもらったよ!

Page 48: Rで学ぶ逆変換(逆関数)法

48

今月末は還元祭だから確率いじってよ!逆変換法でちょいちょいだろ!ちょいちょい!

Page 49: Rで学ぶ逆変換(逆関数)法

ルーレットの設定(当選確率)

49

あたり

はずれ

30%

70%

Page 50: Rで学ぶ逆変換(逆関数)法

50

ええと・・・「0~1」までの数値をから、あたり70%・はずれが30%に

なるように変換するにはどうしたら・・・

Page 51: Rで学ぶ逆変換(逆関数)法

単純に考えて・・・

51

0.0 0.7 1.0

あたり はずれ

Page 52: Rで学ぶ逆変換(逆関数)法

アルゴリズム的に考えて・・・

52

)1,0(Uniform

0.17.0if,

7.00.0if,

はずれ

あたり結果

u

u

u

Page 53: Rで学ぶ逆変換(逆関数)法

R的に考えて・・・ 1.example.2 <- function(u)

2.{

3. if(u < 0.7){

4. "あたり" 5. }

6. else{

7. "はずれ"

8. }

9.}

53

Page 54: Rで学ぶ逆変換(逆関数)法

54 徹夜でコーディング

Page 55: Rで学ぶ逆変換(逆関数)法

1000回回した結果

55

0

200

400

600

あたり はずれResult

Result

あたり

はずれ

Page 56: Rで学ぶ逆変換(逆関数)法

56

大体あたり70%・はずれ30%の確

率になってるね!いいじゃないか!

Page 57: Rで学ぶ逆変換(逆関数)法

57

プロジェクトの終了

Page 58: Rで学ぶ逆変換(逆関数)法

58

束の間の休息…

Page 59: Rで学ぶ逆変換(逆関数)法

59

But… 更なる嵐の予感…

Page 60: Rで学ぶ逆変換(逆関数)法

60

新アトラクション導入!

くじ引き(三択)

Page 61: Rで学ぶ逆変換(逆関数)法

61

新しくくじ引き入れるからさ~逆変換法でちょいちょいっと頼むわ!ちょいちょいっと!

Page 62: Rで学ぶ逆変換(逆関数)法

くじ引きの設定

62

33% 33%

33%

Page 63: Rで学ぶ逆変換(逆関数)法

63

ええと・・・「0~1」までの数値をから、青33%・赤33% ・緑33%で

出るように変換するにはどうしたら・・・

Page 64: Rで学ぶ逆変換(逆関数)法

逆変換法的に考えて・・・

64

[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)

1

XF

u

青: 33% 赤:33%, 緑: 33%

x

変換

Page 65: Rで学ぶ逆変換(逆関数)法

単純に考えて・・・

65

0.0 0.333… (1/3)

1.0

赤 青 緑

0.666… (2/3)

Page 66: Rで学ぶ逆変換(逆関数)法

13

2if,

3

2

3

1if,

3

10if,

u

u

u

アルゴリズム的に考えて・・・

66 )1,0(Uniform~u

くじ

Page 67: Rで学ぶ逆変換(逆関数)法

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

Page 68: Rで学ぶ逆変換(逆関数)法

68 徹夜でコーディング

Page 69: Rで学ぶ逆変換(逆関数)法

1000回回した結果

69

0

100

200

300

青 赤 緑Result

Result

Page 70: Rで学ぶ逆変換(逆関数)法

70

いいね!

Page 71: Rで学ぶ逆変換(逆関数)法

71

もっと儲けたいからさ~くじに細工してくれる?なぁに逆変換法でちょいちょいだろ?

Page 72: Rで学ぶ逆変換(逆関数)法

くじ引きの設定

72

10%

70% 20%

Page 73: Rで学ぶ逆変換(逆関数)法

73

ええと・・・「0~1」までの数値をから、青10%・赤20%・緑70%で

出るように変換するにはどうしたら・・・

Page 74: Rで学ぶ逆変換(逆関数)法

逆変換法的に考えて・・・

74

[0,1]の乱数 (例:0.1153…, 0.892…, 0.722…)

1

XF

u

青: 10% 赤:20%, 緑: 70% x

変換

Page 75: Rで学ぶ逆変換(逆関数)法

単純に考えて・・・

75

0 0.1 (10%)

1.0

赤 青 緑

0.3 (30%)

Page 76: Rで学ぶ逆変換(逆関数)法

0.13.0if,

3.01.0if,

1.00.0if,

u

u

u

アルゴリズム的に考えて・・・

76 )1,0(Uniform~u

くじ

Page 77: Rで学ぶ逆変換(逆関数)法

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

Page 78: Rで学ぶ逆変換(逆関数)法

78 徹夜でコーディング

Page 79: Rで学ぶ逆変換(逆関数)法

1000回回した結果

79

0

200

400

600

青 赤 緑Result

Result

Page 80: Rで学ぶ逆変換(逆関数)法

80

儲かりすぎて笑いが止まらないよ!ハハハッハ!!

Page 81: Rで学ぶ逆変換(逆関数)法

81

あのちょいちょい野郎がいる限り僕のデスマは止まらない・・・なんとか先回りしないと!

Page 82: Rで学ぶ逆変換(逆関数)法

0.13.0if,

3.01.0if,

1.00.0if,

u

u

u

アルゴリズム的に考えて・・・

82 )1,0(Uniform~u

くじ

Page 83: Rで学ぶ逆変換(逆関数)法

83

赤 3.01.0if, u

Page 84: Rで学ぶ逆変換(逆関数)法

84

0.1や0.3って数字はどこから来たのかしら・・・

Page 85: Rで学ぶ逆変換(逆関数)法

85

赤 3.01.0if, u

Page 86: Rで学ぶ逆変換(逆関数)法

86

赤 3.01.0if, u

青が出る確率(10%)

青が出る確率(10%)+ 赤が出る確率(20%)

Page 87: Rで学ぶ逆変換(逆関数)法

0.13.0if,

3.01.0if,

1.00.0if,

u

u

u

アルゴリズム的に考えて・・・

87 )1,0(Uniform~u

くじ

Page 88: Rで学ぶ逆変換(逆関数)法

0.13.0if, u

88

Page 89: Rで学ぶ逆変換(逆関数)法

0.13.0if, u

89

青が出る確率(10%)+ 赤が出る確率(20%)

青が出る確率(10%)+ 赤が出る確率(20%)+ 緑が出る確率(70%)

Page 90: Rで学ぶ逆変換(逆関数)法

90

何か法則性がありそうだな…

Page 91: Rで学ぶ逆変換(逆関数)法

0.13.0if,

3.01.0if,

1.00.0if,

u

u

u

91 )1,0(Uniform~u

くじ

アルゴリズム的に考えて・・・

Page 92: Rで学ぶ逆変換(逆関数)法

0.13.0if,

3.01.0if,

1.00.0if,

u

u

u

結果を文字式へ

92 )1,0(Uniform~u

2x

3x

1x

X

Page 93: Rで学ぶ逆変換(逆関数)法

確率を文字式へ

93 )1,0(Uniform~u

2x

3x

1x

X 211if, xPxPuxP

10if, xPu

32121if, xPxPxPuxPxP

Page 94: Rで学ぶ逆変換(逆関数)法

94

2x

3x

1x

211if, xPxPuxP

10if, xPu

32121if, xPxPxPuxPxP

Page 95: Rで学ぶ逆変換(逆関数)法

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

Page 96: Rで学ぶ逆変換(逆関数)法

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

Page 97: Rで学ぶ逆変換(逆関数)法

97

素晴らしい洞察力!

でわ、これを一般化してみよう!

Page 98: Rで学ぶ逆変換(逆関数)法

98

題材

くじ引き(N択)

Page 99: Rで学ぶ逆変換(逆関数)法

くじ引きの設定

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

Page 100: Rで学ぶ逆変換(逆関数)法

単純に考えて・・・

100

0 1.0

1x 2x 4x 5x 6x 1Nx Nx3x・・・

・・・

Page 101: Rで学ぶ逆変換(逆関数)法

101

2x

2

1

12

1

if,i

i

i

i xPuxP

N択くじの2番目結果は?

自分の番号から1引いた数値と同じ番号で和をとる

Page 102: Rで学ぶ逆変換(逆関数)法

102

N択くじのn番目結果は?

自分の番号から1引いた数値と同じ番号で和をとる

nx

n

i

i

n

i

i xPuxP1

1

1

if,

Page 103: Rで学ぶ逆変換(逆関数)法

連続 離散

Nを∞にすると・・・

nx x dxxp xP

Page 104: Rで学ぶ逆変換(逆関数)法

Nを∞にすると・・・

104

nx

n

i

i

n

i

i xPuxP1

1

1

if,

x

xx

dxxpudxxp ''''if,

Page 105: Rで学ぶ逆変換(逆関数)法

105

udxxpxFx

X ''

uFx X

1

かける 1

XF両辺に

Page 106: Rで学ぶ逆変換(逆関数)法

逆変換法とは(再掲)

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

Page 107: Rで学ぶ逆変換(逆関数)法

逆変換法とは(再掲)

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

Page 108: Rで学ぶ逆変換(逆関数)法

108

ぎゃ、逆変換法じゃねーか!

Page 109: Rで学ぶ逆変換(逆関数)法

109

Congratulation!!!

Page 110: Rで学ぶ逆変換(逆関数)法

まとめ

110

二択・三択の練習問題

N→∞

逆変換法

N択のくじ引き

一般化