蓄水池采样

sampling听起来更对口。
题目要解决的问题很有意思(http://blog.jobbole.com/42550/

给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。

解决的方案也很简单:假定现在是\(t\)时刻,此刻手上留着的样本是\(a_t\),流上的样本是\(b\),那么应该使样本\(b\)\(P(b)= \frac{1}{t+1}\)的概率替换\(a_t\)
简单记下证明:
\(P(a_t^{m})\)\(m\)时刻手上是\(a_t\)样本的概率,每做一次决策时间+1。

\(P(a_t^{t})=\frac{1}{t}\)。(假设)
那么\(b\)\(t+1\)时刻在手上的概率(被选中):\(P(b^{t+1})=\frac{1}{t+1}\)
\(P(a_t^{t+1})=\frac{1}{t}\left(1-\frac{1}{t+1}\right)=\frac{1}{t+1}\)
所以\(P(a_{t+1}^{t+1})=\frac{1}{t+1}\),其中\(a_{t+1}\in \{a_t, b\}\)
也就是说,无论在哪个时刻,手中的样本都是对已经流过去样本进行随机采样的结果。(这个是否等价于上面的题目...)
这附上另一个博客:
https://www.cnblogs.com/python27/p/Reservoir_Sampling_Algorithm.html

posted @ 2018-04-13 16:38  rotxin  阅读(157)  评论(0)    收藏  举报