【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. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标

    转自:http://blog.csdn.net/lovesunshine2008/article/details/4048158 设置坐标映射    (1)Windows坐标系统 Windows坐标系 ...

  2. 3D打印机开源、免费分层软件介绍

    分层软件,就是把3D模型按照层厚设置按照Z轴方向分层,并得到G代码,供设备使用.基本上3D打印机都自带了控制软件,对于想自己开发3D打印机的朋友来说,已经有很多国外的免费或者开源的分层软件可以直接使用 ...

  3. (转)HLSL,函数列表

    中文列表 函数名 说明 abs 计算输入值的绝对值. acos 返回输入值反余弦值. all 测试非0值. any 测试输入值中的任何非零值. asin 返回输入值的反正弦值. atan 返回输入值的 ...

  4. Flask学习笔记

    1.路由用"/"结尾. 比如@app.route("/about/"),可以匹配/about和/about/,而@app.route("/about& ...

  5. registry-1.docker.io TimeOut 错误

    用Docker For Windows在Windows 10上执行docker login或者 docker pull/push的时候,经常会报这样的错误: https: Get https://re ...

  6. MFC获得当前用户等信息

    MFC获得当前用户等信息 #ifndef UNICODE #define UNICODE #endif #pragma comment(lib, "netapi32.lib") # ...

  7. MAC高效软件必备-落雨

    更新时间:2017年09月19日23:45:29 使用MAC有一年多,最想说的莫过于如何打造一个高效的使用Mac的体验. 1. MAC任务栏管理,窗口切换 1. Mac任务栏管理(类似于Windows ...

  8. IDEA实现序列号接口

    idea自动生成serialVersionUID (2013-12-15 08:12:09)转载▼ Setting->Plugins 找到一个叫 GenerateSerialVersionUID ...

  9. 基于PHP构建OAuth 2.0 服务端 认证平台

    OAuth2.0 认证服务 安装 你可以在github上下载OAuth Server PHP,也可以用下列命令下载,不过内容都是一样的 mkdir my-oauth2-walkthrough cd m ...

  10. maven 配置篇 之pom.xml

    http://www.blogjava.net/zyl/archive/2006/12/30/91055.html http://maven.apache.org/pom.html的翻译.     m ...