51 个版本
0.17.0 | 2024 年 6 月 24 日 |
---|---|
0.16.5 | 2024 年 3 月 14 日 |
0.16.4 | 2024 年 1 月 31 日 |
0.16.1 |
|
0.3.0 | 2018 年 7 月 31 日 |
#7 in 机器学习
44,162 每月下载量
在 12 个 crate(4 个直接) 中使用
1MB
26K SLoC
rv
Rust 中的随机变量(RV)。
rv
提供了许多概率分布的基本功能。例如,如果我们想要进行伯努利试验的对偶分析
use rv::prelude::*;
// Prior over the unknown coin weight. Assume all weights are equally
// likely.
let prior = Beta::uniform();
// observations generated by a fair coin
let obs_fair: Vec<u8> = vec![0, 1, 0, 1, 1, 0, 1];
// observations generated by a coin rigged to always show heads. Note that
// we're using `bool`s here. Bernoulli supports multiple types.
let obs_fixed: Vec<bool> = vec![true; 6];
let data_fair: BernoulliData<_> = DataOrSuffStat::Data(&obs_fair);
let data_fixed: BernoulliData<_> = DataOrSuffStat::Data(&obs_fixed);
// Let's compute the posterior predictive probability (pp) of a heads given
// the observations from each coin.
let postpred_fair = prior.pp(&1u8, &data_fair);
let postpred_fixed = prior.pp(&true, &data_fixed);
// The probability of heads should be greater under the all heads data
assert!(postpred_fixed > postpred_fair);
// We can also get the posteriors
let post_fair: Beta = prior.posterior(&data_fair);
let post_fixed: Beta = prior.posterior(&data_fixed);
// And compare their means
let post_mean_fair: f64 = post_fair.mean().unwrap();
let post_mean_fixed: f64 = post_fixed.mean().unwrap();
assert!(post_mean_fixed > post_mean_fair);
特性标志
设计
随机变量被设计得非常灵活。例如,我们不仅仅想要一个与 Beta
分布一起工作的 f64
;我们想要它与许多事物一起工作,例如
use rv::prelude::*;
// Beta(0.5, 0.5)
let beta = Beta::jeffreys();
let mut rng = rand::thread_rng();
// 100 f64 weights in (0, 1)
let f64s: Vec<f64> = beta.sample(100, &mut rng);
let pdf_x = beta.ln_pdf(&f64s[42]);
// 100 f32 weights in (0, 1)
let f32s: Vec<f32> = beta.sample(100, &mut rng);
let pdf_y = beta.ln_pdf(&f32s[42]);
// 100 Bernoulli distributions -- Beta is a prior on the weight
let berns: Vec<Bernoulli> = beta.sample(100, &mut rng);
let pdf_bern = beta.ln_pdf(&berns[42]);
有关更多有趣的示例,包括机器学习中的应用,请参阅 examples/
。
贡献
Bjork 对我创造事物的过程产生了很大的影响。她曾在一次采访中说
当我做 "Debut" 时,我想,'好吧,我已经让足够多的人满意了,我要变得非常自私。' 我从来没有像在 "Debut" 中那样卖出那么多唱片。所以,我不知道,似乎我越自私,就越慷慨。我不会假装我知道公式。我只能取悦自己。
因此,我们使用 rv 的目标是取悦自己。我们将其用于我们的工具,我们将其设计为我们想要的样子。如果我们发现 rv 对您有用,我们将考虑变更想法——如果喜欢的话,我们会接受它们——但最终,rv 是为我们自己而设计的。
如果您想做出贡献
- 请在开始任何工作之前创建一个问题。我们还没有达到稳定,所以我们可能实际上正在做您想要的事情,或者我们可能正在做一些可能会改变您实现方式的事情。
- 如果您计划实施新的分发,至少实现
Rv
、Support
,以及ContinuousDistr
或DiscreteDistr
之一。当然,越多越好! - 为适当的类型实现新的分布。例如,不仅仅是实现
Rv<f64>
,也实现Rv<f32>
。查看其他分布,看看如何使用宏轻松实现。 - 编写测试、文档和文档测试。
- 使用
rustfmt
。我们在项目目录中包含了一个.rustfmt.toml
。
依赖关系
~3–4.5MB
~82K SLoC