我把计算 MAPK 的常微分方程的计算函数写好了,需要上不同的参数去跑程序,各种可能的参数去跑就太多了。这就遇到了需要对参数进行抽样的问题。看了点介绍抽样方法的文献,McKay等人的文章和 Helton等人的文章,做一点总结。在 McKay 等人的文章中提到了三种抽样方法:Random Sampling;Stratified Sampling;Latin Hypercube Sampling。其中,Latin Hypercube Sampling 是学长告诉我需要使用的,我需要特别关注。
随机抽样 Random Sampling
对于一系列的 X ,从 1 到 n,从中抽取 m 个样本。随机抽样就是简单地使用随机数生成器,产生 m 个随机数,从 X 的集合中选择对应编号的 X 的值构成抽样集合。对于简单随机抽样的集合,每个变量应该是不相关的,每个样本的抽取独立于其他的抽取。经过随机抽样获得的某个样本来自于某个子集的概论就和该子集与整个集合的比例一致。
分层抽样 Stratified Sampling
对于一系列的 X, 从中使用分层抽样抽取 m 个样本。需要先将所需要抽取的样本序列 X 进行均等划分成 m 个部分,从每个部分中随机抽取 1 个。用所有抽取的值来作为样本。分层抽样可以强制要求抽样结果包含特定的集合,同时又能保证抽样的随机性。分层抽样使得抽样集合更有代表性。不过,对于集合的子集的划分标准对于分层抽样是需要考虑的事情。
拉丁超立方抽样 Latin Hypercube Sampling
对于一系列同样长度的值的集合,这里假设有 A,B 两个,每个有 n 个值,从中需要抽出 m 组,每组均包含 A B 集合中的值。这个时候就需要使用拉丁超立方抽样来保证抽样不重复不遗漏。那么就把 A 和 B 都分成 m 个部分,于是就相当于划分出 m * m 的正方形,然后选择其中的 m 个方框,从中随机抽取点。那么选择方框的过程就要使用拉丁超立方抽样法。整个抽样的过程有点类似填数独,每行每列没有重复的值。选择出来 m 个方框,再从方框中随机抽数。如果是 3 个或更多的集合,就从平方成为了立方,甚至超立方。
拉丁超立方抽样的一个好处是,如果所需要的样本量发生变化,依然可以使用拉丁超立方的方法来进行抽样,只要简单修改抽样数量即可。
在具体实现上面,可以有以下三种方法:
- 使用数组记录下来已经产生的每一维度的序号;
- 先产生序号,随机打乱,抽取第一个序号,然后再打乱,再抽取;
- 直接随机打乱所有维度的值,然后按顺序取配对的值。
其中第三种方法是最为简洁的。
相同与差异
拉丁超立方抽样借用了拉丁平方 Latin Squre 的思想。拉丁平方是使用 n 个不同的值去填 n * n 的矩阵,每行每列,值不能重复。数独游戏 Sudoku 就是特别的拉丁平方。而三维的就是拉丁立方,多维的就是拉丁超立方。实际上在我和茂茂师兄理解拉丁超立方抽样的时候发现,如果对于一维的拉丁超立方抽样,没有随机排序的过程,就是分层抽样。
根据 MacKay 的测试,三种抽样方式得到的平均值的差异很小,而平均值的标准差中,随机抽样最大,分层抽样其次,拉丁超立方抽样最小。实际上,这三种抽样方法是相互联系的。随机抽样是基础,分层抽样和拉丁超立方抽样的具体部分也都用到了随机抽样,而拉丁超立方抽样也同样用到了分层抽样的思想。拉丁超立方抽样解决了多个集合共同抽样的问题,分层抽样解决了一个集合中抽样结果具有代表性的问题,随机抽样解决了小的集合中抽样的问题。
Hammersley design