update
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
"""
|
||||
This code is supported by the website: https://www.guanjihuan.com
|
||||
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/1247
|
||||
"""
|
||||
|
||||
import random
|
||||
import math
|
||||
import numpy as np
|
||||
from scipy.stats import norm
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
def function(x): # 期望样品的分布,target distribution function
|
||||
y = (norm.pdf(x, loc=2, scale=1)+norm.pdf(x, loc=-5, scale=1.5))/2 # loc代表了均值,scale代表标准差
|
||||
return y
|
||||
|
||||
|
||||
T = 100000 # 取T个样品
|
||||
pi = [0 for i in range(T)] # 任意选定一个马尔科夫链初始状态
|
||||
for t in np.arange(1, T):
|
||||
pi_star = np.random.uniform(-10, 10) # a proposed distribution, 例如是均匀分布的,或者是一个依赖pi[t - 1]的分布
|
||||
alpha = min(1, (function(pi_star) / function(pi[t - 1]))) # 接收率
|
||||
u = random.uniform(0, 1)
|
||||
if u < alpha:
|
||||
pi[t] = pi_star # 以alpha的概率接收转移
|
||||
else:
|
||||
pi[t] = pi[t - 1] # 不接收转移
|
||||
|
||||
pi = np.array(pi) # 转成numpy格式
|
||||
print(pi.shape) # 查看抽样样品的维度
|
||||
plt.plot(pi, function(pi), '*') # 画出抽样样品期望的分布 # 或用plt.scatter(pi, function(pi))
|
||||
plt.hist(pi, bins=100, density=1, facecolor='red', alpha=0.7) # 画出抽样样品的分布 # bins是分布柱子的个数,density是归一化,后面两个参数是管颜色的
|
||||
plt.show()
|
Reference in New Issue
Block a user