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
18KB
172 行
porco
可组合概率分布。
示例
创建简单的概率分布。
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中的概率函数式编程,但命名约定与Option
和Result
(例如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::map
、Distribution::and_then
和Distribution::given
在Distribution
上组合各种操作。
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