前因后果先不谈,实事求是,为了说服我们组的某某,我只能拿出依据来。在我们的软件中,有这么一个功能,会从一个模拟库中进行抽样,抽样的周期为一周的时间,目标是尽可能让样本保持随机性,同时对模拟库的维护频度不能太高。
因为有多个行为主体,每个主体都会每周进行抽样,虽然在设计上行为主体之间是没办法沟通的,但是因为种种原因,这些主体之间进行了私密通信,而主体的抽样时间又不是相同的。但从设计上每个主体的抽样随机模式是相同的,导致每周的抽样对各个主体来说是相同方式进行的。
这样导致了一个问题,就是后进行抽样的主体已经提前知道了样本。
作为一名程序员,我不应该感情用事,而应该使用数据说话,所以我今天建立了这个模拟库的遍历模型,这个模型用来计算模拟库的扩张速度。下面我简单来讲:
设
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个月的事情,却让这个随机抽样过程对抽样主体变得毫无意义,这么不作为是非常不值得的。
我只是一个程序员,我用事实说话,我希望我的工作能够做得更好,我尽我自己最大的努力。
本文出自 “菜鸟浮出水” 博客,谢绝转载!