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.

HTML 入门视频课程

-
  • 1970年01月01日 08:00

invalid table alias

If an alias is assigned to a table, all explicit references to the table in the Transact-SQL stateme...
  • u013593585
  • u013593585
  • 2016-06-01 14:44:53
  • 1049

错误代码: 1066 Not unique table/alias: 'c'

1、错误描述1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT (SELECT CONCAT( s.name, '/', sr...
  • you23hai45
  • you23hai45
  • 2015-08-06 23:26:12
  • 10506

【数学】时间复杂度O(1)的离散采样算法—— Alias method/别名采样方法

因为需要用到Alias Sampling Method的方法,但是查了一下,发现没有找到靠谱的关于Alias Method的中文介绍,所以干脆自己写一个好了。 关于Alias Method的介绍...
  • haolexiao
  • haolexiao
  • 2017-03-24 09:52:40
  • 3139

Alias Method for Sampling

Milo老湿在他的博文 用JavaScript玩转游戏编程(一)掉宝类型概率 中提到了游戏中按一定概率掉宝的算法,即根据给定的PDF(probability density function),在...
  • mandycool
  • mandycool
  • 2012-11-14 14:58:48
  • 2558

Hive查询报错 Invalid table alias or column reference 'create_time': (possible column names are: _c0, _c1

在执行Hive操作的时候有时候会遇到这种报错:  Invalid table alias or column reference 'create_time': (possible column na...
  • qq_31573519
  • qq_31573519
  • 2016-10-11 18:55:06
  • 4873

hive sql 开发过程碰到的问题

1.distribute by 经常和 sort by 配合使用
  • philip502
  • philip502
  • 2014-10-29 15:02:32
  • 1675

HIVE Queryes 查询

SELECT … FROM Clauses hive> SELECT name, salary FROM employees; 表别名 hive> SELECT na...
  • IQuicksandI
  • IQuicksandI
  • 2013-01-21 22:00:17
  • 10964

Alias Table

AliasTable
  • guolinsen123
  • guolinsen123
  • 2017-07-17 20:39:43
  • 363

Alias method 别名算法

以下内容来自转载: 因为需要用到Alias Sampling Method的方法,但是查了一下,发现没有找到靠谱的关于Alias Method的中文介绍,所以干脆自己写一个好了。  关于A...
  • qq_33765907
  • qq_33765907
  • 2018-01-27 18:45:02
  • 67
收藏助手
不良信息举报
您举报文章:Alias Table
举报原因:
原因补充:

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