模式识别与机器学习(Python实现):如何用MCMC产生任意的概率分布随机数?Python简单实现
欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与算法)系列讲解 - 总目录,同时这也可以作为大家学习的参考。欢迎订阅,优惠价只需9.9元,请多多支持!
如何产生任意的概率分布?本文采用MCMC的方法进行演示。这个任务在进行算法仿真时具有很好的意义,首先我们需要设定一个所需的分布(需满足的要求是
∫
−
∞
+
∞
p
(
x
)
d
x
=
1
\int_{ - \infty }^{ + \infty } {p(x)dx{\text{ }} = 1}
∫−∞+∞p(x)dx =1),本文以指数分布为例,主要阐述实现的过程,如需更详细的解释,请参考相关的文献。
实现过程主要为6步。
- 首先,给定一个初始状态 x 0 x_0 x0,(随机分布产生)。
- 对于 t = 1 , 2 , 3 , . . . . t=1,2,3,.... t=1,2,3,....,我们循环以下过程进行采样,可以以10000个数据为例。
- 以 t t t为例,在 t t t时刻进行采样时,采样以高斯分布为例 Q ( x ∣ x t ) = y Q\left( {x|{x_t}} \right) = y Q(x∣xt)=y,其中 x t x_t xt放在高斯分布的均值处。方差为1。
- 我们采样得到了 y y y,再从 [ 0 , 1 ] [0,1] [0,1]的均匀分布中采样得到 u u u,即 u ∼ U ( 0 , 1 ) u \sim U(0,1) u∼U(0,1)
- 计算 α \alpha α的值, α = f ( y ) q ( x t ∣ y ) \alpha = f\left( y \right)q\left( {{x_t}|y} \right) α=f(y)q(xt∣y),其中 f ( y ) f\left( y \right) f(y)是上文已知的一个概率分布。
- 判断 u < α u < \alpha u<α,若是令 x t + 1 = y {x_{t + 1}} = y xt+1=y,否则令 x t + 1 = x t {x_{t + 1}} = {x_t} xt+1=xt。
上面的方法可能会陷入局部最小值,所以可以采用metropolis hastings的采样方法,区别是计算
α
\alpha
α的方法不同,即为
α
=
min
{
f
(
y
)
q
(
x
t
∣
y
)
f
(
x
t
)
q
(
y
∣
x
t
)
,
1
}
\alpha = \min \left\{ {\frac{{f(y)q({x_t}|y)}}{{f({x_t})q(y|{x_t})}},1} \right\}
α=min{f(xt)q(y∣xt)f(y)q(xt∣y),1}
由此可得表示代码:
import numpy as np
np.random.seed(0)
x_t = np.random.rand(1)
import math
def function(x):
Lambda = 2
e = 2.718281828459
if x > 0:
y = Lambda * e ** (-Lambda * x)
else:
y = 0
return(y)
list_x_t = [float(x_t)]
for i in range(100000):
y=np.random.normal(loc=x_0 , scale=1.0, size=None) #loc:均值 scale:标准差
u = np.random.rand(1)
alpha = min(float(function(y)* np.random.normal(loc=y , scale=1.0)/function(x_t)* np.random.normal(loc=x_t , scale=1.0)),1.)
if u < alpha:
x_t = y
else:
x_t = x_t
list_x_t.append(float(x_t))
import matplotlib.pyplot as plt
plt.hist(list_x_t,bins=1000)
plt.title("Data distribution histogram")
plt.show()