C++ 迪利克雷(Dirichlet)分布
遇到一个要使用 dirichlet 分布的情形,发现 C++ 标准库中没有现成的。查阅维基百科发现,虽然它挺复杂,但是它跟 Gamma 分布有如下关系:
设有 K 个相互独立且分别满足 Gamma 分布的分布:
\]
则有:
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)分布的更多相关文章
- HDU - 5628:Clarke and math (组合数&线性筛||迪利克雷卷积)
题意:略. 思路:网上是用卷积或者做的,不太会. 因为上一题莫比乌斯有个类似的部分,所以想到了每个素因子单独考虑. 我们用C(x^p)表示p次减少分布在K次减少里的方案数,由隔板法可知,C(x^p)= ...
- LDA-math-认识Beta/Dirichlet分布
http://cos.name/2013/01/lda-math-beta-dirichlet/#more-6953 2. 认识Beta/Dirichlet分布2.1 魔鬼的游戏—认识Beta 分布 ...
- 机器学习的数学基础(1)--Dirichlet分布
机器学习的数学基础(1)--Dirichlet分布 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础知识:conjugate priors共轭先验 共轭先验是 ...
- 伯努利分布、二项分布、Beta分布、多项分布和Dirichlet分布与他们之间的关系,以及在LDA中的应用
在看LDA的时候,遇到的数学公式分布有些多,因此在这里总结一下思路. 一.伯努利试验.伯努利过程与伯努利分布 先说一下什么是伯努利试验: 维基百科伯努利试验中: 伯努利试验(Bernoulli tri ...
- (转)机器学习的数学基础(1)--Dirichlet分布
转http://blog.csdn.net/jwh_bupt/article/details/8841644 这一系列(机器学习的数学基础)主要包括目前学习过程中回过头复习的基础数学知识的总结. 基础 ...
- 关于Beta分布、二项分布与Dirichlet分布、多项分布的关系
在机器学习领域中,概率模型是一个常用的利器.用它来对问题进行建模,有几点好处:1)当给定参数分布的假设空间后,可以通过很严格的数学推导,得到模型的似然分布,这样模型可以有很好的概率解释:2)可以利用现 ...
- Beta分布和Dirichlet分布
在<Gamma函数是如何被发现的?>里证明了\begin{align*} B(m, n) = \int_0^1 x^{m-1} (1-x)^{n-1} \text{d} x = \frac ...
- mahout系列----Dirichlet 分布
Dirichlet分布可以看做是分布之上的分布.如何理解这句话,我们可以先举个例子:假设我们有一个骰子,其有六面,分别为{1,2,3,4,5,6}.现在我们做了10000次投掷的实验,得到的实验结果是 ...
- Dirichlet分布深入理解
Dirichlet分布 我们把Beta分布推广到高维的场景,就是Dirichlet分布.Dirichlet分布定义如下 Dirichlet分布与多项式分布共轭.多项式分布定义如下 共轭关系表示如下 D ...
- LDA学习之beta分布和Dirichlet分布
---恢复内容开始--- 今天学习LDA主题模型,看到Beta分布和Dirichlet分布一脸的茫然,这俩玩意怎么来的,再网上查阅了很多资料,当做读书笔记记下来: 先来几个名词: 共轭先验: 在贝叶斯 ...
随机推荐
- vue(element)中代码高亮插件全面对比
@ 目录 全面对比 从活跃方面来看 从功能方面来看 深入对比 1,ace 2,codemirror 3,monaco 4,结论 全面对比 从活跃方面来看 从功能方面来看 代码高亮是必须的,社区必须活跃 ...
- centos7安装docker详细教程
一.准备工作 1.系统要求 docker要求centos的内核版本不低于3.10.centos7满足最低内核要求. 检查当前的内核版本 [root@zspc /]# uname -r 3.10.0-1 ...
- CF1697C
C. awoo's Favorite Problem 首先,检查两个字符串中所有字母的计数是否相同. 然后考虑下面的重述.字符串s中的字母 b是静止的.而字母a和c则在字符串中移动.第一种移动是将字母 ...
- Microsoft Ignite 2022 After Party (Placeholder)
通过Microsoft Ignite 2022了解最新的创新成果,向产品专家和合作伙伴学习,优化自身技能组合,并与来自世界各地的人士建立联系.请于 PDT 时间 10 月 12 日至 14 日早上 9 ...
- zabbix网络拓扑图介绍
"zabbix network map"可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常.网络是否有故障.应 ...
- Element Plus使用
目录 Element Plus快速入门 常用组件 Element:是饿了么团队研发的,基于 Vue 3,面向设计师和开发者的组件库. 组件:组成网页的部件,例如 超链接.按钮.图片.表格.表单.分页条 ...
- 【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
问题现象 BeetISQL中间件版本:2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的jav ...
- ROS 知识
安装 Ref: ROS安装过程中如何解决 rosdep update 命令出现错误 https://jiayaoo3o.github.io/2020/06/23/%E8%AE%B0%E5%BD%95% ...
- C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- Goby漏洞发布 | CVE-2024-4879 ServiceNowUI /login.do Jelly模板注入漏洞【已复现】
漏洞名称:ServiceNowUI /login.do Jelly模板注入漏洞(CVE-2024-4879) English Name:ServiceNowUI /login.do Input Val ...