等概率抽样

1、按比例抽样

比如按照比例P=0.7抽样:
生成0,1间的随机浮点数,通过与P比较判断抽样,random>P,抽出样本,否则,不抽
如果P值是一个复杂的小数,比如P=0.932930100011123213,编程语言支持小数精度无法进行准确比较时,可以采用概率模拟。
随机0-100000000000000000的整数,与932930100011123213进行比较。

2、按数量等概率抽样

(1)已知总数n,抽样数量m
按照概率m/n对每个样本进行抽样
(2)未知总数n,抽样数量m(即未知总数的流式数据等概率抽样m)
抽样目标:对于任意n,每个样本被抽中的概率相等,即被抽中的概率为m/n,未被抽中的概率为n-m、n
分析:可以把这个过程看作一个动态变化的过程,一开始只有m个样本,样本逐次加一,逐渐增长到n个。在这个过程里,每个样本被抽出的概率都是相等的。
抽样策略:
用一个数c来记录目前的样本数量。
start:n=m
sample1 sample2 … samplem,共m个样本,从中抽样m个,每个样本到的概率为1

then n=m+1时:
sample1 sample2 … samplem sample(m+1)

在start步骤中,我们抽出了sample1-m,等到样本数据流中出现sample(m+1)时,我们考虑这时n=m+1,我们只要证明每个样本(当然包括sample(m+1))被抽中的概率为m/m+1,按照我们的策略,我们以概率m/m+1将sample(m+1)替换sample1-m中的一个,sample1-m中的每个样本被替换的概率都是1/m,那么在这种情况下,sample(m+1)
被抽中的概率为m/m+1
sample1-m不被抽中的概率为(即被sample(m+1)换掉的概率):
1/m+1
所以sample1-m被抽中的概率也是m/m+1

final:

当样本一个接一个出现,n>>m时,
对于任意一个samplek (k>m)
以m/k的概率将被抽中的m个样本中的一个替换samplek

那么samplek最后被选定为样本的概率为:

m/k * (k/k+1) ( k+1/k+2) … * (n-1/n) = m/n

解释一个这个式子:
samplek想要最后被抽出,
首先要在他出现的时候以m/k替换掉已经被抽出的m个中的一个,
然后,不会被后面的每一个替换掉,
他被sample(k+1)替换的概率为m/(k+1) * 1/m = 1/(k+1)
不被替换的概率为k/k+1
这些事件相互独立,最终概率为这些独立事件的乘积,m/n,所以无论n取值多少,以这种方式取得样本是等概率取样的。

这也可以被描述为:在一个不知道数据量大小的数据流中进行等概率抽样。
方式:
(1)抽取前m备选,从第m+1个开始,按上述策略取样
(2)用一个数字c记录当前已抽样样本数,迭代此过程

def sample_unknown_n(m):
import sys
import random
c = 1
sample = []
for line in sys.stdin:
num = float(line.strip())
if c<= m:
sample.append(num)
else:
if random.random < float(m)/c:
index = random.randint(0,m-1)
sample[index] = num
c += 1
return sample

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值