1.Alias算法的归一化是对每个事件概率乘以事件总数

2.Alias算法核心是把所有事件拉成1*N长方形,N代表事件总数

3.算法实现的关键步骤是找到面积小于1的列,再找大于1的列进行填充

我们介绍一种时间复杂度O(1)的采样算法——Alias Mehtod。话不多说,直接进入正题。

算法原理

用一个例子加以说明Alias的算法原理。下面是四个事件发生的概率分布:

事件 A B C D
概率 1/2 1/3 1/12 1/12

要生成服从该分布的随机事件。

首先,将概率用列的高度表示,行是事件总量的均分:

做归一化,每一列事件的概率乘以事件总数(p*N):

然后拉成1*N的长方形,保证每一列最多只允许两个事件存在

这个1*N的长方形称为Alias Table,存储两个数组:

  • Prab数组:第i列对应的事件i在该列的面积占比

  • Alias数组:第i列不是事件i的另外一个事件标号

比如上图的Prab=【2/3,1,1/3,1/3】,Alias=【2,0,1,1】。

然后采样的时候生成两个随机数——第一个产生1~N之间的整数i,决定落在哪一列;第二个产生服从均匀分布0~1的任意数,判断其与Prab【i】的大小,如果小于Prab【i】,则采样i,否则采样Alias【i】

算法实现

利用程序很容易实现Alias算法,其步骤是:

算法核心就是步骤3和4,不断循环即可。

我们用python实现这个过程:

def Alias(Prob_li):''':param Prob_li: 事件对应的概率列表,索引代表事件:return: 返回Prab和Alias列表'''M = len(Prob_li)S = [M*i for i in Prob_li]Prab_table = [1 for i in range(M)]Alias_table = [0 for i in range(M)]while True:for i, s1 in enumerate(S):if s1 < 1:Prab_table[i] = s1s0 = 1 - s1for j, s2 in enumerate(S):if s2 != 1 and s2 > s0 and i != j:Alias_table[i] = j+1S[i] = 1S[j] = s2 - s0breakbreake = 1 - min(S)if e < 0.000001:breakreturn Prab_table, Alias_table

看看上面例子出来的结果:

离散采样——Alias Method相关推荐

  1. Alias Method解决随机类型概率问题(别名算法)

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

  2. 正弦波信号发生器(离散采样)

    正弦波发生器: 1.将连续的正弦波信号进行离散化 设正弦波周期为T=2*pi,对一个周期的正弦波进行100次采样,则 相应采样点的离散值为: sin(2*pi/100) sin(2*pi*2/100) ...

  3. 快速了解Alias method/别名采样方法

    文章目录 背景 普通算法 别名采样方法 背景 给定一个概率分布:[1/2, 1/3, 1/12, 1/12],我要你根据这个概率分布,随机抽取一个事件出来.有人说,直接用np.random.choic ...

  4. No.03 色散补偿 FSM算法 频域离散采样算法 MATLAB Python 代码实现

    色散系统的频域传输方程如下 G ( z , w ) = e D λ 2 z j 4 π c ω 2 G(z,w)=e^{\frac{D\lambda^2z}{j4\pi c}\omega^2} G(z ...

  5. Polyline Simplification(多线段简化/离散采样)

    本文参考自:https://www.codeproject.com/Articles/114797/Polyline-Simplification 前言 在计算几何中,经常我们会碰到需要简化输入Pol ...

  6. 【数字信号处理】离散时间信号 ( 模拟信号、离散时间信号、数字信号 | 采样导致时间离散 | 量化导致幅度离散 )

    文章目录 一.模拟信号.离散时间信号.数字信号 二.采样导致时间离散 三.量化导致幅度离散 一.模拟信号.离散时间信号.数字信号 时间是 连续 的 , 幅度也是 连续 的 , 该信号是 模拟信号 或 ...

  7. matlab方波假频现象分析,基于MATLAB 的信号时域采样及频率混叠现象分析

    龙源期刊网 http://www.doczj.com/doc/7d04774eae45b307e87101f69e3143323968f58a.html 基于MATLAB 的信号时域采样及频率混叠现象 ...

  8. 数字信号处理学习笔记(一)|离散傅里叶变换

    离散傅里叶变换(DFT) 离散傅里叶变换(Discrete Fourier Transform)的实质是有限长序列傅里叶变换的有限点离散采样,实现了频域离散化,使数字信号处理可以在频域采用数值运算的方 ...

  9. JBU联合双边上采样

    很多图像处理算法,如立体视觉中的深度估计,图像上色,高动态范围HDR中的tone mapping,图像分割,都有一个共性的问题:寻找一个全局的解,这个解是指一个分段的piecewise平滑含糊,描述了 ...

最新文章

  1. lt view gt android,RecyclerView的linearLayoutManager.findViewByPosition()问题
  2. 搞懂单链表常见面试题
  3. 微信小程序开发简易计算器改进版
  4. 微信好友数据打包下载--微信数据分析(二)
  5. 带你认识Linux安全渗透,秒懂的那种
  6. [ASP.NET] 限制上传文件类型的两种方法(转)
  7. 设计模式之【外观模式-Facade】
  8. P1959 遗址_NOI导刊2009普及(6)
  9. Cortex-M/R/A 芯片选型及简介
  10. python函数转换_将Python函数转换为PL/Python函数
  11. ADO.NET 3.5 同SQL 2008的新的存储过程保存方式
  12. Java编程:矩阵网格类算法问题做DFS
  13. python会自动释放内存吗_没白熬夜,终于把Python的内存管理机制搞明白了
  14. 将beyond compare设置为svn的代码比较工具
  15. ttf字体,简单获取
  16. ASCALL码对照表
  17. Actor-Critic:强化学习中的参与者-评价者算法简介
  18. chrome浏览器小恐龙自动跑
  19. 迪斯尼电影经典台词精选
  20. NVIDIA Jetson TK1学习与开发——手动刷机

热门文章

  1. 搜狗高速浏览器4.2正式版发布
  2. TS流压縮音频的自动增益控制方法
  3. 沸腾!华为鸿蒙系统正式登场,手机即日起可升级!万物互联野心曝光,P50也官宣了...
  4. [rom助手]制作刷机包,一键刷机不求人
  5. 乐鑫Esp32学习之旅 18 入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
  6. php查询获取经纬度的详细信息-腾讯地图
  7. MATLAB用SOR方法解方程组,SOR迭代法 求MATLAB程序
  8. 王常在主任提醒家长要警惕孩子语言发育迟缓!怎样判断语言发育是否迟缓?
  9. 口水文:京东(零售电商)和美团(服务平台电商)
  10. Android 息屏亮屏代码实现