逆变换采样
一般的编程语言都具有(伪)随机数生成功能,如 python 的random.random()
函数,然而它们通常只对应均匀分布。那如果想生成符合任意概率分布的随机数,该如何在代码上实现呢?这就可以用到“逆变换采样”了。
1. 引理
假设$X$为一个连续随机变量,其累积分布函数为$CDF(x)=P(X \le x)$,若随机变量$Y=CDF(X)$,则$Y$服从区间$[0, 1]$上的均匀分布。
证明:已知:$CDF(x) \in [0, 1]$,且$CDF(x)$为单调递增函数。
$$ \forall ; y < 0, \qquad P(Y \le y)=P(CDF(X) \le y)=0 $$
$$ \begin{aligned} \forall ; 0 \le y \le 1,\qquad P(Y \le y) &= P(CDF(X)\le y) \ &= P(X\le CDF^{-1}(y)) \ &= P(X\le x) \ &= CDF(x) \ &= y \end{aligned} $$
$$ \forall ; y > 1, \qquad P(Y\le y) = P(CDF(X) \le y) = 1 $$
综上,$Y$服从区间$[0,1]$上的均匀分布。
2. 推论:逆变换采样
假设$X$为一个连续随机变量,其累积分布函数为$CDF(x)=P(X \le x)$,则随机变量$Y=CDF(X)$服从区间$[0, 1]$上的均匀分布。逆变换采样即是将该过程反过来进行:
- 首先对于随机变量$Y$,我们从$[0,1]$中随机均匀抽取一个数$y$;
- 由于$X=CDF{-1}(Y)$,可求得随机数$x=CDF(y)$,故$x$即可看作是从分布$CDF(X)$中生成的随机样本。
3. 联想
突然想到一个疑问,似乎概率论课堂中有讲过但是一时又无法想出解答,暂记如下:
问题:设有连续随机变量$X$与$Y$,已知$X$的概率密度为$p_1(x)$,且$X$与$Y$有如下关系: $$y=f(x)$$ 那么$Y$的概率密度$p_2(y)$可如何表示?