gburtini / distributions
PHP 实现了多种统计概率分布:正态分布、beta 分布、gamma 分布等。
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is auto-updated.
Last update: 2024-09-18 00:26:18 UTC
README
PHP 中用于处理统计分布的用户空间实现。
兼容性: PHP 5.4 及以上版本。已在 5.4
至 7.1
以及 nightly
版本上进行测试和支持。目前我们不支持 hhvm
。
安装
此包在 Packagist/Composer 中可用,名称为 gburtini/distributions
。对于非 composer 用户,请克隆仓库并直接要求文件。
支持的分布
此处给出的名称是类的名称。
- 正态分布(位置 μ ∈ R,平方尺度 σ2 > 0)
- 二项分布(试验次数,每次试验成功的概率在 [0,1] 范围内)
- 伯努利分布(分数在 [0,1] 范围内)
- beta 分布(形状 α > 0,形状 β > 0)
- gamma 分布(形状 α > 0,率 β > 0)
- t 分布(自由度 v > 0)
- Dirichlet 分布(浓度参数数组 α > 0)
- 泊松分布(均值 λ > 0)
- Weibull 分布(形状 k > 0,尺度 lambda > 0)
所有支持的分布都在命名空间 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授权。如果您的情况不适用,请联系我。