遇到一个要使用 dirichlet 分布的情形,发现 C++ 标准库中没有现成的。查阅维基百科发现,虽然它挺复杂,但是它跟 Gamma 分布有如下关系:

设有 K 个相互独立且分别满足 Gamma 分布的分布:

\[Y_1 \sim Gamma(\alpha_1, \theta), ..., Y_K \sim Gamma(\alpha_K, \theta)
\]

则有:

\[\begin {aligned}
V &= \sum_{i=1}^{K}Y_i \sim Gamma(\alpha_0, \theta),\\
X &= (X_1, ..., X_K) = \left(\frac {Y_1}{V}, ..., \frac {Y_K}{V}\right) \sim Dir(\alpha_1, ..., \alpha_K)
\end {aligned}
\]

就是说,可以使用 gamma 分布来生成 dirichlet 分布。以下是用 C++ 实现的版本:

#include <random>

void dirichlet(double* out, int k, double a) {
std::gamma_distribution<double> gamma(a);
std::random_device rd;
double *y = alloca(sizeof(double)*k); // stack allocation
double sum=0;
for (int i=0; i<k; ++i) {
y[i] = gamma(rd);
sum += y[i];
}
for (int i=; i<k; ++i) {
out[i] = y[i]/sum;
}
} void dirichlet(double* out, int k, double const* a) {
using Gamma = std::gamma_distribution<double>;
Gamma gamma;
std::random_device rd;
double *y = alloca(sizeof(double)*k); // stack allocation
double sum=0;
for (int i=0; i<k; ++i) {
y[i] = gamma(rd, Gamma::param_type(a[i], 1));
sum += y[i];
}
for (int i=0; i<k; ++i) {
out[i] = y[i]/sum;
}
}

C++ 迪利克雷(Dirichlet)分布的更多相关文章

  1. HDU - 5628:Clarke and math (组合数&线性筛||迪利克雷卷积)

    题意:略. 思路:网上是用卷积或者做的,不太会. 因为上一题莫比乌斯有个类似的部分,所以想到了每个素因子单独考虑. 我们用C(x^p)表示p次减少分布在K次减少里的方案数,由隔板法可知,C(x^p)= ...

  2. LDA-math-认识Beta/Dirichlet分布

    http://cos.name/2013/01/lda-math-beta-dirichlet/#more-6953 2. 认识Beta/Dirichlet分布2.1 魔鬼的游戏—认识Beta 分布 ...

  3. 机器学习的数学基础(1)--Dirichlet分布

    机器学习的数学基础(1)--Dirichlet分布 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础知识:conjugate priors共轭先验 共轭先验是 ...

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

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

  5. (转)机器学习的数学基础(1)--Dirichlet分布

    转http://blog.csdn.net/jwh_bupt/article/details/8841644 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础 ...

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

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

  7. Beta分布和Dirichlet分布

    在<Gamma函数是如何被发现的?>里证明了\begin{align*} B(m, n) = \int_0^1 x^{m-1} (1-x)^{n-1} \text{d} x = \frac ...

  8. mahout系列----Dirichlet 分布

    Dirichlet分布可以看做是分布之上的分布.如何理解这句话,我们可以先举个例子:假设我们有一个骰子,其有六面,分别为{1,2,3,4,5,6}.现在我们做了10000次投掷的实验,得到的实验结果是 ...

  9. Dirichlet分布深入理解

    Dirichlet分布 我们把Beta分布推广到高维的场景,就是Dirichlet分布.Dirichlet分布定义如下 Dirichlet分布与多项式分布共轭.多项式分布定义如下 共轭关系表示如下 D ...

  10. LDA学习之beta分布和Dirichlet分布

    ---恢复内容开始--- 今天学习LDA主题模型,看到Beta分布和Dirichlet分布一脸的茫然,这俩玩意怎么来的,再网上查阅了很多资料,当做读书笔记记下来: 先来几个名词: 共轭先验: 在贝叶斯 ...

随机推荐

  1. git 如何在本地批量删除匹配名称分支

    背景 有时间创建了一大堆的dev/*分支,远程合并完就删除了,但本地还留下一大堆,自己又忘记删除了.一个个删除太麻烦.后面发现居然有批量删除的方法 备注:这里是window下powershell的命令 ...

  2. keycloak~关于社区登录的过程说明

    keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程: 打开社区认证页面,输入账号密码或者扫码,完成社区上的认证 由社区进行302重定向,回到keycloak页面 keycl ...

  3. Linux命令lsscsi详解

    @ 目录 一.什么是scsi 二.常见硬盘接口 1. IDE接口的硬盘 2. SCSI接口硬盘 3. SATA接口类型 三. lsscsi命令 1. lsscsi 命令安装 2. lsscsi命令英文 ...

  4. XeLaTeX 无法编译含有经过 pdfcrop 裁剪的 PDF 文件的文档

    今天在写 LaTeX 文档时踩了个大坑,我在文档里插入了一个 PDF 图片之后文档无法编译了. 于是我去掉多余代码,做了一个最小工作示例: \documentclass{article} \usepa ...

  5. csdn 下载券恶心之处

    今天在csdn碰到一个恶心事,啥事呢?下载券.详细的说,就是人家码友把下载积分都设置成0了,让大家自行下载.结果,却不行,非得搞个下载券,得去做任务,给它的广告爹爹们点点任务才能获取下载券的code. ...

  6. Centos7.6下安装Docker环境

    1.首先查看服务器系统内核,docker环境要求的内核必须在3.10或以上 执行:uname -r 版本为3.10,可安装docker 2.切到root用户下,更新yum源,使yum源为最新状态 执行 ...

  7. uniapp中,getApp()返回的实例到底是什么?为什么getApp()返回的实例无法访问vuex的$store

    按uniapp官方手册中说,getApp()函数用于获取当前应用实例.当前应用,也就是说当前应用程序.因为getApp()返回的实例可以用于访问app.vue中的globaldata,因此这个当前应用 ...

  8. 云存储抽象层-FluentStorage

    FluentStorage 是一个.NET云存储抽象层,支持多种云服务提供商.它提供了一个统一的API来处理不同云服务提供商的Blob存储(如AWS S3, GCP, FTP, SFTP, Azure ...

  9. 【图文教程】Centos 7下安装Hadoop

    环境说明: 系统:Centos7 在VM中安装的 hadoop版本:2.7.7 JDK:1.8 注意:Hadoop需要Java环境的.记得安装Java环境 PS:Centos JDK安装  mkdir ...

  10. Gson toJson 忽略 long 为 0的数据

    起因于数据id过大,所以将对应int , Integer都修改为long, 测试过程中发现 Gson toJson时,字段将int为0的数据忽略,但long 没有, 所以 1. 新增适配器 impor ...