1 个不稳定版本
0.0.2 | 2021年6月20日 |
---|---|
0.0.1 |
|
#1792 in 数学
44KB
690 行
r-gen
r-gen 是 Rust 编程语言的一个概率编程框架。它主要基于 Julia 编程语言的 Gen 库。
使用重要性采样估计潜在变量的示例。
...
fn main() {
//Define our generative model.
#[r_gen]
fn my_model(():()){
let p = sample!(format!("p"), Distribution::Beta(1.0, 1.0));
sample!(format!("num_heads"), Distribution::Binomial(100, p.into()));
}
//Run the model once in the forward direction and record the observations.
let (t, _) : (Trace, _)= simulate(&mut my_model, ());
let choices = Choicemap::from(vec![("num_heads", t.choices["num_heads"])]);
//Perform importance resampling to get an estimate for the value of p.
let mut traces = Vec::new();
for _ in 0..1000 {
let (gt, _) : (Trace, _)= generate(&mut my_model, (), &choices);
traces.push(gt);
}
println!("Actual value for p:\t {}", t.choices["p"]);
println!("Generated value for p:\t {}", Trace::sample_weighted_traces(&traces).unwrap().choices["p"]);
}
输出
Actual value for p: 0.8011431168181488
Generated value for p: 0.7879998086169554
注意生成函数上的 #[r_gen]
标签。为了使用 simulate
和 generate
,这个标签必须出现在你的任何一个生成函数上。生成函数的另一个要求是它必须有一个参数。这个参数可以是一个元组,也可以是空的 ()
如果不需要传递任何参数。为了进行随机选择(从分布中进行抽样),你必须使用 sample!()
宏。其语法如下
sample!(identifier, Distribution);
这个从给定的 Distribution
中抽取样本并将结果存储在 identifier
中。 Distribution
定义为
pub enum Distribution {
Bernoulli(f64), //p
Binomial(i64, f64), //n, p
Normal(f64, f64), //mu, sigma
Gamma(f64, f64), //alpha, beta
Beta(f64, f64), //alpha, beta
LogNormal(f64, f64), //mu, sigma
Categorical(Vec<f64>), //p
Dirichlet(Vec<f64>), //alpha
}
Value
定义为
pub enum Value {
Boolean(bool),
Integer(i64),
Real(f64),
Vector(Vec<Value>)
}
枚举的变体取决于正在抽样的分布。
此框架处于开发初期。一切均可能更改。
依赖项
~5.5MB
~102K SLoC