随机采样方法与python实现

本文介绍了随机采样方法,包括均匀分布采样、离散分布采样、逆变换采样法、Box-Muller算法和接受/拒绝采样。通过Python代码示例展示了如何实现这些采样方法,并探讨了在不同概率分布下采样的关键点和效率问题。
摘要由CSDN通过智能技术生成

一、什么是采样

  • 在信号系统和数字信号处理中,采样是每隔一定的时间测量一次声音信号的幅值,把时间连续的模拟信号转换成时间离散幅值的采样信号。
  • 如果采样的时间间隔相等,这种采样称为均匀采样
  • 在计算机系统中有一个重要的问题叫随机采样:就是给定一个概率分布 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,m1]上的伪随机数.
  • 想要真正的随机数可以通过自然界的物理产生,比如放射性物质的衰变,温度,气流的扰动等.有一些网站可以提供基于大自然的随机现象的随机数,有兴趣的读者可以尝试一下.
  • 代码:
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(Xx)=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 0FX(x)1.
      • F X ( x ) F_X (x) FX(x)是一个单独递增的函数,并存在反函数 F X − 1 F_X^{-1} FX1.
  • 重要定理: 若联系型随机变量 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=FX1(Y) ∵ F X ( x ) 是 单 调 递 增 的     ∴ F X − 1 ( Y ) 也 是 单 调 递 增 的 \because F_X (x)是单调递增的~~~ \therefore F_X^{-1} (Y)也是单调递增的 FX(x)   FX1(Y) ∵ F X ( x ) = P ( X ≤ x ) = P ( F X − 1 ( Y ) ≤ x ) = P ( Y ≤ y ′ ) =

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值