当前位置:   article > 正文

模式识别与机器学习(Python实现):如何用MCMC产生任意的概率分布随机数?Python简单实现_mcmc算法python代码

mcmc算法python代码

模式识别与机器学习(Python实现):如何用MCMC产生任意的概率分布随机数?Python简单实现


欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与算法)系列讲解 - 总目录,同时这也可以作为大家学习的参考。欢迎订阅,优惠价只需9.9元,请多多支持!

如何产生任意的概率分布?本文采用MCMC的方法进行演示。这个任务在进行算法仿真时具有很好的意义,首先我们需要设定一个所需的分布(需满足的要求是 ∫ − ∞ + ∞ p ( x ) d x   = 1 \int_{ - \infty }^{ + \infty } {p(x)dx{\text{ }} = 1} +p(x)dx =1),本文以指数分布为例,主要阐述实现的过程,如需更详细的解释,请参考相关的文献。
在这里插入图片描述
实现过程主要为6步。

  1. 首先,给定一个初始状态 x 0 x_0 x0,(随机分布产生)。
  2. 对于 t = 1 , 2 , 3 , . . . . t=1,2,3,.... t=1,2,3,....,我们循环以下过程进行采样,可以以10000个数据为例。
  3. t t t为例,在 t t t时刻进行采样时,采样以高斯分布为例 Q ( x ∣ x t ) = y Q\left( {x|{x_t}} \right) = y Q(xxt)=y,其中 x t x_t xt放在高斯分布的均值处。方差为1。
  4. 我们采样得到了 y y y,再从 [ 0 , 1 ] [0,1] [0,1]的均匀分布中采样得到 u u u,即 u ∼ U ( 0 , 1 ) u \sim U(0,1) uU(0,1)
  5. 计算 α \alpha α的值, α = f ( y ) q ( x t ∣ y ) \alpha = f\left( y \right)q\left( {{x_t}|y} \right) α=f(y)q(xty),其中 f ( y ) f\left( y \right) f(y)是上文已知的一个概率分布。
  6. 判断 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(yxt)f(y)q(xty),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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/912675
推荐阅读
相关标签
  

闽ICP备14008679号