1. 程式人生 > 其它 >簡單易學的機器學習演算法——Gibbs取樣

簡單易學的機器學習演算法——Gibbs取樣

一、Gibbs取樣概述

前面介紹的Metropolis-Hastings取樣為從指定分佈中進行取樣提供了一個統一的框架,但是取樣的效率依賴於指定的分佈的選擇,若是選擇的不好,會使得接受率比較低,大量的取樣被拒絕,影響到整體的收斂速度。

Gibbs取樣是Metropolis-Hastings取樣演算法的特殊形式,即找到一個已知的分佈,使得接受率α=1alpha =1。這樣,每次的取樣都會被接受,可以提高MCMC的收斂速度。

二、Gibbs取樣演算法的流程

三、上述過程滿足細緻平穩條件

四、實驗

4.1、前提

4.2、流程

4.3、實驗程式碼

'''
Date:20160704
@author: zhaozhiyong
'''
import random
import math
import matplotlib.pyplot as plt

def p_ygivenx(x, m1, m2, s1, s2):
    return (random.normalvariate(m2 + rho * s2 / s1 * (x - m1), math.sqrt(1 - rho ** 2) * s2))

def p_xgiveny(y, m1, m2, s1, s2):
    return (random.normalvariate(m1 + rho * s1 / s2 * (y - m2), math.sqrt(1 - rho ** 2) * s1))

N = 5000
K = 20
x_res = []
y_res = []
m1 = 10
m2 = -5
s1 = 5
s2 = 2

rho = 0.5
y = m2

for i in xrange(N):
    for j in xrange(K):
        x = p_xgiveny(y, m1, m2, s1, s2)
        y = p_ygivenx(x, m1, m2, s1, s2)
        x_res.append(x)
        y_res.append(y)

num_bins = 50
plt.hist(x_res, num_bins, normed=1, facecolor='green', alpha=0.5)
plt.hist(y_res, num_bins, normed=1, facecolor='red', alpha=0.5)
plt.title('Histogram')
plt.show()

4.4、實驗結果