1 个不稳定版本

0.0.2 2021年6月20日
0.0.1 2021年6月15日

#1792 in 数学

MIT 许可证

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] 标签。为了使用 simulategenerate,这个标签必须出现在你的任何一个生成函数上。生成函数的另一个要求是它必须有一个参数。这个参数可以是一个元组,也可以是空的 () 如果不需要传递任何参数。为了进行随机选择(从分布中进行抽样),你必须使用 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