レプリカ交換モンテカルロ法で乱数の生成

8,282 views
8,051 views

Published on

第五回Tokyo.Scipyでのトーク資料です。

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

No Downloads
Views
Total views
8,282
On SlideShare
0
From Embeds
0
Number of Embeds
4,045
Actions
Shares
0
Downloads
35
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

レプリカ交換モンテカルロ法で乱数の生成

  1. 1. 第5回Tokyo. ciPyレプリカ交換モンテカルロ法 で乱数の生成 @teramonagi
  2. 2. 目次1. 自己紹介2. モチベーション3. マルコフ連鎖モンテカルロ法4. レプリカ交換モンテカルロ法5. まとめ 2
  3. 3. 1. 自己紹介 3
  4. 4. 自己紹介• @teramonagi• Numpy/Scipy歴:2年程度• Tokyo. でお世話になっております• 仕事:半導体→金融• 言語:C++/R/python/VBA/F#• 興味:数理/Simulation/データ分析 4
  5. 5. 2. モチベーション 5
  6. 6. (主に私の)モチベーション• 乱数をよく生成するので、統一的な 共通の枠組で楽に乱数生成したい –「○○分布の時はA法、××分布 の時はB法を使う」は面倒• 出来れば確率密度関数を指定する だけでOKな仕組みが欲しい 6
  7. 7. そんな貴方の我儘を 適える素敵な魔法 7
  8. 8. 3. マルコフ連鎖モンテカルロ法 8
  9. 9. マルコフ連鎖モンテカルロ法• 略して –MCMC(Markov Chain MonteCarlo)• 指定した確率(密度)関数に従う乱 数をマルコフ連鎖を活用することで 生成するモンテカルロ法のこと• かなり汎用的な枠組み 9
  10. 10. MCMCの詳しい話は…• 【パターン認識と 機械学習 下】の 11章、サンプリ ング法を参照 10
  11. 11. 細かい突っ込んだ話は…• 【計算統計 2 マ ルコフ連鎖モン テカルロ法とそ の周辺】を参照 11
  12. 12. MCMCの直感的な説明• 標本空間上の点を逐次的に移動• 今いる所の近所に移動、確率密度 の高い付近でちょっと長居、そして またウロウロする手法 小確率密度 大 標本空間上の点 12
  13. 13. MCMCの直感的な説明図:MCMCでサンプリングされる点の軌跡イメージ (2次元正規分布) 13
  14. 14. MCMC(メトロポリス法)1. #適当なサイズだけ回す2. SIZE = 100003. #初期状態を生成4. x = [initial()] * SIZE5. for i in range(1,SIZE):6. #①:現在の状態から次の状態(候補)を選定7. x_proposed = propose_next(x[i])8. #②:確率密度の比を計算,target=密度関数9. ratio = target(x_proposed) / target(x[i])10. #③:一様乱数と比較し、遷移 or 元の状態のままを決定11. if(np.random.uniform(size=1) < ratio):12. x[i] = x_proposed13. else:14. x[i] = x[i-1] Code:メトロポリス法実装例 in python 14
  15. 15. MCMCで正規分布の生成• 平均・標準偏差がそれぞれ ( ,  ) : となる正規分布 N x |   を生成(次元は2次元に設定)• 平均(3,3),標準偏差2行2列の単位 行列として設定• メトロポリス法を10,000回試行 15
  16. 16. MCMCで正規分布の生成 図:2次元正規分布 by MCMC 16
  17. 17. MCMCで正規分布の生成図:2次元正規分布の周辺分布(青)by MCMC と、その確率密度(赤線) 17
  18. 18. 実際のコード(一部)1. #正規分布の平均値2. MU = 3.03. #シミュレーション・サイズ4. SIZE_SIMULATION = 100005. X0 = np.array([0,0])6. #次候補の選定関数7. propose_next = lambda x:x+0.5*np.random.normal(size=len(x))8. #target関数&MCMCオブジェクト生成9. target = generate_target(MU)10. mcmc = pyremc.MCMC(X0, target, propose_next, 10)11. #MCMC実行12. x = X013. for i in range(SIZE_SIMULATION):14. x = np.vstack((x, mcmc.next()))15. plot_result(x, MU) Code:シミュレーションコード一部抜粋 in python 18
  19. 19. MCMCで正規分布生成• 結果(概要) –X方向:平均:3.05,標準偏差:1.03 –Y方向:平均:3.00,標準偏差:1.03• うまくいっているように思える• これはいい方法ダゾ!!! 19
  20. 20. 混合正規分布• 正規分布の重ね合わせで表現され る分布 N• 密度関数: px   wi N x |  i  i 1• パラメータ N : 正規分布の混合数 wi : 混合ウェイト([0,1]) 20
  21. 21. 混合正規分布の例(1次元) 図:1次元混合正規分布の例(平均±3,ウェイト3:7,標準偏差1(共通),混合数2) 21
  22. 22. MCMCで混合正規分布生成• 2次元の混合正規分布を生成 –混合数:2 –パラメータ  1 0  1 ,  1 , w1    2,2,   ,0.3  0 1       1 0  2 ,  2 , w2     2,2,   ,0.7  0 1     • メトロポリス法を10,000回試行 22
  23. 23. MCMCで混合正規分布生成 図:2次元混合正規分布 by MCMC 23
  24. 24. MCMCで混合正規分布生成• 2次元の混合正規分布を生成 –混合数:2 –パラメータ  1 0  1 ,  1 , w1    3,3,   ,0.3  0 1       1 0  2 ,  2 , w2     3,3,   ,0.7  0 1     • メトロポリス法を10,000回試行 24
  25. 25. MCMCで混合正規分布生成 図:2次元混合正規分布 by MCMC 25
  26. 26. MCMCで混合正規分布生成 図:2次元混合正規分布 by MCMC 26
  27. 27. うまくいかない理由• MCMC(メトロポリス法)は確率が高い 場所の側もまた高い確率を持つだろう という思想が根底にある。• MCMC(メトロポリス法)≒局所的な探索。 確率が連続でほぼに0なるような深い 谷を越えることは難しい• どうにかうまくやれる方法はないか? 27
  28. 28. 4. レプリカ交換モンテカルロ法 28
  29. 29. レプリカ交換モンテカルロ法• 異なるパラメータを持つ確率分布(レプリカ) を考えてそれらを交換するモンテカルロ法 –Replica Exchange MonteCarlo(REMC)• 別名:パラレル・テンパリング法• 元々はスピングラスのシミュレーション手法 – Hukushima-Nemoto, (1996), Multiple coupled Markov chain MC , Parallel tempering – Swendsen RH and Wang JS (1986) Replica Monte Carlo simulation of spin glasses Physical Review Letters 57 29
  30. 30. REMCのアルゴリズム1. 異なるパラメーターを持つ系を同 時・並列にMCMC2. 各MCMC間の位置をメトロポリス 法等で入れ替える3. 1と2を繰り返す※今扱っている問題だと、パラメータは平均ベクトルに該当 30
  31. 31. 1:異なるパラメーター系のMCMC   3,3 メトロポリス法 でイケる    2,2    1,1メトロポリス法 でイケない 図:平均ベクトルのみが異なる3つのレプリカ系 31
  32. 32. 1:異なるパラメーター系のMCMC   3,3 独立に MCMCを実行    2,2 レプリカ①    1,1 レプリカ② レプリカ③ 32
  33. 33. 2:位置の交換 2つのレプリカを選択レプリカ① レプリカ② 33
  34. 34. 2:位置の交換 位置を交換!レプリカ① レプリカ② 34
  35. 35. REMCのコード1. self._counter+=12. #①:全てのレプリカをMCMCで回す3. for index_replica in range(self._replica_size):4. self._mcmcs[index_replica].next()5. #②:適当な交換頻度で位置の交換6. if(self._counter % self._exchange_frequency == 0):7. index_exchange = int(np.random.uniform(0, self._replica_size-1))8. x1 = self._mcmcs[index_exchange ].x9. x2 = self._mcmcs[index_exchange+1].x10. target1 = self._mcmcs[index_exchange ]._target11. target2 = self._mcmcs[index_exchange+1]._target12. #③:位置の交換はメトロポリス法に従う形で実行13. if(np.random.uniform(size=1) < (target1(x2)*target2(x1))/(target1(x1)*target2(x2))):14. self._mcmcs[index_exchange].x, self._mcmcs[index_exchange+1].x = np.copy(x2),np.copy(x1) Code:REMC実装例(一部抜粋) in python 35
  36. 36. REMCで混合正規分布生成    3,3 図:2次元混合正規分布 by REMC 36
  37. 37. REMC vs MCMC   3,3    3,3 図:REMC vc MCMCREMCの場合、確率が非常に小さくなる領域を乗 り越えて移動できている様子がわかる 37
  38. 38. うまくいったね! 38
  39. 39. 5. まとめ 39
  40. 40. まとめ• 汎用的な乱数生成法としてMCMCを紹 介• MCMCではうまくいかないようなケース に対してREMCを適用• 結果、REMCだと比較的うまくいくようだ• 分布依存部分をもっとうまく切り分けた い。。。 40
  41. 41. Source code is available here…github.com/teramonagi/Pyremc 41

×