遇到一个要使用 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. Analysis of Set Union Algorithms 题解

    题意简述 有一个集合,初始为空,你需要写一个数据结构,支持: 0 x 表示将 \(x\) 加入该集合,其中 \(x\) 为一由 \(\texttt{0} \sim \texttt{9}\) 组成的数字 ...

  2. 下一代浏览器和移动自动化测试框架:WebdriverIO

    1.介绍 今天给大家推荐一款基于Node.js编写且号称下一代浏览器和移动自动化测试框架:WebdriverIO 简单来讲:WebdriverIO 是一个开源的自动化测试框架,它允许测试人员使用 No ...

  3. RabbitMq消息可靠性之确认模式 通俗易懂 超详细 【内含案例】

    RabbitMq保证消息可靠性之确认模式 介绍 消息的确认,是指生产者投递消息后,如果 Broker 收到消息,则会给我们生产者一个应答.生产者进行接收应答,用来确定这条消息是否正常的发送到 Brok ...

  4. C语言之父和Linux之父谁更伟大?

    前言 在计算机软件领域,做出过重大贡献的神人很多,比如:<计算机程序设计艺术>(The Art of Computer Programming)一书的作者- Donald Knuth:Pa ...

  5. 通过 ob-operator 部署 OceanBase 数据库

    本文介绍如何通过 ob-operator 来部署 OceanBase 数据库. 背景信息 ob-operator 与其他 operator 一样,旨在让 OceanBase 以容器的方式,无缝运行在 ...

  6. .net相关知识点总结

    基础知识 [1]静态构造函数(执行一次,调用静态成员或实例化时执行一次) [2]抽象类和接口的区别 1:抽象类有字段,构造函数,非抽象方法(C#新版本接口可以定义方法体),接口没有 2:抽象类不可多继 ...

  7. 基于gitee+hexo搭建个人博客

    gitee准备 注册好gitee git安装与配置 下载git默认安装,配置 在之前下载的目录下,右键,选择[Git Bash Here] 配置用户 git config --global user. ...

  8. 【经验】通过JVM调优,让凯哥个人博客响应速度提升了不少

    为什么你的个人博客访问慢? 不知道大家有没有注意到,在22.10.31 21点之后,凯哥的个人博客站点(凯哥Java:www.kaigejava.com)访问速度提升了不少.那是因为凯哥对站点做了优化 ...

  9. Unrecognized SSL message, plaintext connection?

    报错:Unrecognized SSL message, plaintext connection? 修改:把 requestContext.setScheme(Scheme.HTTPS);修改为 r ...

  10. (Ljava/lang/String;)Ljava/util/List;

    背景:原正常代码,更改类名后,重新运行 报错:(Ljava/lang/String;)Ljava/util/List; 解决:mvn clean 后 compile,再运行,正常