总数未知的情况下按比例分批抽样

 拉勾网上一个求职的兴趣有3个,感兴趣程度分别是{人事:0.6,行政:0.3,运营:0.1}

求职者在拉勾APP首页每次下拉会多出5个推荐职位,我们希望总体上推荐职位的类型分布和该求职者的兴趣分布是一致的,问每次推荐的5个职位中“人事、行政、运营”类的职位分别应该出多少个?

第1次:

人事类出5*0.6=3个,行政出min(5-3,5*0.3)=2个,5个已满不能再出运营类了。此时“人事、行政、运营”推荐的比例是{0.5,0.5,0},与我们期望的比例作差{0.6,0.3,0.1}-{0.5,0.5,0}={0.1,-0.2,0.1},去除负数剩下{人事:0.1,运营:0.1},规一化后得到{人事:0.5,运营:0.5}

第2次:

人事类出5*0.5=3个,运营出min(5-3,5*0.5)=2个,5个已满不能再出行政类了。此时“人事、行政、运营”推荐的比例是{0.5,0.25,0.25},与我们期望的比例作差{0.6,0.3,0.1}-{0.5,0.25,0.25}={0.1,0.05,-0.15},去除负数剩下{人事:0.1,行政:0.05},规一化后得到{人事:0.67,行政:0.33}

第3次:

人事类出5*0.67=4个,行政出min(5-4,5*0.33)=1个,5个已满不能再出运营类了…………

 

拓展:拉勾网上java职位有4个,但是每次搜索最多只能显示2个职位。我们希望一天之内这4个职位的PV比例是{0.1,0.2,0.3,0.4},同时我们不知道这一天总的PV会是多少。问每次搜java时应该展示哪2个职位?

思路:每次搜索时我们需要计算期望的PV比例和目前PV比例的差值,按降序排列取前2个做为搜索结果展示给用户。python代码如下:

 1 #!/usr/bin/env python
 2 # coding=utf-8
 3 
 4 
 5 if __name__ == '__main__':
 6     finalQuota = {0: 0.1, 1: 0.2, 2: 0.3, 3: 0.4}
 7     currQuota = {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0}
 8     population = {0: 0, 1: 0, 2: 0, 3: 0}
 9     show = 2
10     total = 0
11     for i in range(10000):
12         needQuota = {k: finalQuota[k] - currQuota[k]
13                      for k in finalQuota.keys()}
14         li = sorted(
15             needQuota.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)
16         for j in range(show):
17             population[li[j][0]] += 1
18         total += show
19         for k, v in population.items():
20             currQuota[k] = 1.0 * v / total
21         if i % 1000 == 0:
22             for v in population.values():
23                 print 1.0 * v / total, "\t",
24             print

 

posted @ 2015-09-27 17:10  高性能golang  阅读(968)  评论(0编辑  收藏  举报