Alias Method for Sampling 采样方法
【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】
2、The Alias Method: Efficient Sampling with Many Discrete Outcomes
Alias Method for Sampling 采样方法的更多相关文章
- 茅坑杀手与Alias Method离散采样
说起Alias,你可能第一个联想到的是Linux中的Alias命令,就像中世纪那些躲在茅坑下面(是真的,起码日本有粪坑忍者,没有马桶的年代就是社会的噩梦)进行刺杀的杀手一样,让人防不胜防,对于那些被这 ...
- Alias Method解决随机类型概率问题
举个例子,游戏中玩家推倒了一个boss,会按如下概率掉落物品:10%掉武器 20%掉饰品 30%掉戒指 40%掉披风.现在要给出下一个掉落的物品类型,或者说一个掉落的随机序列,要求符合上述概率. 一般 ...
- 算法名称 Alias Method
public class AliasMethod { /* The probability and alias tables. */ private int[] _alias; private dou ...
- alias sample method——运行时间复杂度为O(1)的抽样算法
根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3 ...
- word2vec原理(三) 基于Negative Sampling的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- Node2vec 代码分析
Node2vec 代码从Github上clone到本地,主要是main.py和node2vec.py两个文件. 下面把我的读代码注释放到上面来, import numpy as np import n ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- c#中奖算法的实现
算法名称 Alias Method public class AliasMethod { /* The probability and alias tables. */ private int[] _ ...
- jQuery 1.9 Ajax代码带注释
/* -----------ajax模块开始 -----------*/ var // Document location ajaxLocParts, ajaxLocation, ajax_nonce ...
随机推荐
- IntelliJ IDEA windows与mac下常用快捷键
摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...
- 【Spark】SparkStreaming-如何使用checkpoint
SparkStreaming-如何使用checkpoint sparkstreaming checkpoint 默认_百度搜索 spark streaming中使用checkpoint - HarkL ...
- Centos6.4下安装protobuf-c问题及解决办法
1.前言 protobuf是Google提供的结构持久化工具,类型XML,但要比XML更加灵活,效率要高.protobuf当初支持C++.JAVA和Python,后来有了支持C语言的Protobuf- ...
- dubbo Framework pic
dubbo Framework pic
- Java归去来第3集:Eclipse中给动态模块升级
一.前言 如果还不了解剧情,请返回第2集的剧情 Java归去来第2集:利用Eclipse创建Maven Web项目 二.开始升级动态模块 2.1:查看原来的版本 我们先来看看Ecli ...
- Hibernate setDate自动截去时分秒
遇到一个这样的问题在hibernate应用时,Qurey对象qurey Query query = ses.createQuery(HQL); query.setDate("endTime& ...
- PDO 增删改查封装的类
Selecting Data 你在mysql_*中是这样做的 <?php $result = mysql_query('SELECT * from table') or die(mysql_er ...
- C# 动态解析表达式
需求 我们很难捉摸用户的思维,即使使用非常正式的文档规范某些数据的定义.结果的标准等,也不能抵挡住用户不断变化的需求,但他们有个万变不离的东西——你做这个东西要是万能的,即输入参数类型.个数等发生改变 ...
- LintCode:Fibonacci
C++ class Solution{ public: /** * @param n: an integer * @return an integer f(n) */ int fibonacci(in ...
- c/c++ 函数指针的用法
[目录] 基本定义 c 函数指针使用举例 c++ 函数指针使用举例 函数指针作为函数参数 函数指针作为函数返回值 函数指针数组 typedef 简化函数指针操作 c语言函数指针的定义形式:返回类型 ( ...