gburtini/distributions

PHP 实现了多种统计概率分布:正态分布、beta 分布、gamma 分布等。

0.0.2 2018-04-08 05:56 UTC

README

Build Status

PHP 中用于处理统计分布的用户空间实现。

兼容性: PHP 5.4 及以上版本。已在 5.47.1 以及 nightly 版本上进行测试和支持。目前我们不支持 hhvm

安装

此包在 Packagist/Composer 中可用,名称为 gburtini/distributions。对于非 composer 用户,请克隆仓库并直接要求文件。

支持的分布

此处给出的名称是类的名称。

所有支持的分布都在命名空间 gburtini\Distributions 中,并实现了以下接口。实现新的分布就像扩展 gburtini\Distributions\Distribution 或现有的实现一样简单。

接口

  • 构造函数 - 接收分布的参数并返回一个实例。
  • public function pdf($x) - 在给定的 离散 点返回密度或质量。
  • public function pmf($x) - pdf 的别名。
  • public function cdf($x) - 返回从 -∞ 到 $x 的累积密度。
  • public function icdf($y) - 逆 CDF 函数,对于给定的密度,返回一个点。
  • public function quantile($y) - icdf 的别名。
  • public function rand() - 从此分布中抽取样本。
  • public function rands($n) - 从此分布中抽取长度为 $n 的样本。
  • public static function draw(...) - 从给定参数的分布中抽取样本,是 rand 的静态替代。

命名空间

gburtini\Distributions 包含上述指示的分布类。 gburtini\Distributions\Accessories 包含 BetaFunction 和 GammaFunction,两个包含计算完整、不完整和逆 beta 和 gamma 函数的辅助函数的类。

示例

在大多数实现文件的顶部提供了一个注释示例。通常,您应该能够使用“支持的分布”部分中列出的参数化来创建实现“接口”中方法的类。

use gburtini\Distributions\Beta;
$beta = new Beta(1, 100);
$draw = $beta->rand();
if($draw > 0.5) {
  echo "We drew a number bigger than 0.5 from a Beta(1,100).\n";
}

// $beta->pdf($x) = [0,1]
// $beta->cdf($x) = [0,1] non-decreasing
// $beta::quantile($y in [0,1]) = [0,1] (aliased Beta::icdf)
// $beta->rand() = [0,1]

// for BetaICDF there is optional paramerer maxIterations = 100, to change default value type
// $beta->icdf($x, ["maxIterations" => 30])

替代方案

PECL中有一个名为stats的统计函数包,我从未能够使其正常工作,自2006年以来一直很安静。网上、StackOverflow等地方有大量的针对个别分布的代码,但据我所知,效果好坏不一。在尽可能的范围内,我很乐意(但尚未)封装stats_函数(如果function_exists存在),如果这些函数的功能与该包不兼容。

未来工作

  • 首先,实现所有分布的接口!
  • 添加均值、中位数、众数、方差计算器。
  • 实现更多的单变量分布。例如,以下任何一种:柯西分布、卡方分布、指数分布、F分布、几何分布、超几何分布、拉普拉斯分布、对数正态分布、麦克斯韦-玻尔兹曼分布、帕累托分布、拉马克分布、瑞利分布、均匀分布、沃克比分布、齐夫分布、齐夫-曼德尔布罗特分布。通过John D. Cook网站上的酷炫的关系图,可以更容易地产生更多分布。
  • 实现多变量分布的支持,特别是多元正态分布,但也包括多项式分布等。
  • 在适当的地方推广分布的实现,例如,采用椭圆分布方法实现正态分布,或者伯努利分布的分类实现。
  • 设计一个良好的接口用于替代参数化(例如,精度表示的正态分布,模式和中位数表示的贝塔分布,以及形状和速率表示的伽玛分布)。
  • 辅助概率相关任务的工具包,如矩法拟合。
  • 在分布中有意义且可操作的领域添加矩生成函数和特征函数。通过干净的用户界面推广期望和方差等概念。

Pull Requests

我很乐意合并任何新的分布(理想情况下带有测试,但我甚至愿意编写测试),对我代码的改进等。请提交Pull Request或给我发电子邮件。

贡献

分叉仓库,克隆到您的计算机上并安装依赖项

composer install

运行测试

./vendor/bin/phpunit

许可证

MIT授权。如果您的情况不适用,请联系我。