マルコフ連鎖モンテカルロ法(マルコフ連鎖モンテカルロ法、以下、MCMCをいう)は、ランダムサンプリング法、機械学習、学習及び深さとしてNLPフィールドは広い用途を有し、多くの複雑なアルゴリズムの基礎です。例えば、逆アセンブラ(因数分解機、FM)推薦アルゴリズムと同様に、制限されたボルツマンマシン(RBM)は、複雑な計算におおよその解決を行うためにMCMCを使用しています。
私たちは、名前からわかるMCMCは二つの部分から成ってマルコフ連鎖とモンテカルロ法。モンテカルロシミュレーションの導入時法マルコフ(マルコフ)は、シミュレーションで達成動的シミュレーションサンプリング分布は、従来の静的モンテカルロ積分シミュレーションのみに、補体を変化させて行います。MCMCを知りたい、我々は最初に徹底的に理解する必要がありマルコフ連鎖とモンテカルロ法の原則を。
マルコフ連鎖
概念を説明します
マルコフ連鎖は、確率過程満たすマルコフ特性です。値は、各状態に依存する前に、マルコフ連鎖X1、X2 ... Xnが、一つの状態(状態のマルコフ連鎖値を状態空間と呼ばれている)状態のシーケンスを記述する。一般に、マルコフ連鎖の インデックスセットは、「ステップ」または「時間ステップ(時間ステップ)」と呼ばれています。
マルコフ連鎖の数学的な定義は次のとおりです。
式マルコフ性の定義では、このプロパティは、すなわち、「非メモリ(memorylessness)」と呼ばれる T確率変数の条件独立確率変数の残りのステップにおいて所与の確率変数の後にT + 1つのステップ(条件付き独立 ): 。これに基づいて、マルコフ連鎖は、前と互いに状態独立を停止マルコフ連鎖の後、強いマルコフ性(強マルコフ性)、すなわち、停止のいずれか(T)(停止時間)を有します。
例マルコフ連鎖
以下の図では、このマルコフ連鎖モデルの具体的な例で見てみましょう。
ブル(強気市場)、熊(ベアマーケット)と横(停滞市場):株式市場は、次の3つの状態があり、マルコフ連鎖モデルです。定義された牛や熊、それぞれ0,1,2横向き状態。
一定の確率で各状態が次の状態に形質転換しました。例えば、0.025ブル確率が横向き状態に形質転換しました。確率状態遷移図は、行列形式で表現することができます。我々はマトリクスアレイ位置P Pを定義する場合(i、j)は 値 | P(I、J) 、即ち、状態iから確率の状態jに。このように、我々は、状態遷移行列のマルコフ連鎖モデルを取得することです:
状態遷移行列Pが決定されると、全体の株式市場のモデルが決定されました!
マルコフ連鎖モデルのコアは、状態遷移行列Pです。いくつかの興味深い何の場所があり、この行列P?次に、別の見てみましょう。
例として、在庫モデルでは、初期状態(確率雄牛とクマ横及び分布)であると仮定し 、状態の後(後の状態を計算しました。
import numpy as np
def markov():
init_array = np.array([0.1, 0.2, 0.7])
transfer_matrix = np.array([[0.9, 0.075, 0.025],
[0.15, 0.8, 0.05],
[0.25, 0.25, 0.5]])
restmp = init_array
for i in range(25):
res = np.dot(restmp, transfer_matrix)
print(i, "\t", res)
restmp = res
if __name__ == "__main__":
markov()
出力は次のようになります。
我々は、初期状態のT_0を変更した場合我々は、上記のコードを継続し、このような[0.2,0.3.0.5]として、[0.624,0.312,0.0625]収束する状態が開始、20日から始まる、出力から見ることができますただINIT_ARRAY変更を見て、最終的な結果は次のとおりです。
到第20次的时候,又收敛到了[0.624,0.312,0.0625] 。不管我们的初始状态是什么样子的,只要状态转移矩阵不发生变化,当n→∞时,最终状态始终会收敛到一个固定值。
我们也看看这个状态转移矩阵P的幂次方有什么有意思的地方?代码如下:
import numpy as np
def matrixpower():
transfer_matrix = np.array([[0.9, 0.075, 0.025],
[0.15, 0.8, 0.05],
[0.25, 0.25, 0.5]])
restmp = transfer_matrix
for i in range(25):
res = np.dot(restmp, transfer_matrix)
print(i,"\n", res)
restmp = res
if __name__ == "__main__":
matrixpower()
代码运行的结果:
0
[[0.8275 0.13375 0.03875]
[0.2675 0.66375 0.06875]
[0.3875 0.34375 0.26875]]
1
[[0.7745 0.17875 0.04675]
[0.3575 0.56825 0.07425]
[0.4675 0.37125 0.16125]]
2
[[0.73555 0.212775 0.051675]
[0.42555 0.499975 0.074475]
[0.51675 0.372375 0.110875]]
3
[[0.70683 0.238305 0.054865]
[0.47661 0.450515 0.072875]
[0.54865 0.364375 0.086975]]
4
[[0.685609 0.2573725 0.0570185]
[0.514745 0.4143765 0.0708785]
[0.570185 0.3543925 0.0754225]]
5
[[0.6699086 0.2715733 0.0585181]
[0.5431466 0.3878267 0.0690267]
[0.585181 0.3451335 0.0696855]]
6
[[0.65828326 0.28213131 0.05958543]
[0.56426262 0.36825403 0.06748335]
[0.5958543 0.33741675 0.06672895]]
7
[[0.64967099 0.28997265 0.06035636]
[0.5799453 0.35379376 0.06626094]
[0.60356362 0.33130471 0.06513167]]
8
[[0.64328888 0.29579253 0.06091859]
[0.59158507 0.34309614 0.06531879]
[0.60918588 0.32659396 0.06422016]]
9
[[0.63855852 0.30011034 0.06133114]
[0.60022068 0.33517549 0.06460383]
[0.61331143 0.32301915 0.06366943]]
10
[[0.635052 0.30331295 0.06163505]
[0.60662589 0.3293079 0.06406621]
[0.61635051 0.32033103 0.06331846]]
11
[[0.63245251 0.30568802 0.06185947]
[0.61137604 0.32495981 0.06366415]
[0.61859473 0.31832073 0.06308454]]
12
[[0.63052533 0.30744922 0.06202545]
[0.61489845 0.32173709 0.06336446]
[0.6202545 0.31682232 0.06292318]]
13
[[0.62909654 0.30875514 0.06214832]
[0.61751028 0.31934817 0.06314155]
[0.62148319 0.31570774 0.06280907]]
14
[[0.62803724 0.30972343 0.06223933]
[0.61944687 0.3175772 0.06297594]
[0.6223933 0.3148797 0.062727 ]]
15
[[0.62725186 0.31044137 0.06230677]
[0.62088274 0.31626426 0.062853 ]
[0.62306768 0.31426501 0.06266732]]
16
[[0.62666957 0.31097368 0.06235675]
[0.62194736 0.31529086 0.06276178]
[0.62356749 0.31380891 0.0626236 ]]
17
[[0.62623785 0.31136835 0.0623938 ]
[0.6227367 0.31456919 0.06269412]
[0.62393798 0.31347059 0.06259143]]
18
[[0.62591777 0.31166097 0.06242126]
[0.62332193 0.31403413 0.06264394]
[0.62421263 0.31321968 0.0625677 ]]
19
[[0.62568045 0.31187792 0.06244162]
[0.62375584 0.31363743 0.06260672]
[0.62441624 0.31303361 0.06255015]]
20
[[0.6255045 0.31203878 0.06245672]
[0.62407756 0.31334332 0.06257913]
[0.62456719 0.31289565 0.06253716]]
21
[[0.62537405 0.31215804 0.06246791]
[0.62431608 0.31312525 0.06255867]
[0.62467911 0.31279335 0.06252754]]
22
[[0.62527733 0.31224646 0.06247621]
[0.62449293 0.31296357 0.0625435 ]
[0.62476209 0.3127175 0.06252042]]
23
[[0.62520562 0.31231202 0.06248236]
[0.62462404 0.3128437 0.06253225]
[0.62482361 0.31266126 0.06251514]]
24
[[0.62515245 0.31236063 0.06248692]
[0.62472126 0.31275483 0.06252391]
[0.62486922 0.31261956 0.06251122]]
从第20次开始,结果开始收敛,并且每一行都为 [0.624,0.312,0.0625]。
我们再来看一个例子:
平稳分布和收敛
蒙特卡罗方法大致可以粗略地分成两类:
一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。
另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。
蒙特卡洛方法
概念解释
蒙特卡洛方法示例——布丰投针
蒙特卡洛方法示例——求积分
投点法
如下图所示,有一个函数f(x),若要求它从a到b的定积分,其实就是求曲线下方的面积。
期望法(平均值法)
概念解释
期望法分析
假设要计算的积分如下:
其中被积函数 g(x) 在[a,b]内可积。如果选择一个概率密度函数为的方式进行抽样(随机变量 X),并且满足,原有的积分可以写成如下形式:
:
也就是说(强大数定律):
我们令
我们再来梳理一下:
因而求积分的步骤如下:
在期望法求积分中
具体步骤变为:
期望法的直观解释:
其中的就是均匀分布的PDF(或者PMF)。