1 个不稳定版本
0.0.1 | 2020年5月31日 |
---|
#55 in #概率
570KB
16K SLoC
关于
这是一个正在开发中的 crate,将提供构建概率模型和推理算法的可组合抽象。短期内将实现两个参考算法:期望最大化(用于通用后验模式寻找)的 optim::ExpectMax
和 Metropolis-Hastings 后验采样器的 sim::Metropolis
。还将提供共轭对的自适应估计(请参阅 distr::Normal
、distr::Poisson
和 distr::Binomial
结构的示例)。
大部分功能正在使用来自 nalgebra crate 的线性代数抽象实现。某些优化、采样和基扩展算法通过 GNU GSL(必需的系统依赖)和 Intel MKL(可选的系统依赖;通过切换 cargo 功能 features=["mkl"]
)提供。
用法
模型构建
概率模型的基本构件是位于 distr
模块下的 Distribution
实现者
-
distr::Bernoulli
用于一元二进制结果; -
distr::Beta
用于二元先验; -
distr::Poisson
用于一元计数结果; -
distr::Gamma
用于通用逆尺度先验; -
distr::Normal
用于一元连续结果和位置先验; -
distr::MultiNormal
用于多元连续结果、位置先验和随机自然参数; -
distr::NormalMixture
用于一元或多元连续结果,通过离散因子边缘化; -
distr::Wishart
用于多元结构化逆尺度先验; -
distr::Categorical
用于多元相互排斥的离散结果; -
distr::Dirichlet
用于分类先验。 -
distr::VonMises
用于圆连续结果和方向先验。
实例化单个分布对象仅允许从其当前设置的参数向量中进行抽样和计算摘要统计量。您可以通过将任何 Distribution
实现者条件化到另一个有效的目标分布来构建更复杂的概率模型。
let b = Bernoulli::new(100, None).condition(Beta::new(1,1));
这种条件操作是为 Conditional<Factor>
的实现者定义的。此特质被实现为:
-
所有共轭对:(Beta-伯努利;正态-正态等);
-
条件在随机自然参数因子上的分布(经典广义线性模型:泊松-多正态;伯努利-多正态;分类-多正态);
-
在尺度因子上条件独立的分布(正态;多正态;VonMisses);
-
混合及其离散分类因子。
只要相邻元素有有效的 Conditional<Factor>
实现,原则上可以构建深度概率图;尽管它们在给定问题中的可用性取决于推理算法的实现。
条件操作拥有条件因子,可以通过以下方式恢复:
let factor : Option<Beta> = b.take_factor();
# or
let factor : Option<&Beta> = b.view_factor();
要恢复具有多个级别的概率图中的因子,您还可以使用
let factor : Option<&Beta> = b.find_factor();
它将搜索图并返回第一个匹配项。图迭代是从唯一的顶层元素到所有其根;然后从左到右。位置或方向因子在左侧;条件独立尺度因子在右侧。
自适应共轭推理
某些推理算法(通常满足共轭结构)可以通过便宜参数更新进行顺序更新
let y = DMatrix::from_column_slice(3, 1, &[0., 1., 0.]);
let bern = Bernoulli::new(3, None).condition(Beta::new(1,1));
let posterior : Option<&Beta> = b.fit(&y);
通用推理(计划中)
推理算法由任何 Estimator<Target>
实现者确定(这些需要 fit(sample)->Result<Distribution,Err>
实现)。所有共轭对都实现了此特质;但任何在构建时接受概率模型并维护其作为内部状态的架构也可以实现此特质。返回的分布将是接收到的概率模型的修改版本:优化器可以将图保留在最大化对数概率的状态;抽样器可以构建后验的不可参数表示,其边缘由相应的图节点持有。
决策(计划中)
任何两个分布实现者可以比较它们的相对对数概率,这对于以某种方式修改的两个替代模型的选取目标是有用的(例如,检查推理过程对先验指定的鲁棒性;或进行变量选择)。decision::BayesFactor
泛型结构以完全与模型规范无关的方式解决了这个问题。
如果推理的最终目标是二元决策,则可以通过优化目标、已知二元结果向量来找到最大化某些条件或边缘错误标准的对数概率差。decision::DecisionBoundray
泛型结构解决了这个问题。
基函数展开(计划中)
一些非线性过程(时间序列;图像)只能通过某种基扩展来有用地建模。该工具包封装了那些算法的一些标准实现(目前为FFT和小波),这些算法与nalgebra::DMatrix
和nalgebra::DVector
结构一起使用,以方便起见。
序列化和图形表示(计划中)
概率模型(先验和样本后验)将接受JSON表示,这是使用高级API(例如命令行)调整、拟合和比较单独模型的一种方便方式,而无需更改源代码。此外,模型还将有一个图形表示(.png/.svg),由petgraph
工具包(通过graphviz
)提供。
开发状态
基本抽象已经到位,并且一些用于采样和计算对数概率的实现已经工作,但该工具包仍不可用。该工具包的短期目标包括
-
基本抽象(分布;估计算法特质)
-
GSL/MKL绑定
-
共轭对自适应估计器实现
-
决策边界实现
-
ExpectMax实现
-
Metropolis实现
-
从JSON解析概率模型
-
概率模型的图形表示
系统要求
libgsl
(GNU科学库)
libmkl
(Intel数学内核库;可选,通过features=["mkl"]
)
许可协议
此工具包受LGPL v3.0许可协议的约束。
依赖关系
~7.5MB
~137K SLoC