越学越懵了,计算机中是怎么进行采样的,用了这么久的 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. 发布 Rafy .NET Standard 版本 Nuget 包

    去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...

  2. 安装vmware tool时出错

    背景: 我想要在win10系统和vmware的ubuntu之间实现磁盘共享,从而实现文件共享.百度到可以通过安装vmware tools实现,所以着手安装vmware tools 问题: 安装vmwa ...

  3. php坏境安装Xdebug详情步骤

    原创,转载请注明出处! Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况,可以说是程序员必备的一个工具之一.好了,进入正题: 1.下 ...

  4. Tomcat配置多实例:centos和winserver环境

    CentOS:配置多Tomcat:     1.下载:# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-6/v6.0.44/bin/apache- ...

  5. AE、AS调用时用代码提供许可(不需要添加LicenseControl控件)

    private void CheckBindLicense() { ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDe ...

  6. HTML学习笔记3:文字和段落

    ①标题标签     <h1></h1> ~ <h6></h6>分别对应字体不同的大小,数字又小到大对应字体由大到小   ②段落     <p> ...

  7. 学生管理系统_排序后通过name删除列表里的字典

    l = [{'name': 'wangfan', 'age': 18, 'sex': 'nan'}, {'name': 'wangerfan', 'age': 10, 'sex': 'nan'}, { ...

  8. CSS 外边距合并。

    <div id = "parent"> <div id = "child"> demo </div> </div> ...

  9. Flask入门之Jinjia模板的一些语法

    1. 变量表示 {{ argv }} 2. 赋值操作 {% set links = [ ('home',url_for('.home')), ('service',url_for('.service' ...

  10. js基础进阶--关于Array.prototype.slice.call(arguments) 的思考

    欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...