【Alias Method for Sampling】原理

对于处理离散分布的随机变量的取样问题,Alias Method for Sampling 是一种很高效的方式。

在初始好之后,每次取样的复杂度为 O(1)。

、、、

【Python 代码】

# !/usr/bin/env python
# encoding: utf-8
__author__ = 'ScarlettZero' #
# AliasMethod Sampling import time
import numpy as np
import pandas as pd
import numpy.random as npr def alias_setup(probs):
''' :param probs: 某个概率分布
:return: Alias数组与Prob数组
'''
K =len(probs) # K为类别数目
Prob =np.zeros(K) # 对应Prob数组:落在原类型的概率
Alias =np.zeros(K,dtype=np.int) # 对应Alias数组:每一列第二层的类型 #Sort the data into the outcomes with probabilities
#that are larger and smaller than 1/K
smaller =[] # 存储比1小的列
larger =[] # 存储比1大的列 for kk,prob in enumerate(probs):
Prob[kk] =K*prob # 概率(每个类别概率乘以K,使得总和为K)
if Prob[kk] <1.0: # 然后分为两类:大于1的和小于1的
smaller.append(kk)
else:
larger.append(kk) # Loop though and create little binary mixtures that appropriately allocate
# the larger outcomes over the overall uniform mixture. #通过拼凑,将各个类别都凑为1
while len(smaller) > 0 and len(larger) > 0:
small = smaller.pop()
large = larger.pop() Alias[small] = large #填充Alias数组
Prob[large] = Prob[large]-(1.0 - Prob[small]) #将大的分到小的上 if Prob[large] <1.0:
smaller.append(large)
else:
larger.append(large)
print("Prob is :", Prob)
print("Alias is :", Alias)
return Alias,Prob def alias_draw(Alias,Prob):
'''
:param J: Alias数组
:param q: Prob数组
:return:一次采样结果
'''
K=len(Alias) # Draw from the overall uniform mixture.
kk = int(np.floor(npr.rand()*K)) #随机取一列 # Draw from the binary mixture, either keeping the small one, or choosing the associated larger one.
# 采样过程:随机取某一列k(即[1,4]的随机整数,再随机产生一个[0-1]的小数c,)
# 如果Prob[kk]大于c,
if npr.rand() <Prob[kk]: #比较
return kk
else:
return Alias[kk] if __name__ == '__main__':
start=time.time() K = 5 # K初始化为5类
N = 5 # Get a random probability vector.
# probs = npr.dirichlet(np.ones(K), 1).ravel() # .ravel(): 将多维数组降为一维
probs =[0.2,0.3,0.1,0.2,0.2]
# Construct the table
Alias, Prob = alias_setup(probs) # Prob is : [ 0.25058826 0.69258202 0.83010441 0.87901003 1. ]
# Alias is : [4 4 4 4 0]
###### # Generate variates.
# X 为有多少样本需要采样
X = np.zeros(N)
for nn in range(N):
X[nn] = alias_draw(Alias, Prob)
print("最终的采样结果X为:",X) end=time.time()
spend=end-start
print("耗时为:%0.4f s"%spend) sure_k = np.random.choice(5, 1, p=probs)
print("surek为:",sure_k)
# 关于SEM的并行,我先尝试了在 sample k 的时候使用Alias Method,但是和之前比效率方面没见得有提升(之前SEM是利用 sure_k = np.random.choice(aspects_num, 1, p=p) 进行sample k的)
# Alias必须是多次采样才有效率上的提升的。如果每一次sample都新来一次alias那是没有用的

运行结果:

【Reference】

1、Alias Method离散分布随机取样

2、The Alias Method: Efficient Sampling with Many Discrete Outcomes

Alias Method for Sampling 采样方法的更多相关文章

  1. 茅坑杀手与Alias Method离散采样

    说起Alias,你可能第一个联想到的是Linux中的Alias命令,就像中世纪那些躲在茅坑下面(是真的,起码日本有粪坑忍者,没有马桶的年代就是社会的噩梦)进行刺杀的杀手一样,让人防不胜防,对于那些被这 ...

  2. Alias Method解决随机类型概率问题

    举个例子,游戏中玩家推倒了一个boss,会按如下概率掉落物品:10%掉武器 20%掉饰品 30%掉戒指 40%掉披风.现在要给出下一个掉落的物品类型,或者说一个掉落的随机序列,要求符合上述概率. 一般 ...

  3. 算法名称 Alias Method

    public class AliasMethod { /* The probability and alias tables. */ private int[] _alias; private dou ...

  4. alias sample method——运行时间复杂度为O(1)的抽样算法

    根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3 ...

  5. word2vec原理(三) 基于Negative Sampling的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  6. Node2vec 代码分析

    Node2vec 代码从Github上clone到本地,主要是main.py和node2vec.py两个文件. 下面把我的读代码注释放到上面来, import numpy as np import n ...

  7. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  8. c#中奖算法的实现

    算法名称 Alias Method public class AliasMethod { /* The probability and alias tables. */ private int[] _ ...

  9. jQuery 1.9 Ajax代码带注释

    /* -----------ajax模块开始 -----------*/ var // Document location ajaxLocParts, ajaxLocation, ajax_nonce ...

随机推荐

  1. 浅谈APP流式分页服务端设计(转)

    http://www.jianshu.com/p/13941129c826 a.cursor游标式分页 select * from table where id >cursor limit pa ...

  2. Java-JUC(七):同步锁的几种方式

    为什么要使用同步锁? 因为当使用多线程同时访问一个变量或对象时,如果这些线程中即有读又有写操作时,会造成导致变量或对象的状态出现混乱.例如:一个银行账户被A/B两个线程同时操作,A线程.B线程同时开始 ...

  3. C# Winform 未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项。试图加载格式不正确的程序

    在使用Winform 开发了一个小软件,其中使用了SQLite作为数据库 但在我的Win7 64位系统上却出现了以下错误: System.BadImageFormatException: 未能加载文件 ...

  4. 解决Ubuntu/debian的Apt-get 由于依赖关系安装失败的问题

    The following packages have unmet dependencies: libssl-dev: Depends: libssl0.9.8 (= 0.9.8k-7ubuntu8) ...

  5. 一个ActiveX control的创建过程

    创建 根据这篇文章的介绍:http://www.cnblogs.com/time-is-life/p/6354152.html 来创建,里面包含了创建的基本过程以及属性事件方法的使用. 使用: 参考文 ...

  6. gson ajax 数字精度丢失

    ajax传输的json,gson会发生丢失,long > 15的时候会丢失0 解决方案:直接把属性为long的属性自动加上双引号成为js的字符串,这样就不会发生丢失了,ajax自动识别为字符串. ...

  7. 命令行下从bak文件恢复sqlserver数据库方法

    命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...

  8. Office办公 Winrar如何批量把每个文件夹分别压缩成不同的压缩包

    右击很多文件夹,添加到压缩文件,然后在文件中勾选把每个文件放到单独的压缩文件中即可  

  9. .geodatabase与gdb的相互转换

    .geodatabase长得是gdb的全称,确实它们有一定的关系,但也有区别. 简单认识一下 有人也问过我,gdb外表像个文件夹,是怎么实现的.gdb数据库是ESRI特有的数据库,它是一些数据集定义. ...

  10. select/poll/epoll 对比

    前两篇文章介绍了select,poll,epoll的基本用法,现在我们来看看它们的区别和适用场景. 首先还是来看常见的select和poll.对于网络编程来说,一般认为poll比select要高级一些 ...