Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Discrete Quantile Policies

Boost , Math Toolkit 2.5.0 , Policy Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Если статистическое распределение являетсядискретным, то случайная величина может иметь только целые значения — это оставляет нам проблему при вычислении квантилей — мы можем либо игнорировать дискретность распределения и возвращать реальное значение, либо округляться до целого числа. Как это происходит, вычисление целых значений может быть значительно быстрее, чем вычисление реального значения, поэтому есть определенные преимущества для возврата целого числа, но затем нам нужно решить, как лучше округлять результат. Политика<discrete_quantile>определяет, как работают дискретные квантили и как округляются целые результаты:

enum discrete_quantile_policy_type
{
   real,
   integer_round_outwards, // default
   integer_round_inwards,
   integer_round_down,
   integer_round_up,
   integer_round_nearest
};
template <discrete_quantile_policy_type>
struct discrete_quantile;

Значения<discrete_quantile>могут иметь следующие значения:

real

Игнорирует дискретность распределения и возвращает реальный результат. Например:

#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
      double,
      policy<discrete_quantile<real> >
   > dist_type;
// Lower 5% quantile:
double x = quantile(dist_type(20, 0.3), 0.05);
// Upper 95% quantile:
double y = quantile(complement(dist_type(20, 0.3), 0.05));

Результаты в<x= 27.3898>и<y =68.1584>.

integer_round_outwards

Это политика по умолчанию: целочисленное значение возвращается так, что:

  • Нижние квантили (где вероятность меньше 0,5) округлены вниз.
  • Верхние квантили (где вероятность больше 0,5) округляются.

Это, как правило, самая безопасная политика округления, поскольку она гарантирует, что как один, так и два боковых интервала гарантированно будут иметьпо крайней мерезапрашиваемое покрытие. Например:

#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial;
// Use the default rounding policy integer_round_outwards.
// Lower quantile rounded down:
double x = quantile(negative_binomial(20, 0.3), 0.05); // rounded up 27 from 27.3898
// Upper quantile rounded up:
double y = quantile(complement(negative_binomial(20, 0.3), 0.05)); // rounded down to 69 from 68.1584

Результаты в<x= 27>(округлено от 27.3898) и<y= 69>(округлено от 68.1584).

Переменные x и y теперь определены так, что:

cdf(negative_binomial(20), x) <= 0.05
cdf(negative_binomial(20), y) >= 0.95

Другими словами, мы гарантируемпо меньшей мере 90% покрытия в центральном регионе в целом, а такжене более 5% покрытия в каждом хвосте.

integer_round_inwards

Это противоположноinteger_round_outwards: Целое значение возвращается так, что:

  • Нижние квантили (где вероятность меньше 0,5) округленывверх.
  • Верхние квантили (где вероятность больше 0,5) округленывниз.

Например:

#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
      double,
      policy<discrete_quantile<integer_round_inwards> >
   > dist_type;
// Lower quantile rounded up:
double x = quantile(dist_type(20, 0.3), 0.05); // 28 rounded up from 27.3898
// Upper quantile rounded down:
double y = quantile(complement(dist_type(20, 0.3), 0.05)); // 68 rounded down from 68.1584

Результаты в<x= 28>(округлено от 27.3898) и<y=68>(округлено от 68.1584).

Переменные x и y теперь определены так, что:

cdf(negative_binomial(20), x) >= 0.05
cdf(negative_binomial(20), y) <= 0.95

Другими словами, мы гарантируемне более 90% покрытия в центральном регионе в целом, а такжепо крайней мере 5% покрытия в каждом хвосте.

integer_round_down

Всегда округляется до целого числа, независимо от того, верхний или нижний квантиль.

integer_round_up

Всегда округляется до целого числа, независимо от того, верхний или нижний квантиль.

integer_round_nearest

Всегда округляется до ближайшего целого числа, независимо от того, верхний или нижний квантиль. Это обеспечит запрашиваемое покрытиев среднем случае, но для любого конкретного примера может привести к значительно большему или меньшему охвату, чем запрашиваемая сумма. Например:

Например:

#include <boost/math/distributions/negative_binomial.hpp>
using boost::math::negative_binomial_distribution;
using namespace boost::math::policies;
typedef negative_binomial_distribution<
      double,
      policy<discrete_quantile<integer_round_nearest> >
   > dist_type;
// Lower quantile rounded (down) to nearest:
double x = quantile(dist_type(20, 0.3), 0.05); // 27
// Upper quantile rounded (down) to nearest:
double y = quantile(complement(dist_type(20, 0.3), 0.05)); // 68

Результаты в<x= 27>(округлено от 27.3898) и<y=68>(округлено от 68.1584).


PrevUpHomeNext

Статья Discrete Quantile Policies раздела Math Toolkit 2.5.0 Policy Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Policy Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 04:39:41/0.0041508674621582/0