Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

几何分布

#include <boost/math/distributions/geometric.hpp>
namespace boost{ namespace math{

template <class RealType = double,
          class Policy   = policies::policy<> >
class geometric_distribution;

typedef geometric_distribution<> geometric;

template <class RealType, class Policy>
class geometric_distribution
{
public:
   typedef RealType value_type;
   typedef Policy   policy_type;
   // Constructor from success_fraction:
   BOOST_MATH_GPU_ENABLED geometric_distribution(RealType p);

   // Parameter accessors:
   BOOST_MATH_GPU_ENABLED RealType success_fraction() const;
   BOOST_MATH_GPU_ENABLED RealType successes() const;

   // Bounds on success fraction:
   BOOST_MATH_GPU_ENABLED static RealType find_lower_bound_on_p(
      RealType trials,
      RealType successes,
      RealType probability); // alpha
   BOOST_MATH_GPU_ENABLED static RealType find_upper_bound_on_p(
      RealType trials,
      RealType successes,
      RealType probability); // alpha

   // Estimate min/max number of trials:
   BOOST_MATH_GPU_ENABLED static RealType find_minimum_number_of_trials(
      RealType k,     // Number of failures.
      RealType p,     // Success fraction.
      RealType probability); // Probability threshold alpha.
   BOOST_MATH_GPU_ENABLED static RealType find_maximum_number_of_trials(
      RealType k,     // Number of failures.
      RealType p,     // Success fraction.
      RealType probability); // Probability threshold alpha.
};

}} // namespaces

类类型 geometric_distribution 表示 几何分布:它用于当 伯努利试验 恰好有两个互斥的结果时:这些结果被标记为“成功”和“失败”。

对于 伯努利试验,每次试验的成功概率为 p,几何分布给出了在第一次成功之前观察到 k 次试验(失败、事件、发生或到达)的概率。

[Note] 注意

对于此实现,试验集合包括零(不同于另一个定义,其中试验集合从一开始,有时称为shifted)。

几何分布假设成功概率 p 对于所有 k 次试验都是固定的。

在第一次成功之前有 k 次失败的概率

Pr(Y=k) = (1-p)k p

例如,当投掷一个 6 面骰子时,成功概率 p = 1/6 = 0.1666 ̇。重复投掷直到出现 three不是三 的次数的概率分布是几何分布。

几何分布具有概率密度函数 PDF

(1-p)k p

下图说明了对于成功概率 p 的三个示例,PDF 和 CDF 如何变化(当将几何分布视为连续函数时),

以及离散的情况。

相关分布

几何分布是 负二项分布 的一个特例,其成功参数为 r = 1,因此只需要一个第一次也是唯一的成功:因此根据定义    geometric(p) == negative_binomial(1, p)

negative_binomial_distribution(RealType r, RealType success_fraction);
negative_binomial nb(1, success_fraction);
geometric g(success_fraction);
ASSERT(pdf(nb, 1) == pdf(g, 1));

此实现始终使用实数进行计算(因为它使用了实值幂函数和指数函数)。因此,要获得传统的严格离散几何分布,您必须确保为试验次数(随机变量)k 提供整数值,并从返回成功次数的函数中获取整数值(向下取整或向上取整函数)。

[Caution] 注意

几何分布是离散分布:在内部,像 cdfpdf 这样的函数被“视为”连续函数,但实际上,只有当为随机变量参数提供整数值时,从这些函数返回的结果才有意义。

分位数函数默认情况下将返回一个已向外舍入的整数结果。也就是说,较低的分位数(概率小于 0.5)向下舍入,而较高的分位数(概率大于 0.5)向上舍入。此行为确保如果请求 X% 分位数,则中心区域中将存在至少所需的覆盖率,并且尾部中将存在不超过所需的覆盖率。

可以更改此行为,以便分位数函数以不同的方式舍入,甚至可以使用 策略 返回实值结果。强烈建议您在使用几何分布的分位数函数之前阅读教程 理解离散分布的分位数参考文档 描述了如何更改这些分布的舍入策略。

成员函数
构造函数
geometric_distribution(RealType p);

构造函数:p 或 success_fraction 是单次试验成功的概率。

要求:0 <= p <= 1

访问器
RealType success_fraction() const; // successes / trials (0 <= p <= 1)

返回从中构造此分布的 success_fraction 参数 p

RealType successes() const; // required successes always one,
// included for compatibility with negative binomial distribution
// with successes r == 1.

返回 unity。

以下函数等效于为负二项式提供的函数,其中 successes = 1,但此处提供这些函数是为了完整性。

以下函数的最佳计算方法存在争议:有关更多讨论,请参见 二项分布负二项分布

成功概率参数 p 的下限
static RealType find_lower_bound_on_p(
  RealType failures,
  RealType probability) // (0 <= alpha <= 1), 0.05 equivalent to 95% confidence.

返回成功概率的下限

failures

第一次成功之前的总失败次数。

alpha

真实成功概率值 小于 返回值的最大可接受概率。

例如,如果您从 n 次试验中观察到 k 次失败,则成功概率的最佳估计值仅为 1/n,但是如果您想 95% 确定真实值大于某个值 pmin,则

pmin = geometric_distribution<RealType>::
   find_lower_bound_on_p(failures, 0.05);

请参阅负二项式置信区间示例。

此函数使用 Clopper-Pearson 方法计算成功概率的下限,虽然许多文本将此方法称为给出“精确”结果,但实际上它产生的区间保证至少所需的覆盖率,并且对于某些 failuressuccesses 的组合可能会产生悲观的估计。请参阅

Yong Cai 和 K. Krishnamoorthy,《一些离散分布的简单改进的推论方法》。计算统计和数据分析,2005 年,第 48 卷,第 3 期,605-621.

成功概率参数 p 的上限
static RealType find_upper_bound_on_p(
   RealType trials,
   RealType alpha); // (0 <= alpha <= 1), 0.05 equivalent to 95% confidence.

返回成功概率的上限

trials

进行的试验总次数。

alpha

真实成功概率值 大于 返回值的最大可接受概率。

例如,如果您从 n 次试验中观察到 k 次成功,则成功概率的最佳估计值仅为 k/n,但是如果您想 95% 确定真实值小于某个值 pmax,则

pmax = geometric_distribution<RealType>::find_upper_bound_on_p(
                    k, 0.05);

请参阅负二项式置信区间示例。

此函数使用 Clopper-Pearson 方法计算成功概率的下限,虽然许多文本将此方法称为给出“精确”结果,但实际上它产生的区间保证至少所需的覆盖率,并且对于某些 failuressuccesses 的组合可能会产生悲观的估计。请参阅

Yong Cai 和 K. Krishnamoorthy,《一些离散分布的简单改进的推论方法》。计算统计和数据分析,2005 年,第 48 卷,第 3 期,605-621.

估计确保至少一定数量失败的试验次数
static RealType find_minimum_number_of_trials(
   RealType k,     // number of failures.
   RealType p,     // success fraction.
   RealType alpha); // probability threshold (0.05 equivalent to 95%).

此函数估计达到一定概率所需的试验次数,该概率表示 将观察到超过 k 次失败

k

要观察的目标失败次数。

p

每次试验的 成功 概率。

alpha

仅观察到 k 次或更少失败的最大可接受 风险

例如

geometric_distribution<RealType>::find_minimum_number_of_trials(10, 0.5, 0.05);

返回我们必须进行的最小试验次数,以 95% (1-0.05) 的把握看到 10 次失败,这些失败以二分之一的频率发生。

工作示例。

此函数使用几何分布的数值反演来获得结果:结果的另一种解释是,它找到将导致观察到 k 次或更少失败的 alpha 概率的试验(失败)次数。

估计确保最多一定数量失败或更少的试验次数
static RealType find_maximum_number_of_trials(
   RealType k,     // number of failures.
   RealType p,     // success fraction.
   RealType alpha); // probability threshold (0.05 equivalent to 95%).

此函数估计我们可以进行的最大试验次数,并达到一定概率,该概率表示 将观察到 k 次或更少失败

k

要观察的最大失败次数。

p

每次试验的 成功 概率。

alpha

观察到超过 k 次失败的最大可接受 风险

例如

geometric_distribution<RealType>::find_maximum_number_of_trials(0, 1.0-1.0/1000000, 0.05);

返回我们可以进行的最大试验次数,并且仍然有 95% 的把握看到没有失败,这些失败以百万分之一的频率发生。

此函数使用几何分布的数值反演来获得结果:结果的另一种解释是,它找到将导致观察到超过 k 次失败的 alpha 概率的试验次数。

非成员访问器

支持所有分布通用的常用非成员访问器函数累积分布函数概率密度函数分位数风险函数累积风险函数、__logcdf、__logpdf、均值中位数众数方差标准差偏度峰度超额峰度范围支持。对于此分布,所有非成员访问器函数都标记有 BOOST_MATH_GPU_ENABLED,并且可以在主机和设备上运行。

但是,值得花一些时间来定义这些在当前分布的上下文中实际意味着什么

表 5.2. 非成员访问器的含义。

函数

含义

概率密度函数

从成功概率为 p 的 k 次试验中获得 恰好 k 次失败 的概率。例如

pdf(geometric(p), k)

累积分布函数

从成功概率为 p 的 k 次试验中获得 k 次或更少失败 并在最后一次试验中成功的概率。例如

cdf(geometric(p), k)

累积分布函数的补函数

从成功概率为 p 的 k 次试验中获得 超过 k 次失败 并在最后一次试验中成功的概率。例如

cdf(complement(geometric(p), k))

分位数

在概率 P 下,预期从成功概率为 pk 次试验中观察到的 最大 失败次数 k。请注意,返回的值是实数,而不是整数。根据用例,您可能需要取实数结果的向下取整或向上取整。例如

quantile(geometric(p), P)

来自概率补函数的分位数

在概率 P 下,预期从成功概率为 pk 次试验中观察到的 最小 失败次数 k。请注意,返回的值是实数,而不是整数。根据用例,您可能需要取实数结果的向下取整或向上取整。例如

quantile(complement(geometric(p), P))

在此分布中,logcdf 的实现经过专门设计,以提高数值精度。

精度

此分布是使用 pow 和 exp 函数实现的,因此大多数结果在 RealType 的几个 epsilon 内都是准确的。对于 double p 的极端值(例如 0.9999999999),精度可能会显着下降,例如降至 10 位十进制数字(从 16 位)。

实现

在下表中,p 是任何一次试验成功的概率(成功概率),k 是失败次数,p 是概率,q = 1-px 是给定的概率,用于使用分位数估计预期失败次数。

函数

实现说明

pdf

pdf = p * pow(q, k)

cdf

cdf = 1 - qk=1

logcdf

log(cdf) = log1p(-exp(log1p(-p) * (k+1)))

cdf 补函数

exp(log1p(-p) * (k+1))

分位数

k = log1p(-x) / log1p(-p) -1

来自补函数的分位数

k = log(x) / log1p(-p) -1

均值

(1-p)/p

方差

(1-p)/p²

众数

0

偏度

(2-p)/√q

峰度

9+p²/q

超额峰度

6 +p²/q

参数估计成员函数

请参阅 负二项分布

find_lower_bound_on_p

请参阅 负二项分布

find_upper_bound_on_p

请参阅 负二项分布

find_minimum_number_of_trials

请参阅 负二项分布

find_maximum_number_of_trials

请参阅 负二项分布


PrevUpHomeNext