簡單易學的機器學習演算法——Gibbs取樣
阿新 • • 發佈:2022-05-04
一、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()