$\Large \displaystyle p(\theta|X)=\frac{p(X|\theta)p(\theta)}{p(X)}$
$\Large \displaystyle \int p(\theta|X)d\theta=\int \frac{p(X|\theta)p(\theta)}{p(X)}d\theta=1$
$\Large \displaystyle p(X)=\int p(X|\theta)p(\theta)d\theta$
$\Large \displaystyle E[X]=\int xp(x)dx$
$\Large \displaystyle E[X] \approx \frac{1}{N}\sum_{i=1}^{N}x_i$
$\Large \displaystyle p(x_t|x_{t-1},x_{t-2},\cdots)=p(x_t|x_{t-1})$
$\Large \displaystyle p(x_0,\cdots,x_t)=p(x_0)p(x_1|x_0)\times\cdots\times p(x_t|x_{t-1},\times,x_0)$
$\Large \displaystyle =p(x_0)\prod_{i=1}^{t}p(x_i|x_{i-1})$
$\Large \displaystyle p(x_i|x_{i-1})=N(\rho x_{i-1},\sigma^2)$
$\Large \displaystyle X_t\sim P$
$\Large \displaystyle \tilde{\theta}\leftarrow q(\theta^{(t-1)},\theta)$
以上
本節は、「 Pythonによるマルコフ連鎖モンテカルロ法(MCMC) 」を引用している。
# coding: UTF-8 import numpy as np import matplotlib.pyplot as plt #print(np.arange(3,10,2)) #forループで乱数の数を変えて計算(start=1000,stop=500000+1,step=1000) N_monte_list=np.arange(1000,500000+1,1000) #結果を格納するリストを作成 sampling_rate_list=[] for N_monte in N_monte_list: x_data=np.random.rand(N_monte) y_data=np.random.rand(N_monte) print("N_monte",N_monte) #1000~5000000 #print("x_data", x_data) #0~1の乱数(x用) #print("y_data", y_data) #0~1の乱数(y用) sampling_rate=np.sum((x_data**2+y_data**2)<1)/N_monte print("sampling_rate", sampling_rate) sampling_rate_list.append(sampling_rate) plt.plot(N_monte_list,sampling_rate_list) plt.xlabel('N_monte') #plt.savefig('./figure/fig_montecalro.jpg') plt.show()
$\Large \displaystyle \beta(x|\alpha,\beta)=\frac{x^{\alpha-1}(1-x)^{\beta-1}}{\int_0^1[t^{\alpha-1}(1-t)^{\beta-1}]dt}$
#Beta分布 X=np.arange(0,1,0.02) dist_1=beta.pdf(X,1.5,2) plt.plot(X,dist_1,label='α=1.5,β=2') plt.legend() plt.xlabel('x') plt.ylabel('Probabirity') #plt.savefig('./figure/fig_beta.jpg') plt.show()
$\Large \displaystyle f(x)\leq Mg(x)$
$\Large \displaystyle r(x)\leq p(x)$
# coding: UTF-8 #ライブラリインポート import numpy as np import matplotlib.pyplot as plt from scipy.stats import beta,uniform from scipy import optimize #グラフの見た目変更 plt.style.use("ggplot") #乱数のSeedを固定 np.random.seed(999)
#Beta分布のパラメータ設定 a,b=1.5,2 #x軸を作成 x=np.linspace(beta.ppf(0.001,a,b),beta.ppf(0.999,a,b),1000) #Beta関数の密度関数を定義 p=beta(a,b).pdf #最大化された結果(x座標)を取得 res=optimize.fmin(lambda x:-p(x),0.3) #最大化された結果(y座標)を取得 y_max=p(res)
#サンプリング数 NMCS=50000 #x軸方向のサンプリング(0~1の区間でサンプリング) x_mcs=uniform.rvs(size=NMCS) #y軸方向のサンプリング(0~y_maxの区間でサンプリング) r=uniform.rvs(size=NMCS)*y_max
#Beta分布以下かどうかの条件判定 accept=x_mcs[r<=p(x_mcs)] #結果の表示 plt.hist(accept,density=True,bins=30,rwidth=0.8,label='rejection sampling') plt.plot(x,beta.pdf(x,a,b),label='Target') plt.legend() #plt.savefig('./figure/fig_rejection_sampling.jpg') plt.show()
Optimization terminated successfully. Current function value: -1.443376 Iterations: 10 Function evaluations: 20
以上
以上
//ウィンドウを1行2列に分割した左側部分を選択 subplot(1,2,1); x=[0:0.1:2*%pi]'; plot2d(sin(x)); //右側部分を選択 subplot(1,2,2); x=[0:0.1:2*%pi]'; plot2d(x,sin(x));
clf() x=[0:0.1:2*%pi]'; subplot(1,4,1); plot2d(x,sin(x)); subplot(1,4,2); plot2d2(x,sin(x)); subplot(1,4,3); plot2d3(x,sin(x)); subplot(1,4,4); plot2d4(x,sin(x));
以上