博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Alias Method for Sampling 采样方法
阅读量:6118 次
发布时间:2019-06-21

本文共 1818 字,大约阅读时间需要 6 分钟。

 【Alias Method for Sampling】原理

   对于处理离散分布的随机变量的取样问题,Alias Method for Sampling 是一种很高效的方式。

   在初始好之后,每次取样的复杂度为 O(1)。 

   、、、

 

【Python 代码】

# !/usr/bin/env python# encoding: utf-8__author__ = 'ScarlettZero'# 20180522# AliasMethod Samplingimport timeimport numpy as npimport pandas as pdimport numpy.random as nprdef 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,Probdef 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() 

运行结果:

 

 

 

 

【Reference】

1、

2、

 

转载地址:http://iglka.baihongyu.com/

你可能感兴趣的文章
22. linux 常用命令
查看>>
ASP.Net 使用GridView模板删除一行的用法
查看>>
(十六)字段表集合
查看>>
JPGraph
查看>>
实验二 Java面向对象程序设计
查看>>
------__________________________9余数定理-__________ 1163______________
查看>>
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
Content Provider的权限
查看>>
416. Partition Equal Subset Sum
查看>>
centos7.0 64位系统安装 nginx
查看>>
数据库运维平台~自动化上线审核需求
查看>>
注解开发
查看>>
如何用 Robotframework 来编写优秀的测试用例
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>