python3 锦鲤第一步!了解随机抽样之蓄水池算法
python3 锦鲤第一步!了解随机抽样之蓄水池算法
-
蓄水池算法
问题背景:
样本空间为N,从N个样本中随机不重复地抽取K个样本,其中N是未知且非常巨大的数,如何保证每个样本是等概率被抽取才是关键。算法逻辑:
(1)先选取前k个数据(0,1,2,…k-1,角标从0开始)
(2)对于第i个数据(k<=i<n),随机生成区间[0, i)的一个数r,如果r<k,则将数据替换。近期的朋友圈都在疯转各式各样的锦鲤,早晨起来看见了一篇关于随机抽样的推文,就想了解一下这个蓄水池算法。在此现实背景下,默认一个活动的锦鲤只有一条,那么K=1。
接下来证明算法逻辑下每个样本成为锦鲤的概率均为1/N: -
代码实现
使用的是python3编译:
import numpy
import os
import random
def SelectJINLI(List1):
List1[0] = [] #锦鲤的奖池,将会容纳列表List1的某个用户名
a = []
num=2 #List1[1]是num=1的时候,num=2即刚好是是List[1]
for i in List1[1:]:
if random.random() < 1.0/num: #random.randdom()随机产生的是[0,1)的数值
a = List1[num-1] #满足条件,即将List1[num-1]放入奖池中
List1[0] = a
num=+1
Notes:
程序中的List1可以是爬取的微博转发列表,也可以是其它姓名列表。
废话一句,多次转发,列表里有多个相同ID,可以通过去除重复ID,保证每人成为锦鲤的概率相等。所以私以为,转发多次不能增加获奖概率。
如今众多平台相继发送锦鲤文案,在佩服某巨头公司的集卡、返利、锦鲤推广的同时,多个相关小平台的转发,缺乏监管单位监督下,感觉更像是一次娱乐泡沫。