采样
采样操作在许多机器学习的书籍中很少能看到,但是在我们实际的操作中常常会遇到。其主要作用有以下几点:
- 将复杂的分布简化为离散的样本点
- 可以用重采样对样本集进行调整以更好地适应后期的模型学习
- 用于随机模拟以进行复杂模型的近似求解或推理
- 用于可视化,帮助人们快速直观了解数据的结构和特性.
采样实际上是随机现象的模拟,根据给定的概率分布,来模拟产生一个对应的随机事件。采样可以让人们对随机事件及其产生过程有更直观的认识。
另一方面,采样得到的样本集可以看作是一种非参数模型,即用较少量的样本点(经验分布)来近似总体分布,并刻画总体分布中的不确定性.从这个角度来说,采样其实也是一种信息降维,可以起到简化问题的作用.
此外,很多模型由于结构复杂,含有隐变量等原因,导致对应的求解公式比较复杂,没有显式解析解,难以进行精确求解或推理。在这种情况下,可以利用采样方法进行随机模拟,从而对这些复杂模型进行近似求解或推理。这一般会转化为某些函数在特定分布下的积分或期望,或者是求某些随机变量或参数在给定数据下的后验分布等。
均匀分布随机数
计算机往往通过伪随机数的方法来生成均匀分布随机数.(这是一种近似随机)
一般采用线性同余法,公式为:
(注意a,c与m要互质)
也就是根据当前的随机数$x_t$来进行适当变换,进而产生下一次的随机数$x_{t+1}$,初始值$x_0$称为随机种子,上式得到的是区间[0,m-1]上的随机整数.如果想要得到区间[0,1]上的连续均匀分布随机数,用x除以m即可.
可以看到上述线性同余法得到的随机数并不是相互独立的(下一次的随机数根据当前随机数产生).上述式子,最多只能产生m个不同的随机数.实际上对于特定的种子,很多数是无法取到的.一个好的线性同余随机数生成器,要让其循环周期尽可能接近m,这就需要精心设计合适的乘法因子a和模数m. gcc中采用的glibc版本
一般要求:
- a,c为正整数
- a,c,$x_0$都比m小
常见的采样方法
贝叶斯网络采样
概率图模型经常被用来描述多个随机变量的联合概率分布.贝叶斯网络,又称信念网络或有向无环图模型.它是一种概率图模型.
如何对贝叶斯网络进行采样?如果只需要考虑一部分变量的边缘分布,如何采样?如果网络中含有观测变量,又该如何采样?
对一个没有观测变量的贝叶斯网络进行采样,简单的方法是祖先采样(ancestral Sampling),它的核心思想是根据有向图的顺序,先对祖先结点进行采样,只有当某个结点的所有父结点都已完成采样,才对该结点进行采样.根据贝叶斯网络的全概率公式:
可以看出祖先采样得到的样本服从贝叶斯网络的联合概率分布.
如果只需要对贝叶斯网络中一部分随机变量进行采样,可以用祖先采样先对全部随机变量进行采样,然后直接忽视那些不需要的变量的采样值即可.考虑含有观测变量的贝叶斯网络的采样.最直接的方法就是逻辑采样,还是利用祖先采样的到所有变量的取值。如果这个样本在观测变量上的采样值与实际观测值相同,则接受,否则拒绝,重新采样.这种方法的缺点是采样效率会非常低,随着观测变量个数的增加、每个变量状态数目的上升,逻辑采样法的效率急剧下降,实际中基本不可用.因此在实际应用中,参考重要性采样的思想,不再对观测变量进行采样,只对非观测变量采样,但是最终得到的样本需要赋以一个重要性权值:
其中E是观测变量集合.这种采样方法称作似然加权采样,产生的样本权值可以用于后续的积分操作.
此外也可以用MCMC采样法进行采样,具体说,如果次啊杨Metropolis-Hastings采样法的话,只需要在随机向量上选择一个转移概率矩阵,然后按照概率转移矩阵不断进行状态转换,每次转移有一定概率的接受或拒绝,最终得到的样本序列会收敛到目标分布.