51 个版本

0.17.0 2024 年 6 月 24 日
0.16.5 2024 年 3 月 14 日
0.16.4 2024 年 1 月 31 日
0.16.1 2023 年 12 月 14 日
0.3.0 2018 年 7 月 31 日

#7 in 机器学习

Download history 8204/week @ 2024-05-03 10528/week @ 2024-05-10 6366/week @ 2024-05-17 7248/week @ 2024-05-24 12784/week @ 2024-05-31 15323/week @ 2024-06-07 6662/week @ 2024-06-14 9666/week @ 2024-06-21 11148/week @ 2024-06-28 12419/week @ 2024-07-05 9011/week @ 2024-07-12 7780/week @ 2024-07-19 7914/week @ 2024-07-26 10031/week @ 2024-08-02 9622/week @ 2024-08-09 14217/week @ 2024-08-16

44,162 每月下载量
12 个 crate(4 个直接) 中使用

MIT 许可证

1MB
26K SLoC

rv

Rust 中的随机变量(RV)。

docs.rs Crates.io License Crates.io MSRV GitHub Actions Workflow Status Codecov

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);

特性标志

  • serde1:通过 serde 启用结构体的序列化和反序列化
  • process:为您提供访问高斯过程的方法。
  • arraydist:启用需要 nalgebra crate 的分布和统计测试。

设计

随机变量被设计得非常灵活。例如,我们不仅仅想要一个与 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 是为我们自己而设计的。

如果您想做出贡献

  1. 请在开始任何工作之前创建一个问题。我们还没有达到稳定,所以我们可能实际上正在做您想要的事情,或者我们可能正在做一些可能会改变您实现方式的事情。
  2. 如果您计划实施新的分发,至少实现 RvSupport,以及 ContinuousDistrDiscreteDistr 之一。当然,越多越好!
  3. 为适当的类型实现新的分布。例如,不仅仅是实现 Rv<f64>,也实现 Rv<f32>。查看其他分布,看看如何使用宏轻松实现。
  4. 编写测试、文档和文档测试。
  5. 使用 rustfmt。我们在项目目录中包含了一个 .rustfmt.toml

依赖关系

~3–4.5MB
~82K SLoC