其他
数学推导+纯Python实现机器学习算法29:马尔可夫链蒙特卡洛
Python机器学习算法实现
Author:louwill
Machine Learning Lab
MCMC简介
在随机变量的状态空间上定义一个满足遍历定理的马尔可夫链,使其平稳分布为目标分布; 从状态空间种某一点出发,在构造的马尔可夫链上进行随机游走,可以得到样本序列; 根据马尔可夫链的遍历定理,确定正整数和,可得样本集合,最后可得函数的遍历均值:
Metropolis-Hasting算法
在状态空间上任意选择一个初始值; 对遍历执行 设状态,按照建议分布抽取一个候选状态。 计算接受概率 从区间上按均匀分布随机抽取一个数,若,则状态;否则。 最后得到样本集合,计算:
from scipy.stats import norm
import random
import matplotlib.pyplot as plt
# 定义平稳分布
def smooth_dist(theta):
y = norm.pdf(theta, loc=3, scale=2)
return y
T = 10000
pi = [0 for i in range(T)]
sigma = 1
# 设置初始值
t = 0
# 遍历执行
while t < T-1:
t = t + 1
# 状态转移进行随机抽样
pi_star = norm.rvs(loc=pi[t - 1], scale=sigma, size=1, random_state=None)
# 计算接受概率
alpha = min(1, (smooth_dist(pi_star[0]) / smooth_dist(pi[t - 1])))
# 从均匀分布中随机抽取一个数u
u = random.uniform(0, 1)
# 拒绝-接受采样
if u < alpha:
pi[t] = pi_star[0]
else:
pi[t] = pi[t - 1]
# 绘制采样分布
plt.scatter(pi, norm.pdf(pi, loc=3, scale=2), label='Target Distribution')
num_bins = 100
plt.hist(pi,
num_bins,
normed=1,
facecolor='red',
alpha=0.6,
label='Samples Distribution')
plt.legend()
plt.show();
之后依次对第个变量按照满条件概率分布进行抽样,最后可得整体样本。
给定多随机变量初始值。 对遍历执行:假设第步得到样本,则第次迭代进行如下步骤: 由满条件分布抽取得到 由满条件分布抽取 由满条件分布抽取 最后得到样本集合,计算:
import math
# 导入多元正态分布函数
from scipy.stats import multivariate_normal
# 指定二元正态分布均值和协方差矩阵
samplesource = multivariate_normal(mean=[5,-1], cov=[[1,0.5],[0.5,2]])
# 定义给定x的条件下y的条件状态转移分布
def p_yx(x, m1, m2, s1, s2):
return (random.normalvariate(m2 + rho * s2 / s1 * (x - m1), math.sqrt(1 - rho ** 2) * s2))
# 定义给定y的条件下x的条件状态转移分布
def p_xy(y, m1, m2, s1, s2):
return (random.normalvariate(m1 + rho * s1 / s2 * (y - m2), math.sqrt(1 - rho ** 2) * s1))
# 指定相关参数
N, K= 5000, 20
x_res = []
y_res = []
z_res = []
m1, m2 = 5, -1
s1, s2 = 1, 2
rho, y = 0.5, m2
# 遍历迭代
for i in range(N):
for j in range(K):
# y给定得到x的采样
x = p_xy(y, m1, m2, s1, s2)
# x给定得到y的采样
y = p_yx(x, m1, m2, s1, s2)
z = samplesource.pdf([x,y])
x_res.append(x)
y_res.append(y)
z_res.append(z)
# 绘图
num_bins = 50
plt.hist(x_res, num_bins, normed=1, facecolor='green', alpha=0.5,label='x')
plt.hist(y_res, num_bins, normed=1, facecolor='red', alpha=0.5,label='y')
plt.title('Histogram')
plt.legend()
plt.show();
二维效果展示:
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
ax.scatter(x_res, y_res, z_res, marker='o')
plt.show();
MCMC与贝叶斯推断
参考资料:
统计学习方法第二版
https://zhuanlan.zhihu.com/p/37121528
往期精彩:
数学推导+纯Python实现机器学习算法28:奇异值分解SVD
数学推导+纯Python实现机器学习算法17:XGBoost
数学推导+纯Python实现机器学习算法13:Lasso回归
数学推导+纯Python实现机器学习算法10:线性不可分支持向量机
一个算法工程师的成长之路
长按二维码.关注机器学习实验室