Alias 算法抽样
简述
对于一个只有两种情况的情景抽样,很简单,例如A的概率是0.4,B的概率是0.6,那么只需要随机数小于0.4就是A,否则是B。
如果扩展多个情况,例如A,B,C的概率分别是0.2,0.3,0.5,一般情况O(1)的方法是生成一个数组[A,A,B,B,B,C,C,C,C,C,C],对数组进行随机抽取,这样比较耗费内存。
Alias也可以在O(1)的方法下取样,并且内存需要更小。
还是以上面的A,B,C为例子
- 把A,B,C的概率 X 3 得到[0.6, 0.9, 1.5]
- 把它们拆分拼成3组,例如,第一组 0.6的A+0.4的B,第二组0.5的B加0.5的C,第三组1.0的C。
- 随机抽取三组中的一组后,就类似于只有两种情况,再随机抽取就能取到。
代码
1 | import random |
参考
https://lips.cs.princeton.edu/the-alias-method-efficient-sampling-with-many-discrete-outcomes/