【Acceptance—Rejection Sampling】

在这里插入图片描述
在这里插入图片描述

import seaborn as sns
import random
import math
import matplotlib.pyplot as plt
import numpy as np

sns.set_style('darkgrid')
plt.rcParams['figure.figsize'] = (12, 8)

power = 4
t = 0.4
# 被采样函数f(x)的分母
sum_ = (math.pow(1-t, power+1) - math.pow(-t, power+1)) / (power + 1)
# 采样点
x = np.linspace(0, 1, 101)
# 计算满足c*g(x) >= f(x)的c的最小值
#观察图形可知,在自变量x∈[0,1]的范围内
# x取1时c取最小值,此时c=f(1)/g(1)=7.36

# 目标概率密度函数f(x)
f = lambda x: (x-t)**power/sum_
# 辅助概率密度函数g(x)
g = lambda x: 1
# x取1时c取最小值,此时c=f(1)/g(1)=7.36
c = f(1)/g(1)
# print(c)
cc = [c for xi in x]
plt.plot(x, cc, '--', label='c*g(x)')
y = [f(xi) for xi in x]
plt.plot(x, y, label='f(x)')


# 采样1000000个点
samples = []
for i in range(1000000):
    # -- 接受拒绝采样方法 --
    Y = random.uniform(0, 1)
    U = random.uniform(0, 1)
    if U*c*g(Y) <= f(Y):
        samples.append(Y)
    # --------------------

plt.hist(samples, bins=100, stacked=True, density=True, label='sampling')
plt.legend()
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值