随机采样方法代码实现-python

本文介绍了Python中实现随机采样的几种方法,包括均匀分布的线性同余器、Box-Muller变换的正态分布、接受-拒绝采样,重点探讨了MCMC的Metropolis-Hastings算法和Gibbs抽样。Metropolis-Hastings通过调整转移概率矩阵确保平稳分布为所需目标分布,而Gibbs抽样在高维问题中提高效率,尤其适合单个维度的概率转移。
摘要由CSDN通过智能技术生成

1. 均匀分布,使用线性同余器

from datetime import datetime
from math import sqrt, cos, pi, log
import matplotlib.pyplot as plt
import numpy as np


def uniform_gen(seed, a=0, b=1):
    _A = 214013
    _C = 214013
    _M = 2 ** 32
    while True:
        seed = (_A * seed + _C) % _M
        res = a + (b - a) * seed / _M
        yield res


def random_uniform(num, seed=None):
    res = []
    if not seed:
        seed = datetime.now().second
    gen = uniform_gen(seed)
    if num == 1:
        return gen.__next__()
    for i in range(num):
        res.append(gen.__next__())
    return np.array(res)

def plot_hist(x, bin=150, path = None):
    plt.hist(x, bin)
    if path:
        plt.savefig(path)
    plt.show()


res = random_uniform(10000)
plot_hist(res, 50, 'uniform.jpg')

均匀分布

2. Box-Muller变换正态分布

def box_muller(num, loc=0., scale=1.):
    seed1 = datetime.now().second
    seed2 = datetime.now().minute
    gen1 = uniform_gen(seed1)
    gen2 = uniform_gen(seed2)
    res = []
    for i in range(num):
        u1 = gen1.__next__()
        u2 = gen2.__next__()
        u = sqrt(-2 * log(u1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值