关于随机抽样的修改建议

前因后果先不谈,实事求是,为了说服我们组的某某,我只能拿出依据来。在我们的软件中,有这么一个功能,会从一个模拟库中进行抽样,抽样的周期为一周的时间,目标是尽可能让样本保持随机性,同时对模拟库的维护频度不能太高。

因为有多个行为主体,每个主体都会每周进行抽样,虽然在设计上行为主体之间是没办法沟通的,但是因为种种原因,这些主体之间进行了私密通信,而主体的抽样时间又不是相同的。但从设计上每个主体的抽样随机模式是相同的,导致每周的抽样对各个主体来说是相同方式进行的。

这样导致了一个问题,就是后进行抽样的主体已经提前知道了样本。

作为一名程序员,我不应该感情用事,而应该使用数据说话,所以我今天建立了这个模拟库的遍历模型,这个模型用来计算模拟库的扩张速度。下面我简单来讲:

m 为模拟库的总量,我们每周会随机出来的样本数为 k ,那么我们的问题是 经过多长时间我们的模拟库里的所有样本都会被抽取过一次 呢?
假设经过 n 周,那么我们即求 n 周抽取的总样本数 Sn
第一周我们会抽取 k 个样本,那么 S1 = k,第二周我们也会抽取 k 个样本,但是这 k 个样本里有可能会跟第一周有重复的,重复率怎么算呢?我的随机算法使用的是 Fisher�CYates 的随机洗牌算法,从概率上来说随机性比较好了,所以我们可以大胆的假设每个样本被抽出的概率是相等的。
那么第二周的新样本数目 y = k *(1 - S1 / m),这样, S2 = S1 + y = k + k * (1 - S1 / m)。
根据数学归纳法,周数和抽出独立样本总数的方程: Sn = m * [ 1 - ((m - k) / m)^n ]
这个方程反应了模拟库的扩散速度,举例来说,比如我们从今年的 3月20号 开始抽样,经过计算到目前已经过了 10周 的时间,我们的模拟库共有 1500 个样本,每周会抽出 100 个样本
S10 = 1500 * [ 1 - ( ( 1500 - 100 ) / 1500 )^10 ] = 748
也就是说模拟库的 1500 个样本,目前已经被抽出的独立样本数目是 748 个左右。正好是 50% 的模拟库数目。
其实 S 和周数的关系是如下图,随着周数的增加,抽出的新样本的增长速率也在放慢。


假设我们认为当模拟库里 80% 的样本已经被抽取过了后需要进行模拟库的扩充,也就是 1500 个样本里有 1200 个样本已经被抽取过了,那么将在 23 周后需要进行模拟库的扩充。

目前已经过了 10 周,也就是还有 13 周的时间后可能要对模拟库进行扩充,细算下来就是 9月1号 左右需要对模拟库进行扩充,不然 80% 的样本已经被抽取过了。这个时候对每个抽样主体来说每 5 个样本里有 4 个都是老样本了。

我提出的修改策略是将每个抽样主体的抽样过程改成不同的。这样模拟库的抽样速度会增加很多。对模拟库的维护成本也瞬间上升。

下面来看如果这样改,会对模拟库的扩充造成什么样的影响,如果这个影响确实如策划所想的那样,那么我的争辩到此为止。
其实改动的地方只有一点,就是每周不再是进行一次抽样过程,可以把每个抽样主体的抽样过程看作一次单独的抽样,按照现在抽样主体的的情况,预估有 5 个抽样主体进行抽样,那么每周的抽样次数将增长为 5 次,注意,这里并不是简单的把上面的速率乘以 5 ,因为模拟库的遍历速度并非是线性增长的。
目前是第 10 周,保持原来所有抽样主体的抽样过程相同不变的方式,那么第 11 周,预期被抽样出的总样本数是 S11,如果修改为每个主体抽样过程不同,那么预期被抽样出的总样本数是 S15。通过上面的计算我们知道了, S23 之后我们需要维护模拟库,换句话说如果修改方式后,将在这周之后的第三周达到这个数量,那时被抽样出的样本数量将达到 S25,但是因为遍历速度减慢了,所以其实 S25 S23 相差只有 40 个样本左右,可以看作这个时候需要维护模拟库。
那么具体的维护模拟库时间就由原来的 9月1号 提前到了 6月29号。
这么看来修改确实会导致模拟库的更新速度被提前很多,但前提是我们在模拟库的 80% 的样本都被抽样过后就进行维护,这个时候对抽样主体来说每 5 个样本里就有 4 个样本是老样本,这个抽样的效果已经是非常不好了,所以我的看法是最好在抽样结果中的 2 个样本中有 1 个是老样本就应该维护模拟库,但是这也不现实,因为这意味着这周就应该去维护模拟库了,因为此时模拟库已经有一半的样本被抽取过了。
那么能够容忍的重复率可能是 60% ~ 70%之间,假设是 66.7% 吧,这样就意味着抽样主体抽样后每 3 个样本里有 2 个是老样本,我认为这样已经是我能够接受的极限了,如果继续不维护模拟库,我觉得这个随机抽样过程就完全没有意义了。
这样计算来,按照原来的随机抽样方案,需要在 15 周进行模拟库的维护,也就是在 7月13号 之前进行。如果修改随机抽样方案,那么就需要在 6月15号 之前进行模拟库的维护。
下面我可以总结一下了,就是如果维护模拟库的目的是想让抽样主体抽取到新样本,并且容忍限度是每 3 个样本中有 2 个是老样本,这也是我的容忍极限。那么不改变方案,就需要在 7月13号 之前进行模拟库的维护;如果修改随机抽样方式,那么这个时间将会被提前到 6月15号,其实也就是只把模拟库的维护工作提前了一个月罢了。
所以我觉得,是 1个月的事情,却让这个随机抽样过程对抽样主体变得毫无意义,这么不作为是非常不值得的
我只是一个程序员,我用事实说话,我希望我的工作能够做得更好,我尽我自己最大的努力。


本文出自 “菜鸟浮出水” 博客,谢绝转载!

你可能感兴趣的:(随机抽样)