

采样(一):从均匀分布、指数分布和拉普拉斯分布采样
source link: https://allenwind.github.io/blog/10342/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

NLP、深度学习、机器学习、Python、Go
采样(一):从均匀分布、指数分布和拉普拉斯分布采样
计算机程序的运行是确定性的,即每一步都有一个明确的描述,如何在确定性下生成随机的内容?这似乎是个自相矛盾的问题。
事实上,这个怀疑是对的,在没有外部不确定性的输入下,计算机程序永远以确定性的方式运行。为让计算机程序稳定地生成随机内容,需要稳定的不确定性的输入。而这样做的成本非常高。于是,为何不抛开这个直观思路?
让计算机生成一些看起来随机的确定性序列。易知,伪随机数有一个非常好的优点,可重复。比如我们再训练神经网络时,要初始化大量参数,伪随机数则可以让我们获得同样的初始化参数,从而避免对此训练。
采样和分布变换
采样,可以看做是从给定分布中采集样本,也可以看做是从给定数据集,通过某种策略,采集构造新的数据集的方法。本文讲述从均匀分布采样、从指数分布采样、从正态分布、Laplace分布采样等常见分布采样方法。
首先我们谈谈分布变换,即有已知分布的样本集,通过一定的方法使其变换为符合其他分布的样本集。比如,我现在有一个均匀分布生成器,获得一系列样本x1,x2,…,xn∼U[0,1],那么通过g(x),它如何变换为其他的分布呢?比如变换为正态分布,
yi=g(xi)这就是分布变换的问题。一般来说,简单的分布容易采样,在获得简单分布的样本后,通过分布变换获得复杂分布的样本。但是对于一般的分布函数,采样方法都不是普遍适用的,因此需要具体分布具体讨论,为每种分布设计最高效的采样方法。
逆变换采样
累积分布函数(CDF)是个单调函数,那么累积分布函数的反函数为,
F−1(u)=inf{x|F(u)≥x}如果u∼U[0,1],那么F−1(u)服从分布F(x)。
P(F−1(u)≤x)=P(u≤F(x))=P(u≤y)|y=F(x)=y|y=F(x)=F(x)
这里有一个细节需要说明,由于u采样自均匀分布,因此容易知道P(u≤y)=y。这一点是以上推导的关键细节。
对于很多分布来说,逆函数F−1(u)并不容易计算,因此很多情况下无法直接使用逆变换采样。需要具体分布具体讨论,为每种分布设计最高效的采样方法。下面我们先讨论最简答的均匀分布采样。
均匀分布与线性同余(LCG)
均匀分布表示为,
f(x)={1b−afor a≤x≤b,0otherwise. μ=E[X]=12(a+b) σ2=Var(X)=112(b−a)2该形式可以改写成已知均值μ和方差σ2的均匀分布形式,
f(x)={12σ√3if−σ√3≤x−μ≤σ√30otherwise.考虑对称性,一般会取b=−a,这时均值和方差分别为0和a23。如果采样数据只取非负数,那么a=0,这时均值和方差分别是b2和b212。在有均匀分布ui∼U[0,1]情况下,一般均匀分布有,
vi=a+(b−a)×uiLinear congruential generator(LCG)生成伪均匀分布U[0,1]随机数方法如下,
{xi=axi−1+b(modm)ui=xim当 b=0 时退化成 Lehmer random number generator(LG),是LCG的特例,此处不展开。LCG为什么能成?可以理解为,LCG本身是个周期非常大的函数,周期内的模式是取值均匀且不重复,于是周期内的数呈现正态分布。为获得一个大的周期,m需要是一个较大且不可约的正整数。
glibc 中采用的默认参数,
m=231−1a=1103515245b=12345通过线性同余方法构建的伪随机数生成器的内部状态可以轻易地由其输出演算得知。
LCG的Python实现如下,
import numpy as np
def lcg(x0, a=1103515245, b=12345, m=2**31-1, normalize=True):
"""线性同余法"""
while True:
xt = np.mod(a*x0 + b, m)
if normalize:
x = xt / m
else:
x = xt
yield x
x0 = xt
可视化对比,
生成均匀分布还有的方法结合位移运算、LFG(Lagged Fibonacci generator)、混沌序列等等。还有一种不太严格的生成技巧,就是生成f(x)=x一系列样本,然后shuffle,逐个输出,那么输出样本服从均匀分布。
均匀分布的采样的一个重要应用是随机排列(random permutation),也就是shuffle。Python实现如下,
import numpy as np
def shuffle(x):
size = len(x)
for i in range(size-2):
j = i + np.random.randint(0, size-i)
x[i], x[j] = x[j], x[i]
均匀分布采样方法作为基础方法,为其他更复杂的分布的采样提供支持。
从指数分布采样
指数分布的概率密度,
f(x;β)={1βe−x/βx≥0,0x<0.均值和方差分别为β和β2。由于指数分布的采样x≥0,在构造样本时有一定的问题,因此这里不考虑该分布。有些书籍也把指数分布表示为,
f(x;α)={αe−αxx≥0,0x<0.从采样逆变换可知, 如果我们让指数分布的累积分布函数服从均匀分布, 那么其逆函数服从指数分布
P(x)=P(V⩽x)=∫x0p(x)dx=1−e−ax求逆函数,
x=−ln(1−u)a因此从均匀分布U[0,1]中采样一系列的ui,代入上式获得xi便服从指数分布。
从Laplace分布采样
拉普拉斯分布的概率密度,
f(x∣μ,b)=12bexp(−|x−μ|b)均值和方差分别为μ,2b2。其累计分布函数也很容易计算,只不过是分步而已,
F(x)=∫x−∞f(u)du={12exp(x−μb)if x<μ1−12exp(−x−μb)if x≥μ=12+12sign(x−μ)(1−exp(−|x−μ|b)).解得逆函数,
F−1(u)=μ−bsign(u−0.5)ln(1−2|u−0.5|)因此从均匀分布U[0,1]中采样一系列的ui,代入上式获得xi便服从Laplace分布。这里的技巧是先把指数部分解出来,然后再解符号函数部分。
均匀分布、指数分布和拉普拉斯分布的采样方法的实现更新到:
- sampling-from-distribution,可能会根据需要持续更新~
本文介绍了均匀分布、指数分布和拉普拉斯分布的采样方法。
转载请包括本文地址:https://allenwind.github.io/blog/10342
更多文章请参考:https://allenwind.github.io/blog/archives/
Recommend
-
41
-
53
【将水银滴在金子上,竟变成了这样,水银竟能吃掉金子】@河森堡:这个实验让我想起古代的工匠会把水银和黄金混合在一起,然后抹在铜佛表面,再给铜佛加热,水银挥发以后黄金就会均匀细腻地留在佛像表面,一些金佛就是用这些方式上金的,很好玩。...
-
8
正态分布变量和均匀分布变量分别的累加有什么关系 谢益辉 / 2009-02-19 理论上应该是独立的啊,但今天偶然发现这么个现象:
-
8
【探索】曲面上均匀随机采样 2019年08月16日 Author: Guofei 文章归类: A蒙特卡洛方法 ,文章编号: 10103 版权声明:本文作者是郭飞。转载随意,...
-
11
委员会驱动 MEV 均匀分配 · Ethereum Community Network委员会驱动 MEV 均匀分配PoS 共识机制修改探索,以应对 MEV 对奖励不公平分配的影响Francesco 2021-09-09来源 |
-
12
飞利浦(PHILIPS)AHR4144WKS踢脚线取暖器 | 数码达人“粗暴开箱”实录:均匀升温整屋制暖,小白闭眼盲选抗寒神器-极果 数码达人“粗暴开箱”实录:均匀升温整屋制暖,小白闭眼盲选抗寒神器...
-
18
如何在不规则多边形内均匀撒点的算法如何在不规则多边形内均匀撒点的算法原文地址:https://geekplux.com/2018/03/16/how-to-picking-uni...
-
4
Mr.Feng BlogNLP、深度学习、机器学习、Python、Go采样(四):从正态分布构造均匀分布如何从正态分布构造均匀分布? 问题1:如果有正...
-
0
【翻译/介绍】jump consistent hash 零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法 jump consistent hash是一种一致性哈希算法, 此算法零内存消耗,均匀分配,快速...
-
5
立足消费者体验 戴森均匀净化理念引领呼吸健康新方向-品玩 业界动态 立足消费者体验 戴森均匀净化理念引领呼吸健康新方向 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK