随机采样方法之逆变换采样

news2024/10/30 7:31:34

抽样或采样是指从目标总体中抽取出部分个体也就是样本,通过对样本的属性或特征进行分析,以此对总体进行评估。采样作为一种重要的数据分析方法,在深度学习、渲染等诸多方面具有广泛的应用。本文将回顾一种基本的采样方法即逆变换采样。

一、逆变换采样原理

逆变换采样是一种直接且有效的方法,用于从均匀分布中生成服从指定分布的随机数。假定我们需要从某个概率密度函数为 f ( x ) f(x) f(x) 的分布中采样,其对应的累计密度函数为:
F ( x ) = ∫ − ∞ + ∞ f ( x ) d x (1) F(x)= \int_{-\infty }^{+\infty} f(x)dx \tag {1} F(x)=+f(x)dx(1)

我们的目标是找到一个单调递增的转换函数 T ( x ) T(x) T(x), 使得我们从均匀分布 U ( 0 , 1 ) U(0,1) U(0,1) 中采样的随机数 a a a, 经过该函数转换后服从上述分布: T ( a ) ∼ f ( x ) T(a) \sim f(x) T(a)f(x)

进一步,如果将 T ( a ) T(a) T(a) 当做一个随机变量,那么从累计分布函数的定义有:
P ( T ( a ) ≤ x ) = F ( x ) (2) P(T(a) \leq x) = F(x) \tag{2} P(T(a)x)=F(x)(2)
因为我们已经假设 T ( a ) T(a) T(a) 是一个单调递增函数,因此我们可以用反函数对上式进行变换:
P ( a ≤ T − 1 ( x ) ) = F ( x ) (3) P(a \leq T^{-1}(x)) = F(x) \tag{3} P(aT1(x))=F(x)(3)
又因为 a a a 服从 U ( 0 , 1 ) U(0,1) U(0,1), 所以有:
P ( a ≤ T − 1 ( x ) ) = T − 1 ( x ) (4) P(a \leq T^{-1}(x)) = T^{-1}(x) \tag{4} P(aT1(x))=T1(x)(4)
联立上述 (3) 和 (4) 就有:
T ( x ) = F − 1 ( x ) (5) T(x) = F^{-1}(x) \tag{5} T(x)=F1(x)(5)

为此,我们只需要将从均匀分布 U ( 0 , 1 ) U(0,1) U(0,1) 中采样的大量随机数分别输入到累计分布函数的逆函数 F − 1 ( x ) F^{-1}(x) F1(x)即可实现预期的采样。

二、模拟实验

假设给定指数分布的概率密度函数如下:
f ( x ) = { 0 ; x < 0 e − x ; x ≥ 0 f(x)= \begin{cases} & 0 ;& x< 0\\ & e^{-x};& x\geq0 \end{cases} f(x)={0;ex;x<0x0
其对应的累计分布函数为:
F ( x ) = ∫ 0 x e − x d x = 1 − e − x F(x)= \int_{0}^{x} e^{-x}dx = 1- e^{-x} F(x)=0xexdx=1ex

F ( x ) F(x) F(x) 对应的逆函数为:
F − 1 ( x ) = − ln ⁡ ( 1 − x ) F^{-1}(x)= -\ln(1-x) F1(x)=ln(1x)

代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']

# 设置样本数量
num_samples = 100000

# 生成均匀分布的随机样本
uniform_samples = np.random.uniform(size=num_samples)

# 应用逆变换采样方法
# 对于指数分布 e^(-x) (x >= 0),其逆变换为 -ln(1 - u),其中u是[0, 1)区间内的均匀随机变量
samples = -np.log(1 - uniform_samples)

# 绘制样本的直方图
plt.hist(samples, bins=50, density=True, alpha=0.75, color='blue', label='采样数据')

# 绘制指数分布的理论密度曲线
x = np.linspace(0, 10, 100)
plt.plot(x, np.exp(-x), 'r', label='理论密度曲线')

plt.xlabel('x')
plt.ylabel('密度')
plt.title('逆变换采样-指数分布')
plt.legend()
plt.grid(True)
plt.show()

实验效果:
在这里插入图片描述
参考资料:
B站宝藏数学讲解:【数之道 21】随机抽样、蒙特卡洛模拟与逆转换方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国自然地学部立项名单(2021-2023年)和标书范本(2007-2017年33份)-最新出炉 附下载链接

国自然地学部立项名单&#xff08;2021-2023年&#xff09;和标书范本&#xff08;2007-2017年33份&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a; 国自然地学部立项名单&#xff08;2021-2023年&#xff09;和标书范本&#xff08;2007-201…

C++之多态的深度剖析

目录 前言 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1重要条件 2.1.2 虚函数 2.1.3 虚函数的重写/覆盖 2.1.4 选择题 2.1.5 虚函数其他知识 协变&#xff08;了解&#xff09; 析构函数的重写 override 和 final关键字 3. 重载&#xff0c;重写&…

信息安全数学基础(34)正规子群和商群

正规子群详述 定义&#xff1a; 设G是一个群&#xff0c;H是G的子群。若H的左陪集与右陪集总是相等&#xff08;即对任何的a∈G&#xff0c;都有aHHa&#xff09;&#xff0c;则称H是G的正规子群或不变子群&#xff0c;记为H⊴G。 性质&#xff1a; 平凡性&#xff1a;任何群G…

日期选择简化版今日、本周、本月、本季度、本年

function 未来之窗_时间_现在() {let date new Date(),year date.getFullYear(), //获取完整的年份(4位)month date.getMonth() 1, //获取当前月份(0-11,0代表1月)strDate date.getDate() // 获取当前日(1-31),小时 date.getHours(),分钟 date.getMinutes();if (month &…

C语言笔记(指针题目)例题+图解

本文分为两部分 &#xff0c;第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析&#xff0c;第二部分是一些笔试题目。若有错误&#xff0c;请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…

Android Input的流程和原理

Android Input事件机制 Android系统是由事件驱动的&#xff0c;而Input是最常见的事件之一&#xff0c;用户的点击、滑动、长按等操作&#xff0c;都属于Input事件驱动&#xff0c;其中的核心就是InputReader和InputDispatcher。InputReader和InputDispatcher是跑在system_serv…

Manus在虚拟现实仿真模拟中的应用案例分享

Manus虚拟现实手套作为一种高精度的人机交互设备&#xff0c;在仿真模拟领域展现出了巨大的应用潜力。通过提供实时、准确的手指动作捕捉数据&#xff0c;Manus手套为多个行业带来了前所未有的仿真体验&#xff0c;推动了技术发展和应用创新。 技术特点 1. 高精度手指跟踪 Manu…

windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(四)

驱动的测试代码解读 1. 打开设备对象: // 1. 打开底层设备对象HANDLE hDevice CreateFile(L"\\\\.\\NDISFilter", // 设备名称GENERIC_READ | GENERIC_WRITE, // 访问权限0, // 不共享NULL, // 默认安全属性OPEN_EXISTING, // 打开现有设备0, // 无特殊标志NULL /…

加强版 第四节联通组件分析与演示

得到二值图像的目的是为了后面的分析 基本概念解释 -图像联通组件 -四邻域与八邻域联通 ccl联通组件标记 通过四邻域和八邻域来对图像进行边缘寻找与噪声处理的功能 常见算法来寻找联通组件 -基于像素扫描方法 -基于块扫描的方法 -两步法扫描 API: OpenCV中支持连通组件…

闯关leetcode——232. Implement Queue using Stacks

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/implement-queue-using-stacks/description/ 内容 Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal …

【Unity基础】初识UI Toolkit - 编辑器UI

&#xff08;本文所需图片在文章上面的资源中&#xff0c;点击“立即下载”。&#xff09; 本文介绍了如何通过UI工具包&#xff08;UI Toolkit&#xff09;来创建一个编辑器UI。 一、创建项目 1. 打开Unity创建一个空项目&#xff08;任意模板&#xff09;&#xff0c;这里我…

什么?Flutter 又要凉了? Flock 是什么东西?

今天突然看到这个消息&#xff0c;突然又有一种熟悉的味道&#xff0c;看来这个月 Flutter “又要凉一次了”&#xff1a; 起因 flutter foundation 决定 fork Flutter 并推出 Flock 分支用于自建维护&#xff0c;理由是&#xff1a; foundation 推测 Flutter 团队的劳动力短缺…

windows文件实时同步

在现今这个高效运转的工作时代&#xff0c;数据同步与备份的重要性愈发凸显。特别是对于Windows用户&#xff0c;实现文件在不同设备间的实时流转&#xff0c;不仅能够显著提升工作效率&#xff0c;更是数据安全的一道重要防线。接下来&#xff0c;我们将深入剖析Windows文件实…

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”&#xff08;功率因数校正&#xff09;&#xff0c;PFC电路即能对功率因数进行校正&#xff0c;或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率&#xff08;实际使用…

rom定制系列------红米note8_miui14安卓13定制修改固件 带面具root权限 刷写以及界面预览

&#x1f49d;&#x1f49d;&#x1f49d;红米note8机型代码&#xff1a;ginkgo。高通芯片。此固件官方最终版为稳定版12.5.5安卓11的版本。目前很多工作室需要高安卓版本的固件来适应他们的软件。并且需要root权限。根据客户要求。修改固件为完全root。并且修改为可批量刷写的…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】

鸿蒙HarmonyOS实战&#xff1a;通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程&#xff08;邀请码&#xff09;方式详解 在使用uniapp打包的鸿蒙项目的过程中&#xff0c;由于生成的是app文件&#xff0c;而hdc传给鸿蒙HarmonyOS系统需要的是hap文…

2025选题|基于协同推荐的黔醉酒业白酒销售系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

从0开始学python-day17-数据结构2

2.3 队列 队列(Queue)&#xff0c;它是一种运算受限的线性表,先进先出(FIFO First In First Out) 队列是一种受限的线性结构 受限之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作 P…

Element Plus在Vue3的安装

本来想下载element ui 的&#xff0c;但是不支持报错了 所以我们使用element plus 在终端使用下命令下载 npm install element-plus --save 然后就可以在package.json里面看到所下载的版本号了 之后在main.js中根据自己的的情况配置Element-Plus // main.ts import { create…