首页 > 其他分享 >逆概率采样-接受拒绝采样-MCMC采样

逆概率采样-接受拒绝采样-MCMC采样

时间:2024-08-10 13:27:59浏览次数:15  
标签:采样 None 概率 MCMC 拒绝 import

import numpy as np
import scipy
from matplotlib import pyplot as plt


def pdf(x):
    if 0 <= x < 0.25:
        return 8 * x
    elif 0.25 <= x < 1:
        return 8 / 3 - 8 / 3 * x
    else:
        return 0


def cdf(x):
    if x < 0:
        return 0
    elif 0 <= x < 0.25:
        return 4 * x * x
    elif 0.25 <= x < 1:
        return 8 / 3 * x - 4 / 3 * x * x - 1 / 3
    else:
        return 1


def cdf_reverse(x):
    if x < 0 or x > 1:
        return None
    elif 0 <= x < 0.25:
        return x ** 0.5 / 2
    else:
        return 1 - (3 * (1 - x)) ** 0.5 / 2


# 逆CDF采样
def reverse_sample():
    #########################################################
    # p()是目标分布PDF
    # F^-1()是目标分布CDF的反函数
    # u()是0-1均匀分布
    # 算法:
    #     从u()中随机抽取u
    #     返回F^-1(u)
    #########################################################
    u = np.random.uniform(0, 1)
    return cdf_reverse(u)


# 接受拒绝采样
def reject_sample():
    #########################################################
    # p()是目标分布
    # q()取0-1均匀分布 并且使得kq()要覆盖p()
    # u()是0-1均匀分布
    # 算法:
    #     从q()中随机抽取x0,从u()随机抽取u
    #     如果 u <= p(x0) / kq(x0),则接受x0,反之则拒绝
    #########################################################
    x = np.random.uniform(0, 1)
    k = 2
    u = np.random.uniform(0, 1)
    if u <= pdf(x) / k:
        return x
    else:
        return None


# MCMC MH算法
def mcmc_sample(x):
    #########################################################
    # p()是目标分布
    # q()随机选择一个分布,选择正态分布
    # u()是0-1均匀分布
    # 算法:
    #     初始化x,并从q()随机抽取x_star
    #     计算alpha=min(1, p(j)*q(j,i) / p(i)q(i,j))
    #     从u()随机抽取u
    #     如果 u < alpha,则x = x_star,反之则x = x
    #########################################################
    x_star = np.random.normal(x, 1)
    num = pdf(x_star) * scipy.stats.norm(x_star, 1).pdf(x)
    den = pdf(x) * scipy.stats.norm(x, 1).pdf(x_star)
    alpha = min(1, num / den)
    u = np.random.uniform(0, 1)
    if u < alpha:
        return x_star
    else:
        return x


def plot(x, y, samples):
    plt.hist(samples, color="green", density=True)
    plt.plot(x, y, color="red")
    plt.show()


def mean(samples):
    return np.mean(samples)


def get_reverse_sample():
    # 随机采样10000次
    samples = []
    for _ in range(10000):
        val = reverse_sample()
        if val:
            samples.append(val)
    return samples


def get_reject_sample():
    # 随机采样10000次
    samples = []
    for _ in range(10000):
        val = reject_sample()
        if val:
            samples.append(val)
    return samples


def get_mcmc_sample():
    # 随机采样10000次
    samples = []
    x = 0.1
    for _ in range(10000):
        x = mcmc_sample(x)
        samples.append(x)
    return samples[1000:]


def main():
    x = np.arange(0, 1, 0.01)
    y = [pdf(i) for i in x]
    samples = get_mcmc_sample()
    plot(x, y, samples)

    # 理论均值 = 33/72 - 1/24
    print("理论均值:", 33 / 72 - 1 / 24)
    print("采样均值:", mean(samples))


if __name__ == '__main__':
    main()

标签:采样,None,概率,MCMC,拒绝,import
From: https://www.cnblogs.com/crazypigf/p/18352201

相关文章

  • 一个简单的录音软件(利用QT录音,ffmpeg进行音频重采样,fdk-aac编码)
             录音软件是一种非常有用的工具,可以帮助我们记录和存储语音信息。在本文中,我们将介绍一个简单的录音软件,该软件利用QT进行录音,使用ffmpeg进行音频重采样,并使用fdk-aac编码。一、 环境介绍  1、QT版本:QT5.12.62、编译器: MSVC2017643、ffmpeg版......
  • 【面试】解释概率和似然的区别
    面试模拟场景面试官:你能解释一下概率和似然的区别吗?参考回答示例概率(Probability)概念:概率是指在给定模型参数和已知条件下,观察到某个数据样本的可能性。换句话说,概率描述的是在已知模型和参数的情况下,某个事件发生的可能性。公式:......
  • 概率与期望
    期望的线性性质:\(X,Y\)为随机变量,\(C\)为常数。\[E(CX)=CE(X)\]\[E(X+Y)=E(X)+E(Y)\]\[E(C)=C\]当\(X,Y\)为相互独立变量时,$$E(XY)=E(X)E(Y)$$证一下第二条性质:设\(X\)的可能取值和对应概率为\(a_i,p_i\),设\(Y\)的可能取值和对应概率为\(b_i,q_i\)......
  • 不平衡学习的自适应合成采样方法ADASYN(Matlab代码实现)
     ......
  • 题解:UVA11181 条件概率 Probability|Given
    主要思路:概率期望。首先可以发现\(n\)的数据极小。然后我们设\(a\)为为每个人买东西的情况,\(b\)为当有\(b\)个人去时的情况。大家都应该知道条件概率式子为\(P(a|b)=\frac{P(ab)}{P(b)}\)。然后暴力搜索\(P(ab)\)和\(P(b)\)。其实这道题有复杂度更低的dp做法,但......
  • 概率生成函数学习
    https://www.cnblogs.com/zzctommy/p/14256844.htmlhttps://www.cnblogs.com/HenryHuang-Never-Settle/p/14702997.html概率生成函数,设多项式\(F(x)=\sumP(X=i)x^i\)。则:\(F(1)=1\);\(E(x)=F'(1)\);\(E(x^{\underline{k}})=F^{(k)}(1)\),\(k\)阶导。\(......
  • QRGRU-基于分位数回归门控循环单元的时间序列/回归区间概率预测matlab代码
    本人整理了QRGRU基于分位数回归门控循环单元的时间序列/回归区间概率预测matlab代码,该代码质量优异,出图精美,有详细注释,适合新手学习使用。1.多变量回归或时序预测均可,不加价~适用于matlab2020及以上。可任意选择置信区间,评价指标包括R2、MAE、区间覆盖率picp、区间平均宽度百分......
  • 朋友的朋友大概率比我的朋友多
    \(G=(V,E)\)度数之和:\[2|E|\]那么每个人的朋友期望数量:\[E(d)=\frac{2|E|}{|V|}\]然后随机选择某一对关系(某一条边)与某个点有关的概率,然后再从这条边选其中一个端点,假设自己是\(u\),然后看一下点\(u\)的朋友的期望朋友数量:对于每一个点\(v~(v\neu)\),点\(v\)是\(u\)......
  • STM32H7 HAL库CubeMX 双重ADC模式同步采样详细配置+FFT计算相位差
    前言在电赛备赛期间琢磨了一下ADC同步采样的实现方式,本来是打算直接用AD7606来着,但是搞了半天也没把驱动整出来...考虑到AD7606本身采样率也拉不到太高,于是就花了几天时间把片上ADC配出来了。查资料的时候我发现关于STM32双重ADC模式的资料是真的少,用FFT算两路信号相位差的实例代......
  • 人工智能深度学习系列—深入探索KL散度:度量概率分布差异的关键工具
    文章目录1.背景介绍2.KL散度计算公式3.使用场景4.代码样例5.总结1.背景介绍在机器学习领域,准确衡量概率分布之间的差异对于模型的性能至关重要。KL散度(Kullback-LeiblerDivergence),作为一种衡量两个概率分布差异的方法,被广泛应用于机器学习、信息论和统计学中......