越学越懵了,计算机中是怎么进行采样的,用了这么久的 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. Fiddler抓包使用教程-Android应用抓包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/74439165 本文出自[赵彦军的博客] Fiddler 也可以支持对手机应用进行 ...

  2. Roundcube Webmail信息泄露漏洞(CVE-2015-5383)

    Preface Software: https://roundcube.net/Versions: 1.1.x<1.1.2(亲测1.1.5也有效)CVE: CVE-2015-5383Author ...

  3. Python的易错点

    一.列表和元组的区别 列表是允许修改的,而元组是不能修改的,元组只能实现拼接,形成一个新的元组.两者可以实现相互转换,列表转换成元组使用truple函数,而元组转换成列表使用list函数. 二.Raw ...

  4. SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

  5. QT5:C++实现基于multimedia的音乐播放器(二)

    今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...

  6. IDEA无法创建类,接口

    原因:模板丢失 解决方案: 在idea.exe.vmoptions 或 idea64.exe.vmoptions中加入配置-Djdk.util.zip.ensureTrailingSlash=fals ...

  7. 解决CentOS 7中php-fpm进程数过多导致服务器内存资源消耗较大的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=653 什么是php-fpm: php-fpm即FastCGI进程管理器,用于控制php的内存和进程等. 操作环境: ...

  8. 【bzoj 4173】数学

    Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 ...

  9. bzoj3812&uoj37 主旋律

    正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点 ...

  10. STL--multiset用法

    multiset: multiset<int>s; 定义正向迭代器与正向遍历: multiset<int>::iterator it; for(it=s.begin();it! ...