最近在学习过程中需要对服从某种分布的离散型随机变量进行抽样,在LibTroch中查到了torch::multinomial(多项分布),该方法的接口如下:

at::Tensor multinomial(
const at::Tensor & self, // 概率分布
int64_t num_samples, // 一次抽样个数
bool replacement=false, // 是否重复抽样,默认不重复抽样(无放回地)
c10::optional<at::Generator> generator=c10::nullopt // 随机数生成器
)

使用时需要注意几点:

  • 第一个参数:给定的概率分布加和不为1时,将自动归一化。例如给定某个二项分布{0:0.2,1:0.3},那么抽样时取0的概率为\(0.2/(0.2+0.3) = 0.4\),取1的概率为\(0.3/(0.2+0.3) = 0.6\)。
  • 第三个参数:设置为真时,将重复抽样(有放回地)。如果一次抽样个数等于样本空间个数,这里需要设置为真。

下面是一个多项分布的例子,假设样本空间为4,其概率分布如下

\(x_i\) 0 1 2 3
\(p(x_i)\) 0.1 0.2 0.3 0.4

统计10000000次抽样结果的频率,代码如下所示

#include <iostream>
#include <torch/torch.h> int main(int argc, char* argv[])
{
// 概率分布(加和不为一时,将自动进行归一化处理)
torch::Tensor probs = torch::tensor({0.1, 0.2, 0.3, 0.4}); int num_0 = 0;
int num_1 = 0;
int num_2 = 0;
int num_3 = 0;
for (int i = 1; i <= 10000000; ++i)
{
int sample = torch::multinomial(probs, 1, true).item<long>(); // 抽样
switch (sample)
{
case 0:
num_0 += 1;
break;
case 1:
num_1 += 1;
break;
case 2:
num_2 += 1;
break;
case 3:
num_3 += 1;
break;
default:
break;
}
std::cout << "freq of 0 is " << double(num_0) / i << std::endl
<< "freq of 1 is " << double(num_1) / i << std::endl
<< "freq of 2 is " << double(num_2) / i << std::endl
<< "freq of 3 is " << double(num_3) / i << std::endl
<< std::endl;
} return 0;
}

运行结果如下,每个事件的统计频率与其概率分布能够较好吻合。各位读者可以试一试将概率分布修改使其和值不为1,看看结果会是怎么样。。。


参考资料:

TORCH.MULTINOMIAL

LibTorch 多项分布的更多相关文章

  1. 关于Beta分布、二项分布与Dirichlet分布、多项分布的关系

    在机器学习领域中,概率模型是一个常用的利器.用它来对问题进行建模,有几点好处:1)当给定参数分布的假设空间后,可以通过很严格的数学推导,得到模型的似然分布,这样模型可以有很好的概率解释:2)可以利用现 ...

  2. 多项分布(multinominal distribution)

    简介 更一般性的问题会问:“点数1~6的出现次数分别为(x1,x2,x3,x4,x5,x6)时的概率是多少?其中sum(x1~x6)= n”.这就是一个多项式分布. 定义 把二项分布推广至多个(大于2 ...

  3. libtorch初体验

    环境 Ubuntu -18.04.1, opencv3.4.0 ,  python 3.6,  cmake 3.5.0, pytorch 1.0. pytorch官网下载对应版本:https://py ...

  4. 伯努利分布、二项分布、Beta分布、多项分布和Dirichlet分布与他们之间的关系,以及在LDA中的应用

    在看LDA的时候,遇到的数学公式分布有些多,因此在这里总结一下思路. 一.伯努利试验.伯努利过程与伯努利分布 先说一下什么是伯努利试验: 维基百科伯努利试验中: 伯努利试验(Bernoulli tri ...

  5. libtorch 哪些函数比较常用?

    libtorch 加载 pytorch 模块进行预测示例 void mat2tensor(const char * path, torch::Tensor &output) { //读取图片 ...

  6. 如何使用 libtorch 实现 AlexNet 网络?

    如何使用 libtorch 实现 AlexNet 网络? 按照图片上流程写即可.输入的图片大小必须 227x227 3 通道彩色图片 // Define a new Module. struct Ne ...

  7. 如何使用 libtorch 实现 LeNet 网络?

    如何使用 libtorch 实现 LeNet 网络? LeNet 网络论文地址: http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

  8. 如何在 windows 配置 libtorch c++ 前端库?

    如何在 windows 配置 libtorch c++ 前端库? 下载 pytorch 已经编译好的库: 此库不带 gpu,主要方便演示.支持 win7 win10 系统. 下载地址:https:// ...

  9. 二项分布 , 多项分布, 以及与之对应的beta分布和狄利克雷分布

    1. 二项分布与beta分布对应 2. 多项分布与狄利克雷分布对应 3. 二项分布是什么?n次bernuli试验服从 二项分布 二项分布是N次重复bernuli试验结果的分布. bernuli实验是什 ...

随机推荐

  1. java--方法/debug

    一.方法的定义 1.什么是方法 方法是将具体独立功能的代码块组织称为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建后使用,该过程为方法定义: 方法创建后并不是直接运行的,需要手动十一后执行 ...

  2. Java编程作业

    1.编程题 设计一个用户类User,类中的变量有用户名.密码和记录用户数量的变量,定义3个构造方法:无参的.为用户名赋值的.为用户名和密码赋值的,还有获取和设置密码的方法和返回类信息的方法. pack ...

  3. rust实战系列-base64编码

    前言 某些只能使用ASCII字符的场景,往往需要传输非ASCII字符的数据,这时就需要一种编码可以将数据转换成ASCII字符,而base64编码就是其中一种. 编码原理很简单,将原始数据以3字节(24 ...

  4. MySQL--创建计算字段

    存储在数据库表中的数据一般不是应用程序所需要的格式.下面举几个例子.  如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中.  城市.州和邮政编码存储在不同的列中 ...

  5. 002 Redis使用及API

    Redis的使用及相关API 1.作用: 提高查询效率 一定程度上可以减轻数据库服务器的冲击压力,从而保护了数据库 //1.是否包含key redisTemplate.hasKey(key) //2. ...

  6. 零基础学Java(11)自定义类

    前言   之前的例子中,我们已经编写了一些简单的类.但是,那些类都只包含一个简单的main方法.现在来学习如何编写复杂应用程序所需要的那种主力类.通常这些类没有main方法,却有自己的实例字段和实例方 ...

  7. CentOS删除桌面环境

    公司有几台虚拟机安装的是CentOS7的桌面环境,平时也是用终端访问,于是在服务器卡住需要重启时,顺便就把桌面环境给卸载了:测试了好多方法均不成功,最终找到了可行的方式,以此记录: [root@yun ...

  8. 2022-7-18 第五组 pan 面向对象

    面向过程 向过程就是:面向过程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求. 面向对象 什么是面向对象: 面向对象思想就是不断的创建对象,使用对 ...

  9. node.js操作数据库

    var sys = require('sys'); var Client = require('mysql').Client; var client = new Client(); client.us ...

  10. 技术分享 | MySQL Group Replication集群对IP地址的限制导致的一些问题与解决办法

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 遇到问题 测试人员小玲准备在docker环境中部署MGR集群进行一些测试,她有三个容器,容器IP分别是: 172.3 ...