机器学习-采样

采样的作用

1 采样实现对随机现象的模拟,根据给定高的概率分布,模拟产生一个对应的随机事件。

2 采样也可以看做一种非参数模型,通过利用少数的采样点来近似总体分布,并刻画总体分布中的不确定性。

3 对当前数据进行重采样,可以充分利用已有数据集,挖掘更多信息,如自助法和刀切法。另外,利用重采样技术,可以在保持特定的信息下(目标信息不丢失),有意识的改变样本的分布,从而适应后续模型的训练与学习。

4 很多模型由于结构复杂、含有隐变量的原因导致对应的求解公式很复杂,没有显式解析解,难以进行精确求解或推理。可以使用采样方法进行随机模拟,从而对复杂模型进行近似求解或推理。一般转化为对某些函数在特定分布下的积分或者期望,或者求某些随机变量或参数在给定数据下的后验分布。

常见的采样方法

均匀分布随机数:

一般采用线性同余法(LCG)生成离散均匀分布伪随机数,计算公式为 $x_{t+1} = (a \cdot x_t +c) \mod (m)$,得到在区间 $[0, m-1] $ 上的随机数。再除以 $m$ 即可得到在 $[0, 1] $ 上的连续均匀随机数。

其中对于随机种子的选择,在实际应用中一般采用当前系统的时间,而LCG的最大周期为 $m$ ,但一般小于 $m$,因此为了使 $m$ 达到最大,一般要满足以下条件:

  1. $c$ 和 $m$ 互质
  2. $m$ 的所有质因子的乘积能够整除 $a-1$
  3. 若 $m$ 是 4 的倍数,则 $a-1$ 也是
  4. $a, c,x_0$ 都比 $m$ 小
  5. $a, c$ 是整数

通过对 $a, m$ 的合理选择,LCG 的随机生成能满足评价一个随机数生成器的 3 种准则:

  1. 这个函数应该是一个完整周期的产生函数,即因该在重复之前生成 0~m 之间的所有数
  2. 产生的序列看上去是随机的
  3. 用32bit 算术高效实现

如:gcc的 glibc: $m = 2^{31}-1,\;\;\;\;\;\;\;\; a = 1103515245,\;\;\;\;\;\;\;\; c = 12345$

m = 2**31 -1
a = 1103515245
c = 12345
x_0 = 0
x =[]
x.append(x_0)
for i in range(1,500):
    temp= (a * x[i-1] + c)%m
    x.append(temp)
y = []
for i in range(1,500):
    temp = x[i]*1.0/m
    y.append(temp)

print(y)

 几乎所有的采样方法都是以均匀分布随机数作为基本操作。均匀分布随机数一般用线性同余法产生。

首先假设已经可以生成 [0,1] 上的均匀分布随机数,对于一些简单的分布可以直接用均匀采样的一些扩展方法产生样本点。比如有限的离散分布可以直接使用轮盘赌算法来实现采样。

而一些分布不好直接采样的,可以考虑 函数变换法

一般如果随机变量$x$和$u$之间存在函数关系$u = h(x)$,则他们的概率密度的对应关系如下:

$p(x) = p(u)|h'(x)|$

因此,如果从目标分布$p(x)$中难以采集样本,可以将目标分布进行转换,转化成一个易于采集的分布,然后再利用反函数 $x = h^{-1}(u)$ 间接得到$x$,如果是高维的空间向量,则 $ h'(x)$ 对应着 Jacobian 行列式

如果变换关系是 $x$ 的累计分布函数,则得到逆变换采样(ITS)。

逆变换采样法

累计分布函数为 $u = \Phi (x) = \int _{-\infty }^x p(t)dt $

的过程如下:
(1)从均匀分布 $U(0,1)$ 产生一个随机数 $u_1$;

(2)计算$x_i  =\Phi^{-1}(u_i)$,其中 $\Phi^{-1}(\cdot)$ 是累计分布函数的逆函数

Note:如果待采样的目标分布的累计分布函数的逆函数无法求解或者不容易计算,则不适用于逆变换采样法。

可以构造一个容易采样的参考分布,使其满足一定的条件,然后对其进行采样之后处理采样结果,使得最终的采样结果满足目标分布,如拒绝采样和重要性采样。

拒绝采样

对于目标分布 $p(x)$,选取一个易采样的参考分布 $q(x)$,使得对于任意 $x$ 有 $ p(x) \leq M \cdot q(x)$,则可以按照如下的过程进行采样:

(1)从参考分布 $q(x)$ 中随机采样一个样本 $x_i$;

(2)从均匀分布 $U(0,1)$ 产生一个随机数 $u_i$;

(3)如果满足 $u_i < \frac{p(x_i)}{M \cdot q(x_i)}$, 则接受此样本 $x_i$,否则拒绝,重新进行采样步骤,直到新产生的样本被接受。

如此经过多次的采样就能得到一个近似符合目标分布的样本集。拒绝采样的目标是找到一个合理的参考分布,或者包络函数 $M \cdot q(x)$:包络函数越紧,每次采样的接受概率越大,但是实际应用中很难找到一个解析形式的参考分布函数,因此常使用自适应的拒绝采样,在目标分布是对数凹函数时,使用分段线性函数来覆盖目标分布的对数。

重要性采样

另外,很多时候,采样的最终目的不是为了生成样本,而是为了进行一些后续任务,如预测变量值,通常表现为一个求期望的形式。重要性采样就是用于计算函数 $f(x)$ 在目标分布 $p(x)$ 上的积分(即函数期望),即

$E(f) = \int f(x)p(x)dx$

如果符合 $p(x)$ 分布的样本不好生成,可以引入另一个分布 $q(x)$,此分布可以方便的生成样本。则可以得到:

$E(f) = \int {f(x)p(x)dx}   = \int f(x) \frac{p(x)}{q(x)}q(x)dx = \int f(x)w(x)q(x)dx$

其中,$w(x) = frac{p(x)}{q(x)}$ 可以看作样本 $x$ 的重要性权重。由此,可以先从参考分布 $q(x)$ 中抽取 $N$ 个样本$\left\{x_i \right\}$ 然后利用如下公式估计 $E(f)$ :

$E(f) \approx\hat{ E}_N(f) =\sum_{i=1} ^{N} f(x_i)w(x_i)$

如果不需要计算函数积分,只想从目标分布 $p(x)$ 中采样出若干样本,则可以用重要性重采样(SIR),先从参考分布 $q(x)$ 中抽取 $N$ 个样本 $\left \{x_i \right \}$,然后按照它们对应的重要性权重 $\left \{w(x_i) \right \}$ 对这些样本进行重新采样(简单的针对有限离散分布的采样),最终得到的样本服从目标分布  $p(x)$.

在实际中,如果是高维空间的随机向量,拒绝采样和重要性采样很难得到合适的参考分布,采样效率低,此时常用MCMC采样。

 

posted @ 2019-08-05 15:51  Z_W  阅读(826)  评论(0)    收藏  举报