まず、直接サンプリング
私たちは、直接サンプリングが均等にランダムに分布のサンプリングを実現するために、サンプルを通じて配布されると思いました。良い推測が均等に我々が悪いピックをしたい分布をサンプリングし、サンプリングを配布しますので、それは単純な要求で採択されたいくつかの複雑なサンプリング戦略を取るだろう。
Yは、サンプルZ〜制服(0,1)、我々はせと、累積分布関数CDFのH(Y)であり、分布p(y)を、従うものとするZ =さh(Y)、すなわち、Y = hの(Z)^ (-1)、yは分布P(Y)のサンプリングの結果です。
CDFと逆変換と直接サンプリングの核となるアイデアの応用。元の分布p(Y)において、大配信エリアCDFに[a、b]は、対応する曲線と、曲線の傾きの[H(A)、H(B)]が大きくなります。さらに大きな得られ、その後、逆変換した後、Y軸(z)のサンプリングされた均一に分布し、マルチパートプロファイル(ポリ占めるY軸部分)に対応する確率サンプル
制限
実際には、すべてのサンプルの分布は、より複雑であり、逆関数を解くCDFを解決可能ではありません。
第二に、サンプリングを拒否
サンプルはサンプリング開始サンプリングアルゴリズムの簡単な分布は、直接サンプリングすることは困難である試料の一般的な分布を生成することによって拒絶されます。P(x)はプログラムで複雑すぎる直接サンプリングすることができないので、それは、ガウス分布のようなサンプルの分布q(X)であってもよく、一定に係る方法は、オブジェクト近いP(x)の分布を達成するために、サンプルの一部を拒絶します。
計算ステップ
便利な標本化関数Q(X)、及び定数Kを設定し、そのようなP(X)の合計のk *のQ(x)は以下です。(上記参照)
- x軸:の分布をサンプリングして得られたQ(X)から。
- y軸方向:Uをサンプリングして得られた均一な分布から(0、k個* qを(a)参照)。
- それは右の灰色の領域に落ちた場合:U> P(a)に示すように、このまたはサンプリングを受け入れることを拒否しました。
- プロセスを繰り返します。
算出ステップ(BN)
- 事前確率分布ネットワークは、サンプリングされたサンプルを生成指定しました。
- サンプルに一致しないすべての証拠を拒否。
- 入射X = X頻繁カウントのレベルの残りのサンプルで推定された確率を得るために、
制限
- 拒否された、あまりにも多くのサンプル!変数の数の増加の証拠として、証拠は、全てのサンプルに占めるサンプルEの割合が指数関数的に減少するので、このアプローチの問題は完全に使用不能に複雑であると一致しています。
- 確率は低いかもしれない受け入れるためには、適切なk個の* qを(A)を見つけるのは難しいです。
第三に、重点サンプリング(尤度重み付け)
重要度サンプリングは、主の複雑な分布p(x)を見つけるために使用された平均値を、最後には、サンプルを取得できませんでした。
この単純な分布q(x)は、すべての受け入れの得られた試料の容易なサンプリングによる重要度サンプリング分布q(X)のシンプルなアイデア。しかし、これは確かに得られた試料分布p(X)を満たしていない、それは重要性重みを対応するそれぞれの追加のサンプルのために必要です。各試料の重量の値としてP(X0)/ Q(X0)のサンプリングの重要性。このように、サンプルおよび分布p(x)の対応する重みと同様に大きく、分布p(x)の大きな違い、小さな重みを対応します。試料を乗じた量の結果は、P(z)の分布に実際に対象とした後に、このアプローチは、Q(Z)分布に従う権利の重要性の試料重量でサンプリングされます。
上記の式を通じ、サンプリングの重要性は平均複雑な分布を近似するために使用することができます知ることができます。
第四に、ギブスサンプリング
E:例を考え遊ぶ、学ぶ、食べると、時間がT:午前、午後、夕方、天候W:晴れ、風が強く、雨。試料(E、T、W)が一定の確率分布を満たします。プレイ+ +晴れた日の午後:今、私たちのような、サンプリングすることにしたいです。
問題は、我々がp(E、T、W)を知らないということである 、 またはそれは、三つの同時分布を知りません。知られている場合はもちろん、ギブスサンプラーを使用する必要はありません。しかし、私たちは三つの条件付き分布を知っています。(| T、W E言い換えれば、P IN )、P(T | E、W)、P(W | E、T)。今ギブスサンプリング法の分布を、既知の3つの条件を介して行われ、その後、関節の分布を得るために。
具体的な方法:まず、ランダムな初期設定の組み合わせ、すなわち学習+ +風の強い夜は、変数条件付き確率に応じて変更します。具体的には、我々は風の強い夜+知っていると仮定し、我々は→食べ学習、例えば、Eは、変数を生成与えます。私たちは、変数の下に変更の条件付き確率に従って、学習+風によると、夜は朝になりました。同様に、風に風が(もちろん、同じ変数になることができます)。このような学習+夕食+夜+朝+→風の強い風が強いです。同様に配列、それぞれ含む3つの変数、すなわち、マルコフ連鎖を得ました。次いで、一定数(取る例えばスペーサ20)を取るために(例えば100など)は、初期細胞の一定数、及びセパレータユニットをスキップします。ユニットへのそのようなサンプルは、同時分布に近づいています。
第五に、サンプル容器
即ちリザーバ(貯水池サンプリング)、サンプリング、Nは、例えば、データのO(N)時間ランダム確率のように行うことができる。抽出された1000の媒体確率データ100から。データ収集の量が(未知のデータセットの合計量に相当する)は、特に大きいまたは成長している場合に加えて、アルゴリズムは依然として等しい確率サンプリングすることができます。
アルゴリズムのステップ:
- 第一セットAに格納されたデータストリームの最初のk個の要素を選択します。
- J(K + 1 <= jの<= n)の要素が確率pを有する第1の起動時から= K / jはj番目の要素は左かを選択します。Jが選択された場合、ランダム要素Aから選択され、要素jに置き換えられ、そうでない場合、直接要素のうち。
- 最後の集合Aの終了まで繰り返し、ステップ2は、ランダムに残りのk個の要素ことを保証することです。
六、MCMCアルゴリズム
マルコフ連鎖の収束定理
マルコフ連鎖定理:遷移確率行列Pを有する非周期的なマルコフ連鎖の場合、その二つの状態のいずれかが通信している場合、\(\ lim_ {Pの\にする inftyのを\} P_ {IJ} ^ N \) 本そして、表される、Iから独立している(P_の\ lim_ {P \はinftyのに\} N- = \ PI(J)\の^ {} IJ)\、我々が持っています:
前記\(\ PI = [\ PI (1)、\のPI(2)、...、\ PI(J)、...]、\ sum_ {i = 0} ^ {\ inftyの} \ pi_i = 1 、\パイ\)は、マルコフ連鎖の定常分布と呼ばれています。
全てMCMC(マルコフ連鎖モンテカルロ法)の方法は理論的な基礎として定理に基づいています。
説明:
- マルコフ連鎖定理の状態が制限を必要としない、無限の複数であってもよいです。
- 私たちが遭遇したマルコフ連鎖の大半は非周期的であるため、定理「非周期的」という概念は、説明されていません。
スムーズかつ詳細な条件
新しいディストリビューションのために、どのように対応する遷移行列を構築するには?
配布用の\(\ PI(X)\)によれば、詳細な安定した状態であれば、転送行列Pの構成を満たし、(PI \ P_ {のIJ} =の\ PI(I)P_ {JI} \の(J))\、次いで\(\ PI(x)が\ ) マルコフ連鎖の遷移行列の定常分布であるが、この条件に応じて構築することができます。
典型的には、初期遷移行列\(P \)は、一般に詳述定常条件を満たさない場合、新たな受け入れ率導入することによって、遷移行列を構築する\(P「を\)ので、および\(\ PI(X)\ )細心の安定した状態を満たすことができます。したがって、我々は、状態間の遷移確率のような任意の遷移確率行列(均一な分布、ガウス分布)を使用することができます。
我々は状態間の遷移確率が同じであると仮定すると、アルゴリズムの受信率は、単に使用する必要があります\(\パイ(J)/ \パイ(i)を\) 表現。
メトロポリス - ヘイスティングスサンプリング
与えられた確率分布p(x)のために、私たちはそれに対応するサンプルを生成するための便利な方法があると思っています。マルコフ連鎖は、定常分布に収束させることができるので、非常に素晴らしいアイデアがあるので:マルコフ連鎖の定常分布をp(x)が正確であるように、我々はマルコフ連鎖Pの遷移行列を構築することができるならば、我々はから初期状態X0のマルコフ連鎖移動に沿った任意の出発は、転送XN⋯、シーケンスX0、X1、X2を取得するために、XN + 1⋯,,マルコフ連鎖は、ステップnで収束し、私たちはπを取得している場合(x)は、サンプルがxn + 1⋯、xnは。
マルコフ連鎖の状態において、各状態は、サンプル表す\(x_nに関するの\) 、即ち、すべての変数の割り当てを。
MCMCソースが知ることができる分析することによって:仮説間で同じ状態遷移確率を、次いで、試料上の次のサンプルは、サンプルに依存するであろう。サンプルに対応する元の確率分布と仮定すると、\(\ PI(x)が\ ) 、試料1の高確率の受け入れ率小さく、一方、元のサンプルの確率分布場合\(\ PI(X )\)その後、次の大きな確率サンプルが拒否され、大規模です。この機構は確実に配信に得られた試料対象\(\ PI(X-)\) 。
初期状態が非常に小さい場合、上記の分析から、確率分布は、サンプルに対応し、動作中に生成されたサンプルの初めにアルゴリズム(試料のも非常に小さい確率分布)が受信される可能性が非常に高い、アルゴリズムようサンプリングは、オリジナルの配布満たしていないサンプルを実行し始めた\(\ PI(X-)を\) 。限り大きい分布確率サンプルにサンプリングアルゴリズム(AS この場合は収束である!)、そしてサンプリングされたサンプルの後に、基本的に元の分布に従うであろう。もちろん、あなたが大規模な状態に初期状態確率分布からトラバースするとき、このプロセスは、収束プロセスとして知られている一定の期間のために実行する必要があります。確率の分布を確実にする収束後のMCMCアルゴリズム\(\パイ(X)\ ) より多くのサンプルを生成するために、大きな場所、分布確率\(\パイ(X)\ ) 小さな地元の食材少ないサンプル。
定常状態に到達するために複数の用途を通過するマルコフ状態遷移処理は、この時間は、サンプルでは、実際の分布に比較的近かったです。このプロセスが呼び出されるに書き込み。一般的にN個のサンプルの結果の前に火傷を破棄することにより達成することができます。
疑い
MCMCの収束それは何を意味するのでしょうか?このプロセスは、どのようなパラメータに更新されます収束につながっていますか?とき収束を確認する方法?
いいえ収束プロセス・パラメータは、多数のアイデア同様の法則の収束を更新されません。MCMCサンプリングアルゴリズム、初期の小さなサンプルサイズを適用すること、および配布は、複雑な配布対象できる(\ \ PI(X)は\ ) に基づいて、非常に遠く異なるが、状態遷移(APP転送行列P)の数として定理の証明は、最終サンプルの分布が徐々に複雑な流通従います\(\ PI(X-)を\) 。
\(\パイ\)は、各状態の確率分布は、それに対応しているのですか?そう、初めの状態、選択された場合は、\(\パイ\)をどのように設定するには?MCMCまたは認証プロセス、初期には\(\パイ\)設定方法の確率分布の?
MCMCプルーフにおいて、\(\ PI \)は、各状態の確率分布が相当です。初期所与プルーフ\(\ PI \)だけ得られた試料の一定数の転送後、分散されたものに沿って初期サンプルは、複雑な配信の対象となるかどうかを証明するべきである\(\ PI(X-)\)で、このなしの実際のコードの実装、\(\パイ\)が設定されています。
七、コード
import numpy as np
import random
import matplotlib.pyplot as plt
import pandas as pdf
拒絶サンプリング
def f(x):
if 0 <= x and x <= 0.25:
y = 8 * x
elif 0.25 < x and x <= 1:
y = (1 - x) * 8/3
else:
y = 0
return y
def g(x):
if 0 <= x and x <= 1:
y = 1
else:
y = 0
return y
def plot(fun):
X = np.arange(0, 1.0, 0.01)
Y = []
for x in X:
Y.append(fun(x))
plt.plot(X, Y)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
plot(f)
plot(g)
def rejection_sampling(N=10000):
M = 3
cnt = 0
samples = {}
while cnt < N:
x = random.random()
acc_rate = f(x) / (M * g(x))
u = random.random()
if acc_rate >= u:
if samples.get(x) == None:
samples[x] = 1
else:
samples[x] = samples[x] + 1
cnt = cnt + 1
return samples
s = rejection_sampling(100000)
X = []
Y = []
for k, v in s.items():
X.append(k)
Y.append(v)
plt.hist(X, bins=100, edgecolor='None')
MCMCサンプリング
メトロポリス - ヘイスティングスアルゴリズム
PI = 3.1415926
def get_p(x):
# 模拟pi函数
return 1/(2*PI)*np.exp(- x[0]**2 - x[1]**2)
def get_tilde_p(x):
# 模拟不知道怎么计算Z的PI,20这个值对于外部采样算法来说是未知的,对外只暴露这个函数结果
return get_p(x)
def domain_random(): #计算定义域一个随机值
return np.random.random()*3.8-1.9
def metropolis(x):
new_x = (domain_random(),domain_random()) #新状态
#计算接收概率
acc = min(1,get_tilde_p((new_x[0],new_x[1]))/get_tilde_p((x[0],x[1])))
#使用一个随机数判断是否接受
u = np.random.random()
if u<acc:
return new_x
return x
def testMetropolis(counts = 100,drawPath = False):
plt.figure()
#主要逻辑
x = (domain_random(),domain_random()) #x0
xs = [x] #采样状态序列
for i in range(counts):
xs.append(x)
x = metropolis(x) #采样并判断是否接受
#在各个状态之间绘制跳转的线条帮助可视化
X1 = [x[0] for x in xs]
X2 = [x[1] for x in xs]
if drawPath:
plt.plot(X1, X2, 'k-',linewidth=0.5)
##绘制采样的点
plt.scatter(X1, X2, c = 'g',marker='.')
plt.show()
testMetropolis(5000)
def metropolis(x):
new_x = domain_random()
#计算接收概率
acc = min(1,f(new_x)/f(x))
#使用一个随机数判断是否接受
u = np.random.random()
if u<acc:
return new_x
return x
def testMetropolis(counts = 100,drawPath = False):
plt.figure()
#主要逻辑
x = domain_random()
xs = [x] #采样状态序列
for i in range(counts):
xs.append(x)
x = metropolis(x) #采样并判断是否接受
#在各个状态之间绘制跳转的线条帮助可视化
plt.hist(xs, bins=100, edgecolor='None')
# plt.plot(xs)
plt.show()
testMetropolis(100000)
ギブスサンプリング
def partialSampler(x,dim):
xes = []
for t in range(10): #随机选择10个点
xes.append(domain_random())
tilde_ps = []
for t in range(10): #计算这10个点的未归一化的概率密度值
tmpx = x[:]
tmpx[dim] = xes[t]
tilde_ps.append(get_tilde_p(tmpx))
#在这10个点上进行归一化操作,然后按照概率进行选择。
norm_tilde_ps = np.asarray(tilde_ps)/sum(tilde_ps)
u = np.random.random()
sums = 0.0
for t in range(10):
sums += norm_tilde_ps[t]
if sums>=u:
return xes[t]
def gibbs(x):
rst = np.asarray(x)[:]
path = [(x[0],x[1])]
for dim in range(2): #维度轮询,这里加入随机也是可以的。
new_value = partialSampler(rst,dim)
rst[dim] = new_value
path.append([rst[0],rst[1]])
#这里最终只画出一轮轮询之后的点,但会把路径都画出来
return rst,path
def testGibbs(counts = 100,drawPath = False):
plt.figure()
x = (domain_random(),domain_random())
xs = [x]
paths = [x]
for i in range(counts):
xs.append([x[0],x[1]])
x,path = gibbs(x)
paths.extend(path) #存储路径
p1 = [x[0] for x in paths]
p2 = [x[1] for x in paths]
xs1 = [x[0] for x in xs]
xs2 = [x[1] for x in xs]
if drawPath:
plt.plot(p1, p2, 'k-',linewidth=0.5)
##绘制采样的点
plt.scatter(xs1, xs2, c = 'g',marker='.')
plt.show()
testGibbs(5000)
ます。https://www.cnblogs.com/CSLaker/p/9962912.htmlで再現