越学越懵了,计算机中是怎么进行采样的,用了这么久的 rand() 函数,到现在才知道是怎么做的。

从均匀分布中采样

  计算机中通过线性同余发生器(linear congruential generator,LCG)很容易从一个 $ x \sim Uniform[0, 1)$ 的均匀分布中进行采样。如果要从 \(y \sim Uniform[a, b)\) 的均匀分布中采样,只需要 \(x\) 的基础上做个变换 \(y = (b-a)x + a\) 即可。

  当然除了 LCG 外,还有其它均匀分布随机数生成方法,这里不一一列举,可以参考博客随机数生成(一):均匀分布

  单独把均匀分布采样摘出来是因为它很基础,很多其它采样方法都是在该基础上进行操作。

对离散型变量采样

  我们现在通过某种方法(比如 LCG)可以生成均匀分布的随机数,这个时候我们就完全可以对某个含有有限个离散取值的变量 \(r\) 进行采样,方法就是采用轮盘赌选择法。

  假设离散型变量 \(r\) 有 3 个取值,\(a_1, a_2, a_3\),概率分布如下图所示:

图 1 离散型变量 \(r\) 概率分布

  所有取值概率之和为 1。此时我们可以从 \(Uniform[0, 1)\) 生成一个随机数 \(b\),若 \(0 \le b < 0.6\),则选择出 \(a_1\);若 \(0.6 \le b < 0.7\),则选择出 \(a_2\);若 \(0.7 \le b < 1\),则选择出 \(a_3\)。

对连续型变量采样

  上面我们已经讨论了从均匀分布 \(U[a,b)\) 中采样,对于其余分布,如高斯分布、gamma 分布、指数分布、t 分布、F 分布、Beta 分布、Dirichlet 分布等等,都可以基于 \(U[0,1)\) 的样本生成。例如高斯分布可以通过 Box-Muller 变换得到:

【Box-Muller 变换】如果随机变量 \(U_1,U_2\) 独立且 \(U_1,U_2 \sim Uniform[0, 1]\),
\[
\begin{aligned}
Z_0 = \sqrt{-2\ln U_1} \cos (2 \pi U_2) \\
Z_1 = \sqrt{-2\ln U_1} \sin (2 \pi U_2)
\end{aligned}
\]

则 \(Z_0, Z_1\) 独立且服从标准正态分布。

  想要得到服从 \(Z_2 \sim N(\mu, \sigma^2)\) 的高斯分布,则只需对 \(Z_0 \sim N(0, 1)\) 做如下变换:
\[
Z_2 = \sigma Z_0 + \mu
\]

  对于更加一般分布 \(p(x)\),如下图所示,我们该如何对其进行采样呢?

图 2 分布 \(p(x)\)

  这个时候我们可以使用 rejection sampling。

  Rejection sampling 首先寻找一个简单的分布 \(q(x)\),然后乘以一个常数 \(M\),使其满足 \(p(x) \le M \cdot q(x)\),如下图所示,\(q(x)\) 是一个高斯分布,\(M = 2\)。

图 2 分布 \(p(x)\) 和 分布 2q(x)

  在找到一个分布 \(2q(x)\) 能完全“覆盖”分布 \(p(x)\) 后,我们任意 sample 一个样本点 \(x_i\),但此时,我们将以 \(\frac{p(x_i)}{2q(x_i)}\) 的概率选择去接收这个样本,以 \((1 - \frac{p(x_i)}{2q(x_i)})\) 的概率选择去拒绝该样本。rejection sampling 平均会接收 \(\frac{1}{M}\) 个样本点。

  rejection sampling 优点:使用 rejection sampling 可以对大多数分布进行采样,即使这些“分布”没有进行归一化。

  rejection sampling 缺点:当 \(p(x)\) 和 \(2q(x)\) 相差太多时,rejection sampling 将拒绝大多数样本点;其次,对于高维数据,常数 \(M\) 会很大,简单使用 rejection sampling 所需要的样本量随空间维数增加而指数增长,即高维情况下不适合用 rejection sampling,此时 MCMC(Markov Chains Monte Carlo)和 Gibbs sampling 才是主流。(当然 MCMC 等既能处理离散情况也能处理连续情况。)

References

线性同余发生器 -- 百度百科
随机数生成(一):均匀分布 -- MoussaTintin
LDA-math-MCMC 和 Gibbs Sampling -- 靳志辉
MCMC(一)蒙特卡罗方法 -- 刘建平Pinard
Bayesian Methods for Machine Learning: Sampling from 1-d distributions

漫谈“采样”(sampling)的更多相关文章

  1. OProfile 性能分析工具

    OProfile 性能分析工具 官方网站:http://oprofile.sourceforge.net/news/ oprofile.ko模块本文主要介绍Oprofile工具,适用系统的CPU性能分 ...

  2. 高级性能调试手段(oprofile+gprofile)+内核追踪手段:LTT

    http://blog.csdn.net/wlsfling/article/details/5876134http://www.lenky.info/archives/2012/03/1371http ...

  3. 【接口时序】4、SPI总线的原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

  4. 用OpenGL进行曲线、曲面的绘制

    实验目的 理解Bezier曲线.曲面绘制的基本原理:理解OpenGL中一维.二维插值求值器的用法. 掌握OpenGL中曲线.曲面绘图的方法,对比不同参数下的绘图效果差异: 代码1:用四个控制点绘制一条 ...

  5. openGL 纹理05

    纹理(Texture) 为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分. 这样每个顶点就会关联着一个纹理坐标(Texture Coordinate) 用来标 ...

  6. Linux oprofile命令

    一.简介 oProfile是Linux平台上的一个功能强大的性能分析工具,支持两种采样(sampling)方式:基于事件的采样(eventbased)和基于时间的采样(timebased),它可以工作 ...

  7. 预测学习、深度生成式模型、DcGAN、应用案例、相关paper

    我对GAN"生成对抗网络"(Generative Adversarial Networks)的看法: 前几天在公开课听了新加坡国立大学[机器学习与视觉实验室]负责人冯佳时博士在[硬 ...

  8. words2

    餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘 ...

  9. [NLP-ASR] 语音识别项目整理(一) 语音预处理

      简介 之前参与过114对话系统的项目,中间搁置很久,现在把之前做过的内容整理一下,一是为自己回顾,二是也希望分享自己看的内容,中间也遇到一些问题,如果您可以提一些建议将不胜感激. 114查询主要分 ...

随机推荐

  1. SQL Server 表的管理_关于事务的处理的详解(案例代码)

    SQL Server 表的管理_关于事务的处理的详解(案例代码) 一.SQL 事务 1.1SQL 事务 ●事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序 ...

  2. 深度学习之 TensorFlow(四):卷积神经网络

    基础概念: 卷积神经网络(CNN):属于人工神经网络的一种,它的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量.卷积神经网络不像传统的识别算法一样,需要对数据进行特征提取和数据重建,可以直 ...

  3. 在高分屏正确显示CHM文件

    今天下了白色相簿2推,发现里面的chm格式的帮助文档显示不正确,又没法在应用程序直接设置系统分辨率托管,google了一下找到了这个方法: 新建 HKEY_LOCAL_MACHINE\ SOFTWAR ...

  4. Spring+Redis的部署与Redis缓存使用示例

    由于项目的业务需要,这两天折腾了一下Spring-redis配置,有了前面用Spring托管hibernate的经验,这次可以说是顺风顺水,大概说一下流程. ubuntu 安装 redis sudo ...

  5. 双网卡+mitmproxy+iptables搭建SSL中间人(支持非HTTPS协议)

    "想要解决一个问题,最根本方法的就是了解这一切是如何工作的,而不是玄学." --ASCII0X03 最近学习发现现在很多现成的安卓SSL中间人工具和教程都只针对HTTPS流量,比如 ...

  6. 字符串转json以及获取域名的参数

    本例将通过location.search来进行字符串拼接成json以及查询域名参数的value console.log(request('id')); function request(obj){ v ...

  7. 全面认识openstack:OpenStack架构详解

    OpenStack构架知识梳理   OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟 ...

  8. Python接口测试之对MySQL/unittest框架/Requests 的操作

    单元测试支持测试自动化. 共享的安装程序和关闭代码测试. 聚合成集合,测试和报告框架从测试的独立性.单元测试模块提供可以很容易地支持这些素质的一组测试的类.关于unittest 测试框架建议可以到官方 ...

  9. springboot+mybatis+ehcache实现缓存数据

    一.springboot缓存简介 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓 ...

  10. springboot项目利用devtools实现热部署,改动代码自动生效

    一.前言 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后 ...