5个版本

0.1.4 2021年3月25日
0.1.3 2021年3月21日
0.1.2 2021年2月28日
0.1.1 2021年2月26日
0.1.0 2021年2月21日

算法类别中排名第2032

MIT许可

18KB
172

porco

docs.rs

可组合概率分布。

示例

创建简单的概率分布。

enum Coin {
    Heads,
    Tails,
}
 
impl Coin {
    fn flip() -> Distribution<Coin> {
        Distribution::uniform([Coin::Heads, Coin::Tails])
    }
}
 
let coin = Coin::flip();
assert_eq!(coin.pmf(&Coin::Heads), Probability(0.5));

使用组合子操作分布。

fn reflip_if_tails(coin: Coin) -> Distribution<Coin> {
    match coin {
        Coin::Heads => Distribution::always(Coin::Heads),
        Coin::Tails => Coin::flip(),
    }
}
 
let coin = Coin::flip().and_then(reflip_if_tails);
assert_eq!(coin.pmf(&Coin::Heads), Probability(0.75));

计算随机变量的汇总统计。

let die = Distribution::uniform([1, 2, 3, 4, 5, 6]);
let ev = die.given(|&v| v <= 4).expectation();
assert_eq!(ev, 2.5);

lib.rs:

Porco是一个用于处理和组合概率分布的库。

API灵感来自Haskell中的概率函数式编程,但命名约定与OptionResult(例如Option::and_then)相匹配。

enum Coin {
    Heads,
    Tails,
}

impl Coin {
    fn flip() -> Distribution<Coin> {
        Distribution::uniform(vec![Coin::Heads, Coin::Tails])
    }
}

let coin = Coin::flip();
assert_eq!(coin.pmf(&Coin::Heads), Probability(0.5));

您可以使用组合子如Distribution::mapDistribution::and_thenDistribution::givenDistribution上组合各种操作。

fn reflip_if_tails(coin: Coin) -> Distribution<Coin> {
    match coin {
        Coin::Heads => Distribution::always(Coin::Heads),
        Coin::Tails => Coin::flip(),
    }
}

let coin = Coin::flip().and_then(reflip_if_tails);
assert_eq!(coin.pmf(&Coin::Heads), Probability(0.75));

您还可以操作随机变量并计算汇总统计。

let die = Distribution::uniform(vec![1, 2, 3, 4, 5, 6]);
let ev = die.given(|&v| v <= 4).expectation();
assert_eq!(ev, 2.5);

fn two_sided_die() -> Distribution<u8> {
    Distribution::uniform(vec![1, 2])
}

let x = two_sided_die();
let y = two_sided_die();
let sum = x.convolve(y);
assert_eq!(sum.pmf(&2), Probability(0.25));
assert_eq!(sum.pmf(&3), Probability(0.5));

依赖关系

~450KB