一、什么是采样
- 在信号系统和数字信号处理中,采样是每隔一定的时间测量一次声音信号的幅值,把时间连续的模拟信号转换成时间离散幅值的采样信号。
- 如果采样的时间间隔相等,这种采样称为均匀采样。
- 在计算机系统中有一个重要的问题叫随机采样:就是给定一个概率分布 p ( x ) p(x) p(x),我们如何按照该分布产生样本
- 在机器学习或统计学习中,我们是给定一堆样本数据,通过参数估计的方法求出这堆样本所符合的概率分布 p ( x ) p(x) p(x);而随机采样刚相反:给定一个概率分布p(x),如何生成满足条件的样本?
二、均匀分布的采样
- 首先需要明确,计算机程序都是确定性的,因此并不能产生真正意义上的随机数,只能产生伪随机数.
- 另外由于计算机的存储和计算单元只能处理离散状态值,因此也不能产生连续均匀分布的随机数,只能通过离散分布来逼近连续分布.
- 均匀分布式是一种最简单的分布。在计算机中使rand()函数生成的伪随机数序列,就可以看做是一种均匀分布。
- 一般可采用线性同余法来生成离散均匀分布伪随机数,计算公式为: x t + 1 = ( a x t + c ) m o d m x_{t+1}=(ax_t+c) mod m xt+1=(axt+c)modm
- 根据当前生成的随机数 x t x_t xt来进行适当变换,进而产生下一次的随机数 x t + 1 x_{t+1} xt+1.初始值 x 0 x_0 x0称为随机种子.上式可得到区间 [ 0 , m − 1 ] [0,m-1] [0,m−1]上的伪随机数.
- 想要真正的随机数可以通过自然界的物理产生,比如放射性物质的衰变,温度,气流的扰动等.有一些网站可以提供基于大自然的随机现象的随机数,有兴趣的读者可以尝试一下.
- 代码:
import time
start = int(time.time()); # 以当前时间作为种子
m = (1 << 31) -1; # 2^31 -1
a = 1103515245;
b = 12345;
R=start
for i in range(5):
R = ( a *R + b ) % m;
print(R/m)#产生[0,1]的随机数
三、离散分布采样
- 离散分布是比均匀分布稍微复杂一点的情况。下面用一个例子来详细说明:
- 令概率分布为: p ( x ) = [ 0.1 , 0.2 , 0.3 , 0.4 ] p(x)=[0.1,0.2,0.3,0.4] p(x)=[0.1,0.2,0.3,0.4], x = [ " h e l l o " , “ j a v a ” , “ p y t h o n ” , " s c a l a " ] x=["hello", “java”, “python”, "scala"] x=["hello",“java”,“python”,"scala"],我们可以使用将每个概率视为区间[0,1]中的一个小线段,线段长度为概率的大小,然后用上面均匀分布产生随机数,随机所在区间就是当前要采的样本。
- 代码:
import numpy as np
from collections import defaultdict
dic = defaultdict(int)#key是x的取值,value是x被采样的次数
def sample():
u = np.random.rand()#在[0,1]上按照均匀分布产生一个随机数
if u <= 0.1:#[0,0.1]=>x=hello
dic["hello"] += 1
elif u <= 0.3:#(0.1,0.3]=>x=java
dic["java"] += 1
elif u <= 0.6:#(0.3,0.6]=>x=python
dic["python"] += 1
else:#(0.6,1]=>x=scala
dic["scala"] += 1
for i in range(10000):#进行100词采样
sample()
for k,v in dic.items():
print(k,v)
输出:
python 2991
scala 3940
hello 1037
java 2032
四、逆变换采样法
-
对于连续型随机变量 X X X,一点有两个函数:
-
概率密度函数: f ( x ) f(x) f(x)
-
分布函数: F X ( x ) = P ( X ≤ x ) = ∫ − ∞ x f ( t ) d t F_X (x)=P(X≤x)=∫_{-∞}^xf(t)dt FX(x)=P(X≤x)=∫−∞xf(t)dt :表示随后变量取值在区间 ( − ∞ , x ] (-∞,x] (−∞,x]的概率
-
两个函数的图如下所示:
-
并且有下面性质:
- F X ( x ) F_X (x) FX(x)是 f ( x ) f(x) f(x)的一个原函数
- 并且 0 ≤ F X ( x ) ≤ 1 0≤F_X (x)≤1 0≤FX(x)≤1.
- F X ( x ) F_X (x) FX(x)是一个单独递增的函数,并存在反函数 F X − 1 F_X^{-1} FX−1.
-
-
重要定理: 若联系型随机变量 Y Y Y与连续型随机变量 X X X是关系为: Y = F X ( X ) Y=F_X (X) Y=FX(X),即他们的关系函数是 X X X是分布函数。则随机变量 Y Y Y是 0 , 1 ] 0,1] 0,1]上的均匀分布,即: Y Y Y~ U ( 0.1 ) U(0.1) U(0.1).下面证明一下: ∵ Y = F X ( X ) ∴ X = F X − 1 ( Y ) \because Y=F_X (X)~~~ \therefore X=F_X^{-1} (Y) ∵Y=FX(X) ∴X=FX−1(Y) ∵ F X ( x ) 是 单 调 递 增 的 ∴ F X − 1 ( Y ) 也 是 单 调 递 增 的 \because F_X (x)是单调递增的~~~ \therefore F_X^{-1} (Y)也是单调递增的 ∵FX(x)是单调递增的 ∴FX−1(Y)也是单调递增的 ∵ F X ( x ) = P ( X ≤ x ) = P ( F X − 1 ( Y ) ≤ x ) = P ( Y ≤ y ′ ) = P ( Y ≤ F X ( x ) ) \because F_X (x)=P(X≤x)=P(F_X^{-1} (Y)≤x)=P(Y≤y' )=P(Y≤F_X (x)) ∵FX(x)=P(X≤x)

本文介绍了随机采样方法,包括均匀分布采样、离散分布采样、逆变换采样法、Box-Muller算法和接受/拒绝采样。通过Python代码示例展示了如何实现这些采样方法,并探讨了在不同概率分布下采样的关键点和效率问题。
最低0.47元/天 解锁文章
496

被折叠的 条评论
为什么被折叠?



