什么是采样
我们知道了一个变数的分布,要生成一批样本服从这个分布,这个过程就叫采样。听起来好像很简单,对一些简单的分布函数确实如此,比如,均匀分布、正太分布,但只要分布函数稍微复杂一点,采样这个事情就没那么简单了。
为什么要采样
在讲具体的采样方法之前,有必要弄清楚采样的目的。为什么要采样呢?有人可能会这样想,样本一般是用来估计分布参数的,现在我都知道分布函数了,还采样干嘛呢?其实采样不只是可以用来估计分布参数,还有其他用途,比如说用来估计分布的期望、高阶动量等。其实在机器学习中,采样的主要用途是用来估计某个函数在某个分布上的期望 ,比如在EM演算法中,计算E步的时候,已知隐变数的分布,用采样的方法估计对数似然的期望。
基本采样方法
首先,最基本的方法是变换法,大概思想是这样的,比如我们要对分布a采样,但是只有分布b的采样器,我们可以通过对b采样的结果进行一些变换,使变换后的结果服从分布a,举个例子,对0到1的均匀分布的结果进行tan函数变换得到的结果就服从柯西分布,大家可以试想下怎么变换能得到指数分布和高斯分布。
对于简单的标准分布,可以用变换法,对于复杂分布就搞不定了。这个时候就有了拒绝采样(Rejection Sampling)和自适应拒绝采样(Adaptive Rejection Sampling),大概过程如下图所示,假设我们要对分布p采样,分布p比较复杂,可以先找一个简单的分布q,然后对q乘上一个系数k,保证对于任意z都有 ,这样可以保证p分布围成的区域一定在kq的下面,然后就可以在kq围成的区域内采样(z, h)(分别是横坐标和纵坐标),如果落在p围成的区域中就得到一个样本点z,否则丢弃这个样本。