Skip to content

Commit 4ea46a3

Browse files
committed
beta rejection is finished
1 parent f51fc6e commit 4ea46a3

3 files changed

Lines changed: 39 additions & 19 deletions

File tree

code_in_notes/check_random.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
# 画图
1111
import matplotlib.pyplot as plt
1212
# 设定图像大小
13-
plt.rcParams['figure.figsize'] = (10.0, 10.0)
13+
plt.rcParams['figure.figsize'] = (8.0, 5.0)
1414
plt.scatter(x0,x1,color='blue') ## 画出散点图
1515
plt.savefig("check_random_py.eps")

code_in_notes/importance_sampling_beta.py

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,45 @@
66
# 设定参数
77
alpha=4
88
beta=2
9+
# beta分布密度函数
10+
f=lambda x: 1/scisp.beta(alpha,beta)* \
11+
x**(alpha-1) * (1-x)**(beta-1)
912
# 计算密度函数最大值
10-
x_star=(1-alpha)/(2-alpha-beta)
11-
M=1/scisp.beta(alpha,beta)*x_star**(alpha-1)*x_star**(beta-1)
13+
M=f((1-alpha)/(2-alpha-beta))
1214
print(M)
13-
# 随机抽两个均匀分布,一个为(0,1),一个为(0,M),抽300个
14-
N=300
15-
u1=nprd.random(N)
16-
u2=nprd.random(N)*M
15+
# 随机抽两个均匀分布,一个为(0,1),一个为(0,M),抽500个
16+
N=500
17+
x=nprd.random(N)
18+
u=nprd.random(N)*M
19+
# 挑出使得u<beta密度函数的x
20+
accepted=[i for i in range(N) if u[i]<=f(x[i])]
21+
rand_beta=x[accepted] #生成的Beta分布随机数
22+
rand_U_selected=u[accepted]
1723
# 画图
1824
import matplotlib.pyplot as plt
19-
# 设定图像大小
20-
plt.rcParams['figure.figsize'] = (10.0, 10.0)
25+
# 设定图像大小和坐标范围
26+
plt.rcParams['figure.figsize'] = (8.0, 5.0)
27+
plt.xlim(0,1)
28+
plt.ylim(0,M+0.1)
2129
# 横线和竖线
22-
x=
23-
# 标题
24-
plt.xlabel('$u_1$')
25-
plt.ylabel("$u_2$")
26-
plt.title('Relationship of x and y')
27-
plt.scatter(u1,u2,color='blue') ## 画出散点图
30+
x_grid=np.linspace(0,1,100)#(0,1)均匀的100个点
31+
y_M=np.ones(100)*M
32+
beta_dens=f(x_grid)
33+
y1=np.linspace(0,f(0.4),20)
34+
y2=np.linspace(f(0.4),M,20)
35+
x_hline=np.ones(20)*0.4
36+
plt.xlabel(r'$X$')
37+
plt.ylabel(r'$U$')
38+
plt.title('Sampling from Beta dist.') # 标题
39+
## 画出散点图
40+
plt.scatter(x,u,color='blue',s=0.8)
41+
plt.scatter(rand_beta,rand_U_selected,color='black',s=0.8)
42+
plt.plot(x_grid,y_M,color='red') ## 最大值
43+
plt.plot(x_grid,beta_dens,color='orange') ## 密度函数
44+
plt.plot(x_hline,y1,color='grey') ## 接受区域
45+
plt.text(0.42,0.3,"Acceptance",fontsize=15,
46+
horizontalalignment="left")
47+
plt.plot(x_hline,y2,color='pink') ## 拒绝区域
48+
plt.text(0.38,1.5,"Rejection",fontsize=15,
49+
horizontalalignment="right")
2850
plt.savefig("importance_sampling_beta.eps")

code_in_notes/rejection.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,17 @@
2424
sample2=[] #结果
2525
# 计算参数
2626
lam=(c+np.sqrt(c**2+4))/2
27-
M=np.exp((lam**2-2*lam*c)/2)/(np.sqrt(2*np.pi)*
27+
M=np.exp((lam**2-2*lam*c)/2)/(np.sqrt(2*np.pi)* \
2828
lam*(1-scisp.ndtr(c)))
2929
normal_m=1/np.sqrt(2*np.pi) #正态分布密度函数前面的常数
3030
while accept<N:
3131
## 产生指数分布
3232
x=-1*np.log(nprd.uniform())/lam+c
3333
## 接受概率
34-
r=normal_m*np.exp(-1*(x-c)**2/2)/(M*
34+
r=normal_m*np.exp(-1*(x-c)**2/2)/(M* \
3535
lam*np.exp(-1*lam*(x-c)))
3636
if nprd.uniform()<r:
3737
sample2.append(x)
3838
accept=accept+1
3939
times=times+1
4040
print("接受率=",N/times)
41-
print(sample1)
42-
print(sample2)

0 commit comments

Comments
 (0)