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

18,746
-1

Published on

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

Published in: Technology
0 Comments
41 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
18,746
On Slideshare
0
From Embeds
0
Number of Embeds
15
Actions
Shares
0
Downloads
73
Comments
0
Likes
41
Embeds 0
No embeds

No notes for slide

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

  1. 1. 第27回R勉強会@東京(#TokyoR) で学ぶ『逆(変換|関数)法』 @teramonagi
  2. 2. 自己紹介• @teramonagi• 乱数を撒くお仕事• C++・R・python・VBA・F#• 数理物理・データ分析季節の変わり目ですね。 ご自愛ください。 2
  3. 3. もくじ• 乱数を撒くお仕事からの逆変換法• 教科書的な逆変換法の説明• Rで学ぶ逆変換法• まとめ 3
  4. 4. 自己紹介• @teramonagi•乱数を撒くお仕事• C++・R・python・VBA・F#季節の変わり目ですね。 ご自愛ください。 4
  5. 5. 乱数を撒くお仕事 5
  6. 6. 乱数を撒くお仕事 6
  7. 7. 撒かれる乱数? 7
  8. 8. おじちゃん!乱数はどこから仕入れ てくるの? 8
  9. 9. 八百屋・・・? 9
  10. 10. 魚屋・・・? 10
  11. 11. 雑貨屋・・・? 11
  12. 12. 困ったわね…どこから乱数を仕入れればいいのかしら… 12
  13. 13. 君らエンジニア じゃろう?無けれ ば作りなさい!CEOのアドバイス 13
  14. 14. 乱数作り方、いろいろ逆変換法 マルコフ連鎖 モンテカルロ法合成法 棄却採択法重畳法 14
  15. 15. (今回の)前提条件[0,1]の一様乱数はある || メルセンヌ・ツイスター || runif() 15
  16. 16. [0,1]の一様乱数(runif) 60 40count 20 0 0.00 0.25 0.50 0.75 1.00 16
  17. 17. 逆変換法とは [0,1]の乱数(例:0.1153…, 0.892…, 0.722…) u 変換 1 FXFX からの乱数 x 17
  18. 18. 逆変換法とは [0,1]の乱数(例:0.1153…, 0.892…, 0.722…) u 1 変換 FX正規 指数分布 二項 分布 分布 x 18
  19. 19. 逆変換法とは1. [0,1]区間の一様乱数 u を取得 12. x  FX u として x を計算 3. x は累積分布関数 FXからの乱数[0,1)の乱数 変換 FX からの乱数(例:0.1153…, 0.892…, 0.722…) 1 u FX x 19
  20. 20. (例)逆変換法で指数分布• 累積分布関数 FX x 1  e   x• 累積分布関数の逆関数を計算 u : FX x   1  e  x 1 log1  u  Xに xついて解く  F 1 X u    1 log1  u  20
  21. 21. (例)逆変換法で指数分布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. #plot8. 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. 22. (例)逆変換法で指数分布 0.5 Rで作った頻度分布 VS 実際の密度関数 0.4 0.3density 0.2 0.1 0.0 0.0 2.5 5.0 7.5 10.0 x 22
  23. 23. 何でこれでいいんだろう? 23
  24. 24. もくじ• 乱数を撒くお仕事からの逆変換法• 教科書的な逆変換法の説明• Rで学ぶ逆変換法• まとめ 24
  25. 25. 計算機シミュレーションのための 確率分布乱数生成法2.2.1 逆関数法(Inverse Transform method) 25
  26. 26. パターン認識と機械学習 下 11.1.1 標準的な分布 26
  27. 27. Rによるモンテカルロ法入門 2.1.2 逆変換 27
  28. 28. 自然科学の統計学 11.4.1 逆関数法 28
  29. 29. そんなテキストらによくある証明 Pr X  x   Pr FX U   x  1 PrU  FX x   FX x  29
  30. 30. (昔の俺)お手上げ 30
  31. 31. Yahoo知恵袋にも仲間が! 31
  32. 32. もう少し直感的な説明が欲しいわね 32
  33. 33. もくじ• 乱数を撒くお仕事からの逆変換法• 教科書的な逆変換法の説明• Rで学ぶ逆変換法• まとめ 33
  34. 34. お題 カジノにいるSEが作るルーレット(二択) 34
  35. 35. ルーレットの設定(当選確率) 50% 50%あたりはずれ 35
  36. 36. うちのカジノで使うからさ~逆変換法でちょいちょいっと作ってよ!ちょいちょいっと! 36
  37. 37. ええと・・・「0~1」までの数値をあたり・はずれ共に50%になるように変換するにはどうしたら・・・ 37
  38. 38. 逆変換法的に考えて・・・ [0,1]の乱数(例:0.1153…, 0.892…, 0.722…) u 変換 1 FX あたり:50% はずれ:50% x 38
  39. 39. 単純に考えて・・・ あたり はずれ0.0 0.5 1.0 39
  40. 40. アルゴリズム的に考えて・・・ あたり if 0.0  u  0.5 ,結果   はずれ, if 0.5  u  1.0u~Uniform(0,1) 40
  41. 41. R的に考えて・・・1.#uは一様乱数(runifの結果)2.example.1 <- function(u)3.{4. if(u < 0.5){5. "あたり"6. }7. else{8. "はずれ"9. }10.} 41
  42. 42. こんな感じで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. 43. 徹夜でコーディング43
  44. 44. 10回回した結果6 Result4 あたり2 はずれ0 あたり はずれ Result 44
  45. 45. 100回回した結果40 Result あたり20 はずれ0 あたり はずれ Result 45
  46. 46. 1000回回した結果500400 Result300 あたり200 はずれ100 0 あたり はずれ Result 46
  47. 47. 大体50%ずつの確率になってるね!いいじゃないか!儲けさせてもらったよ! 47
  48. 48. 今月末は還元祭だから確率いじってよ!逆変換法でちょいちょいだろ!ちょいちょい! 48
  49. 49. ルーレットの設定(当選確率) 30%あたり 70%はずれ 49
  50. 50. ええと・・・「0~1」までの数値をから、あたり70%・はずれが30%になるように変換するにはどうしたら・・・ 50
  51. 51. 単純に考えて・・・ あたり はずれ0.0 0.7 1.0 51
  52. 52. アルゴリズム的に考えて・・・ あたり if 0.0  u  0.7  ,結果   はずれ, if 0.7  u  1.0u~Uniform(0,1) 52
  53. 53. R的に考えて・・・1.example.2 <- function(u)2.{3. if(u < 0.7){4. "あたり"5. }6. else{7. "はずれ"8. }9.} 53
  54. 54. 徹夜でコーディング54
  55. 55. 1000回回した結果600 Result400 あたり200 はずれ 0 あたり はずれ Result 55
  56. 56. 大体あたり70%・はずれ30%の確率になってるね!いいじゃないか! 56
  57. 57. プロジェクトの終了 57
  58. 58. 束の間の休息… 58
  59. 59. But…更なる嵐の予感… 59
  60. 60. 新アトラクション導入!くじ引き(三択) 60
  61. 61. 新しくくじ引き入れるからさ~逆変換法でちょいちょいっと頼むわ!ちょいちょいっと! 61
  62. 62. くじ引きの設定 33% 33%青赤緑 33% 62
  63. 63. ええと・・・「0~1」までの数値をから、青33%・赤33% ・緑33%で出るように変換するにはどうしたら・・・ 63
  64. 64. 逆変換法的に考えて・・・ [0,1]の乱数(例:0.1153…, 0.892…, 0.722…) u 変換 1 FX 青: 33%赤:33%, 緑: 33% x 64
  65. 65. 単純に考えて・・・ 青 赤 緑0.0 0.333… 0.666… 1.0 (1/3) (2/3) 65
  66. 66. アルゴリズム的に考えて・・・  1 青 , if  0  u    3 1 2 くじ 赤 , if   u   3 3 緑 , if  3  u  1 2   u~Uniform(0,1) 66
  67. 67. R的に考えて・・・1.example.3 <- function(u)2.{3. if(u < 1/3){4. "青"5. }else if((1/3 <= 13 u) & (u < 2/3)){ 16. "赤" 37. }else if((2/3 <= u) & (u < 1.0)){8. "緑"9. }10.} 67
  68. 68. 徹夜でコーディング68
  69. 69. 1000回回した結果300 Result 青200 赤100 緑 0 青 赤 緑 Result 69
  70. 70. いいね! 70
  71. 71. もっと儲けたいからさ~くじに細工してくれる?なぁに逆変換法でちょいちょいだろ? 71
  72. 72. くじ引きの設定 10%青 70% 20%赤緑 72
  73. 73. ええと・・・「0~1」までの数値をから、青10%・赤20%・緑70%で出るように変換するにはどうしたら・・・ 73
  74. 74. 逆変換法的に考えて・・・ [0,1]の乱数(例:0.1153…, 0.892…, 0.722…) u 変換 1 FX 青: 10% 赤:20%, 緑: 70% x 74
  75. 75. 単純に考えて・・・青 赤 緑0 0.1 0.3 1.0 (10%) (30%) 75
  76. 76. アルゴリズム的に考えて・・・ 青, if 0.0  u  0.1くじ 赤, if 0.1  u  0.3 緑, if 0.3  u  1.0u~Uniform(0,1) 76
  77. 77. R的に考えて・・・1.example.4 <- function(u)2.{3. if(u < 0.1){4. "青"5. }else if((0.1 <= 13 u) & (u < 0.3)){ 16. "赤" 37. }else if((0.3 <= u) & (u < 1.0)){8. "緑"9. }10.} 77
  78. 78. 徹夜でコーディング78
  79. 79. 1000回回した結果600 Result 青400 赤200 緑 0 青 赤 緑 Result 79
  80. 80. 儲かりすぎて笑いが止まらないよ!ハハハッハ!! 80
  81. 81. あのちょいちょい野郎がいる限り僕のデスマは止まらない・・・なんとか先回りしないと! 81
  82. 82. アルゴリズム的に考えて・・・ 青, if 0.0  u  0.1くじ 赤, if 0.1  u  0.3 緑, if 0.3  u  1.0u~Uniform(0,1) 82
  83. 83. 赤, if 0.1  u  0.3 83
  84. 84. 0.1や0.3って数字はどこから来たのかしら・・・ 84
  85. 85. 赤, if 0.1  u  0.3 85
  86. 86. 青が出る確率(10%)+ 赤が出る確率(20%) 赤, if 0.1  u  0.3青が出る確率(10%) 86
  87. 87. アルゴリズム的に考えて・・・ 青, if 0.0  u  0.1くじ 赤, if 0.1  u  0.3 緑, if 0.3  u  1.0u~Uniform(0,1) 87
  88. 88. 緑, if 0.3  u  1.0 88
  89. 89. 青が出る確率(10%)+ 赤が出る確率(20%)+ 緑が出る確率(70%)青が出る確率(10%)+赤が出る確率(20%) 緑, if 0.3  u  1.0 89
  90. 90. 何か法則性がありそうだな… 90
  91. 91. アルゴリズム的に考えて・・・ 青, if 0.0  u  0.1くじ 赤, if 0.1  u  0.3 緑, if 0.3  u  1.0u~Uniform(0,1) 91
  92. 92. 結果を文字式へ x1 , if 0.0  u  0.1 X x2 , if 0.1  u  0.3 x3 , if 0.3  u  1.0u~Uniform(0,1) 92
  93. 93. 確率を文字式へ x1 , if 0  u  Px1  X x2 , if Px1   u  Px1   Px2  x3 , if Px1   Px2   u  Px1   Px2   Px3 u~Uniform(0,1) 93
  94. 94. x1 , if 0  u  Px1 x2 , if Px1   u  Px1   Px2 x3 , if Px1   Px2   u  Px1   Px2   Px3  94
  95. 95. 和の記号(Σ)を使って書く   x 0 1 , if   Pxi   u   Pxi  1  i1 i 1  x  2  i1 1 2  , if   Pxi   u   Pxi  i 1    x 2 3 , if   Pxi   u   Pxi  3  i1 i 1  95
  96. 96. 和の記号(Σ)を使って書く   x 0 1 , if   Pxi   u   Pxi  1  i1 i 1  x  2  i1 1 2 , if   Pxi   u   Pxi  i 1   x  2 3 , if   pi  u   pi 自分の番号(2)から1引いた数値 3  i1 i 1  (1)と同じ番号(2)で和をとる 96
  97. 97. 素晴らしい洞察力!でわ、これを一般化してみよう! 97
  98. 98. 題材くじ引き(N択) 98
  99. 99. x1 くじ引きの設定 x2x3 x4x5 x6x7 x8x9 x10x11 x12x13 x14x15 x16x17 x18x19 x20x21 x22x23 x24x25 x26x27 …x_N-1 xN 99
  100. 100. 単純に考えて・・・x1 x2 x3 x4 x5 x6 xN 1 xN ・・・ ・・・0 1.0 100
  101. 101. N択くじの2番目結果は?x  21 2  i1 2  , if   Pxi   u   Pxi  i 1 自分の番号から1引いた数値と同じ番号で和をとる 101
  102. 102. N択くじのn番目結果は?x  n 1 n  i1 n  , if   Pxi   u   Pxi  i 1 自分の番号から1引いた数値と同じ番号で和をとる 102
  103. 103. Nを∞にすると・・・離散 連続 xn xP x  px dx  
  104. 104. Nを∞にすると・・・x  n  i1 n 1 i 1 n  , if   Pxi   u   Pxi    x x    x , if   pxdx  u   pxdx     104
  105. 105. FX x   pxdx  u x 1 両辺に F X かける x  F u  1 X 105
  106. 106. 逆変換法とは(再掲)1. [0,1]区間の一様乱数 u を取得 12. x  FX u として x を計算 3. x は累積分布関数 FXからの乱数[0,1)の乱数 変換 FX からの乱数(例:0.1153…, 0.892…, 0.722…) 1 u FX x 106
  107. 107. 逆変換法とは(再掲)1. [0,1]区間の一様乱数 u を取得 12. x  FX u として x を計算 3. x は累積分布関数 FXからの乱数[0,1)の乱数 変換 FX からの乱数(例:0.1153…, 0.892…, 0.722…) 1 u FX x 107
  108. 108. ぎゃ、逆変換法じゃねーか! 108
  109. 109. Congratulation!!! 109
  110. 110. まとめ二択・三択の練習問題 一般化 N択のくじ引き N→∞ 逆変換法 110

×