Alias Table

原创 2017年07月17日 20:39:43

AliasTable

典型的多项式分布的复杂度为O(k)k为多项式分布的大小,那么能否将O(k)的复杂度降为O(1)呢?Alias方法就是这样的一种方法。

原理

对于概率分布pi其中i{1,,l},Alias方法要达到什么目的呢?Alias的目的是通过对原有的l个概率值pi进行分解和合并,使得新形成的l个概率值均等于1/l,且每个概率值最多来自原来的两个不同的概率值。用形象的话来描述的话,最后我们会得到l个桶,每个桶内最多有两个颜色。得到转换后的结果,那么采样的话只需要两次就可以达到原来的效果,第一次采样得到一个桶的编号,第二次采样得到该桶内的颜色。
image
举个例子,如图所示,上述概率分布的均值为1/4,那么Alias方法通过对概率值得分解和组合,将1图转换为4图,如果采样得到第一个桶的话,然后产生一个[0,1/4]的随机数,当落到红色范围内,采样得到的值为1,否则为4

伪代码

产生Alias表

image

采样

image

代码

# -*- encoding:utf8 -*-

from random import randrange,random
import numpy as np
from datetime import datetime

class AliasTable():
    def __init__(self,probs):
        self.probs=probs
        probs=np.array(probs)
        self.bins=len(probs) 
        probs=probs*self.bins/np.sum(probs)    
        self.p_table=np.ones(self.bins,dtype=np.float64)
        self.b_table=np.zeros(self.bins,dtype=np.int64)
        p=1/self.bins
        L,H=[],[]
        for i in range(self.bins):
            if probs[i]<1:
                L.append(i)
            else:
                H.append(i)

        while len(L)>0 and len(H)>0:
            l=L.pop()
            h=H.pop()
            self.p_table[l]=probs[l]
            self.b_table[l]=h
            probs[h]=probs[h]-(1-probs[l])
            if probs[h]<1:
                L.append(h)
            else:
                H.append(h)

        while len(L)>0:
            l=L.pop()
            self.p_table[l]=1

        while len(H)>0:
            h=H.pop()
            self.p_table[H]=1

    def sample(self):  
        b=randrange(self.bins)
        if random()<self.p_table[b]:
            return b
        else:
            return self.b_table[b]

if __name__=='__main__':
    test=[0,1,2]
    at=AliasTable(test)
    t=at.sample() 

参考文献

  • Li, A. Q., Ahmed, A., Ravi, S., & Smola, A. J. (2014). Reducing the sampling complexity of topic models. 891-900.

相关文章推荐

LDA工程化之快速采样算法

LDA 是一种topic model,相信对大多数人工业界研发人员来说,LDA是一种让人望而却步的东西。LDA背后的数学理论是相对复杂的,但是LDA的最终计算公式却很简单,物理意义也很好理解。在互联网...

LDA︱基于LDA的Topic Model变形+一些NLP开源项目

最近有想用LDA理论的变形来解决问题,调研中。。。。 基于LDA的Topic Model变形 基于LDA的Topic Model变形最近几年来,随着LDA的产生和发展,涌现出了一批搞Topic M...

抽奖概率-三种算法

最近接触到一个抽奖需求,加上平时玩的暗黑3很少掉暗金装备,就抽空学习下这类概率问题,暂时按网络称为掉宝类型概率。 例如游戏中打败一个boss,会掉落下面其中一个物品,而每个物品都有一定概率: 1. 靴...

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

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

Mysql两个查询结果相加?错误:Every derived table must have its own alias

查询结果求和,mysql错误:Every derived table must have its own alias

Every derived table must have its own alias

Every derived table must have its own alias 这主要是SQL语句的语法错误: select * from (select a.* from temperatu...

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Not unique table/alias: 'e'

1、错误原因base.dao.impl.BaseDaoImpl org.hibernate.exception.SQLGrammarException: error executing work a...

Every derived table must have its own alias

如下SQL语句: SELECT * FROM ( SELECT ID,URL FROM alone_action WHERE STATE = '1' ) 在Oracle中可以执行,但在M...

源代码+解析ALIAS_OBJ.pro

  • 2017年08月19日 19:06
  • 418KB
  • 下载

原:LINUX alias,unalias

  • 2011年12月07日 22:11
  • 18KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Alias Table
举报原因:
原因补充:

(最多只允许输入30个字)