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

Hyperexponential Distribution

Boost , Math Toolkit 2.5.0 , Distributions

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
#include <boost/math/distributions/hyperexponential.hpp>
namespace boost{ namespace math{
template <typename RealType = double,
          typename Policy   = policies::policy<> >
class hyperexponential_distribution;
typedef hyperexponential_distribution<> hyperexponential;
template <typename RealType, typename Policy>
class hyperexponential_distribution
{
public:
   typedef RealType value_type;
   typedef Policy   policy_type;
   // Constructors:
   hyperexponential_distribution();  // Default.
   template <typename RateIterT, typename RateIterT2>
   hyperexponential_distribution(  // Default equal probabilities.
                                 RateIterT const& rate_first,
                                 RateIterT2 const& rate_last);  // Rates using Iterators.
   template <typename ProbIterT, typename RateIterT>
   hyperexponential_distribution(ProbIterT prob_first, ProbIterT prob_last,
                                 RateIterT rate_first, RateIterT rate_last);   // Iterators.
   template <typename ProbRangeT, typename RateRangeT>
   hyperexponential_distribution(ProbRangeT const& prob_range,
                                 RateRangeT const& rate_range);  // Ranges.
   template <typename RateRangeT>
   hyperexponential_distribution(RateRangeT const& rate_range);
 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)     // C++11 initializer lists supported.
   hyperexponential_distribution(std::initializer_list<RealType> l1, std::initializer_list<RealType> l2);
   hyperexponential_distribution(std::initializer_list<RealType> l1);
 #endif
   // Accessors:
   std::size_t num_phases() const;
   std::vector<RealType> probabilities() const;
   std::vector<RealType> rates() const;
};
}} // namespaces
[Note] Note

Предусмотрен механизм реализации, позволяющий избежать двусмысленности между конструкторами, принимающими в качестве параметров диапазоны, итераторы и константы. Это должно быть прозрачно для пользователя. См. ниже и файл заголовка hyperexponential.hpp для деталей и пояснительных комментариев.

Тип класса<hyperexponential_distribution>представляет собойгиперэкспоненциальное распределение.

Ak-фазовое гиперэкспоненциальное распределение - этонепрерывное распределение вероятностей, полученное в виде смесиkЭкспоненциальное распределениес. Его также называютсмешанным экспоненциальным распределениемили параллельным.k-фаза экспоненциального распределения.

Ak-фаза гиперэкспоненциального распределения характеризуется двумя параметрами, а именно aфазовый вероятностный вектор& #945;= [α1, ..., & #945;k]ивектор скорости& #955;= [λ1, ..., & #955;k].

Функцияплотности вероятностидля случайной вариацииxв гиперэкспоненциальном распределении задается:

Следующий график иллюстрирует PDF гиперэкспоненциального распределения с пятью различными параметрами, а именно:

  1. и #945;=(1.0)ии #955;=(1.0)(который вырождается до простого экспоненциального распределения),
  2. & #945;= (0.1, 0.9)ии #955;= (0.5, 1.5),
  3. & #945;= (0,9, 0,1)и& #955;= (0,5, 1,5),
  4. & #945;= (0.2, 0.3, 0.5)и& #955;= (0.5, 1.0, 1.5),
  5. & #945;= (0.5, 0.3, 0.2)и& #955;= (0.5, 1.0, 1.5).

Кроме того, следующий график иллюстрирует PDF гиперэкспоненциального распределения (твердые линии), где толькофазовый вектор вероятностиизменяется вместе с PDF двух ограничивающих экспоненциальных распределений (разбросанных линий):

  1. & #945;= (0.1, 0.9)ии #955;= (0.5, 1.5),
  2. & #945;= (0,6, 0,4)и& #955;= (0,5, 1,5),
  3. & #945;= (0,9, 0,1)и& #955;= (0,5, 1,5),
  4. Экспоненциальное распределение с параметромλ=0,5,
  5. Экспоненциальное распределение с параметромλ=1,5.

Как и ожидалось, в качестве первого элемента& #945;1фазовый вектор вероятностиприближается к(или, эквивалентно,и #945;20), получающееся гиперэкспоненциальное распределение приближается к экспоненциальному распределению с параметром& #955;=0,5. И наоборот, как первый элемент& #945;2фазовый вектор вероятностиприближается к(или, эквивалентно,и #945;10), получающееся гиперэкспоненциальное распределение приближается к экспоненциальному распределению с параметром& #955;=1,5.

Наконец, следующий график сравнивает PDF гиперэкспоненциального распределения с различным числом фаз, но с тем же средним значением, равным2:

  1. & #945;=(1.0)и& #955;=(2.0)(который вырождается до простого экспоненциального распределения),
  2. & #945;= (0.5, 0.5)и& #955;= (0.3, 1.5),
  3. & #945;=(1.0/3.0, 1.0/3.0, 1.0/3.0)и& #955;=(0.2, 1.5, 3.0),

Как можно отметить, даже если три распределения имеют одинаковое среднее значение, два гиперэкспоненциальных распределения имеют хвостпо отношению к одному из экспоненциального распределения. Действительно, гиперэкспоненциальное распределение имеет большую изменчивость, чем экспоненциальное распределение, что приводит ккоэффициенту вариациибольше, чем1(в отличие от одного из экспоненциального распределения, которое точно1).

Applications

Ak-фазовое гиперэкспоненциальное распределение часто используется втеории очередейдля моделирования распределения суперпозицииkнезависимых событий, таких как, например, распределение времени обслуживания очередей станции сkсерверов параллельно, гдеi--й сервер выбран с вероятностью& #945;iи его распределение времени обслуживания является экспоненциальным распределением со скоростью& #955;i(Allen, 1990; Papadopolous et al., 1993; Trivedi, 2002).

Например, часто наблюдалось, что распределение рабочего времени процессоров в вычислительной системе обладает таким распределением (Rosin, 1965). Кроме того, прибытие различных типов клиентов на одну станцию очереди часто моделируется как гиперэкспоненциальное распределение (Papadopolous et al., 1993). Аналогичным образом, если продукт, изготовленный на нескольких параллельных сборочных линиях, и выходы объединены, плотность отказов общего продукта, вероятно, будет гиперэкспоненциальной (Trivedi,2002).

Наконец, поскольку гиперэкспоненциальное распределение демонстрирует высокий коэффициент вариации (CoV), то есть CoV >1, оно особенно подходит для соответствия эмпирическим данным с большим CoV (Feitelson, 2014; Wolski et al., 2013) и для приближенияраспределений вероятности с длинным хвостом(Feldmann et al., 1998).

Related distributions

Examples

Lifetime of Appliances

Предположим, клиент покупает прибор и выбирает случайным образом между прибором со средним сроком службы 10 лет и прибором со средним сроком службы 12 лет. Предполагая, что срок службы этого устройства следует за экспоненциальным распределением, распределение срока службы приобретенного устройства может быть смоделировано как гиперэкспоненциальное распределение с вектором фазовой вероятности& #945;= (1/2,1/2)и вектором скорости& #955;= (1/10,1/12)(Wolfram, 2014).

В остальной части этого раздела мы приводим пример реализации C++ для расчета среднего срока службы и вероятности того, что устройство будет работать более 15 лет.

#include <boost/math/distributions/hyperexponential.hpp>
#include <iostream>
int main()
{
   const double rates[] = { 1.0 / 10.0, 1.0 / 12.0 };
   boost::math::hyperexponential he(rates);
   std::cout << "Average lifetime: "
      << boost::math::mean(he)
      << " years" << std::endl;
   std::cout << "Probability that the appliance will work for more than 15 years: "
      << boost::math::cdf(boost::math::complement(he, 15.0))
      << std::endl;
}

Результатом является:

Average lifetime: 11 years
Probability that the appliance will work for more than 15 years: 0.254817
Workloads of Private Cloud Computing Systems

Облачные вычислениястали популярной метафорой для динамического и безопасного доступа к вычислительным возможностям и возможностям хранения. В работе (Wolski et al., 2013) авторы анализируют и моделируют рабочие нагрузки, собранные из управляемых предприятием коммерческихчастных облаков, и показывают, что 3-фазные гиперэкспоненциальные распределения (с использованием алгоритмаожидаемой максимизации) точно фиксируют атрибуты рабочей нагрузки.

В этом типе вычислительной системы запросы пользователей состоят в требовании предоставления одной или несколькихвиртуальных машин(VM). В частности, в (Wolski et al., 2013) рабочая нагрузка, испытываемая каждой облачной системой, является функцией четырех распределений, по одному для каждого из следующих атрибутов рабочей нагрузки:

  • Запросить время прибытия: время до следующего запроса,
  • Продолжительность жизни: продолжительность времени, в течение которого VM предоставляется физической машине;
  • Размер запроса: количество VM в запросе и
  • Основной счет: Количество ядер процессора, запрошенное для каждой виртуальной машины.

Авторы предполагают, что все виртуальные машины в запросе имеют одинаковое количество ядер, но размеры запросов и количество ядер могут варьироваться от запроса к запросу. Кроме того, предполагается, что все виртуальные машины в рамках запроса имеют одинаковый срок службы. Учитывая эти предположения, авторы строят статистическую модель для атрибутов межприбыльного времени запроса и времени жизни виртуальной машины, укладывая свои соответствующие данные в 3-фазное гиперэкспоненциальное распределение.

В следующей таблице мы показываем среднее значение выборки и стандартное отклонение (SD) в секундах запроса межприбыльного времени и распределения времени жизни VM трех наборов данных, собранных авторами:

Набор данных

Mean Request Interarrival Time (недоступная ссылка)

Многоядерный VM Lifetime (SD)

Средний одноядерный VM Lifetime (SD)

DS1

2202.1 (2.2e+04)

257173 (4.6e+05)

28754.4 (1.6e+05)

DS2

41285.7 (1.1e+05)

144669.0 (7.9e+05)

599815.0 (1.7e+06)

DS3

11238.8 (3.0e+04)

30739.2 (1.6e+05)

44447.8 (2.2e+05)

Принимая во внимание, что в следующей таблице мы показываем гиперэкспоненциальные параметры распределения в результате соответствия:

Набор данных

Запросить время прибытия

Многоядерный VM Lifetime

Одноядерный VM Lifetime

DS1

& #945;= (0,34561,0,08648,0,56791),& #955;= (0,008,0,00005,0,02894)

& #945;= (0.24667,0.37948,0.37385),& #955;= (0,00004,0,000002,0,00059)

& #945;= (0.09325,0.22251,0.68424),& #955;= (0,000003,0.00109,0.00109)

DS2

& #945;= (0.38881,0.18227,0.42892),& #955;= (0,000006,0.05228,0,00081)

& #945;= (0.42093,0.43960,0.13947),& #955;= (0.00186,0.00008,0.0000008)

& #945;= (0.44885,0.30675,0.2444),& #955;= (0.00143,0.00005,0.0000004)

DS3

& #945;= (0.39442,0.24644,0.35914),& #955;= (0,00030,0.00003,0.00257)

& #945;= (0.37621,0.14838,0.47541),& #955;= (0.00498,0.000005,0.00022)

& #945;= (0.34131,0.12544,0.53325),& #955;= (0,000297,0,000003,0.00410)

В остальной части этого раздела мы приводим пример реализации C++ для вычисления некоторых статистических свойств установленных дистрибутивов для каждого из анализируемых наборов данных.

#include <boost/math/distributions.hpp>
#include <iostream>
#include <string>
struct ds_info
{
   std::string name;
   double iat_sample_mean;
   double iat_sample_sd;
   boost::math::hyperexponential iat_he;
   double multi_lt_sample_mean;
   double multi_lt_sample_sd;
   boost::math::hyperexponential multi_lt_he;
   double single_lt_sample_mean;
   double single_lt_sample_sd;
   boost::math::hyperexponential single_lt_he;
};
// DS1 dataset
ds_info make_ds1()
{
   ds_info ds;
   ds.name = "DS1";
   // VM interarrival time distribution
   const double iat_fit_probs[] = { 0.34561,0.08648,0.56791 };
   const double iat_fit_rates[] = { 0.0008,0.00005,0.02894 };
   ds.iat_sample_mean = 2202.1;
   ds.iat_sample_sd = 2.2e+4;
   ds.iat_he = boost::math::hyperexponential(iat_fit_probs, iat_fit_rates);
   // Multi-core VM lifetime distribution
   const double multi_lt_fit_probs[] = { 0.24667,0.37948,0.37385 };
   const double multi_lt_fit_rates[] = { 0.00004,0.000002,0.00059 };
   ds.multi_lt_sample_mean = 257173;
   ds.multi_lt_sample_sd = 4.6e+5;
   ds.multi_lt_he = boost::math::hyperexponential(multi_lt_fit_probs, multi_lt_fit_rates);
   // Single-core VM lifetime distribution
   const double single_lt_fit_probs[] = { 0.09325,0.22251,0.68424 };
   const double single_lt_fit_rates[] = { 0.000003,0.00109,0.00109 };
   ds.single_lt_sample_mean = 28754.4;
   ds.single_lt_sample_sd = 1.6e+5;
   ds.single_lt_he = boost::math::hyperexponential(single_lt_fit_probs, single_lt_fit_rates);
   return ds;
}
// DS2 dataset
ds_info make_ds2()
{
   ds_info ds;
   ds.name = "DS2";
   // VM interarrival time distribution
   const double iat_fit_probs[] = { 0.38881,0.18227,0.42892 };
   const double iat_fit_rates[] = { 0.000006,0.05228,0.00081 };
   ds.iat_sample_mean = 41285.7;
   ds.iat_sample_sd = 1.1e+05;
   ds.iat_he = boost::math::hyperexponential(iat_fit_probs, iat_fit_rates);
   // Multi-core VM lifetime distribution
   const double multi_lt_fit_probs[] = { 0.42093,0.43960,0.13947 };
   const double multi_lt_fit_rates[] = { 0.00186,0.00008,0.0000008 };
   ds.multi_lt_sample_mean = 144669.0;
   ds.multi_lt_sample_sd = 7.9e+05;
   ds.multi_lt_he = boost::math::hyperexponential(multi_lt_fit_probs, multi_lt_fit_rates);
   // Single-core VM lifetime distribution
   const double single_lt_fit_probs[] = { 0.44885,0.30675,0.2444 };
   const double single_lt_fit_rates[] = { 0.00143,0.00005,0.0000004 };
   ds.single_lt_sample_mean = 599815.0;
   ds.single_lt_sample_sd = 1.7e+06;
   ds.single_lt_he = boost::math::hyperexponential(single_lt_fit_probs, single_lt_fit_rates);
   return ds;
}
// DS3 dataset
ds_info make_ds3()
{
   ds_info ds;
   ds.name = "DS3";
   // VM interarrival time distribution
   const double iat_fit_probs[] = { 0.39442,0.24644,0.35914 };
   const double iat_fit_rates[] = { 0.00030,0.00003,0.00257 };
   ds.iat_sample_mean = 11238.8;
   ds.iat_sample_sd = 3.0e+04;
   ds.iat_he = boost::math::hyperexponential(iat_fit_probs, iat_fit_rates);
   // Multi-core VM lifetime distribution
   const double multi_lt_fit_probs[] = { 0.37621,0.14838,0.47541 };
   const double multi_lt_fit_rates[] = { 0.00498,0.000005,0.00022 };
   ds.multi_lt_sample_mean = 30739.2;
   ds.multi_lt_sample_sd = 1.6e+05;
   ds.multi_lt_he = boost::math::hyperexponential(multi_lt_fit_probs, multi_lt_fit_rates);
   // Single-core VM lifetime distribution
   const double single_lt_fit_probs[] = { 0.34131,0.12544,0.53325 };
   const double single_lt_fit_rates[] = { 0.000297,0.000003,0.00410 };
   ds.single_lt_sample_mean = 44447.8;
   ds.single_lt_sample_sd = 2.2e+05;
   ds.single_lt_he = boost::math::hyperexponential(single_lt_fit_probs, single_lt_fit_rates);
   return ds;
}
void print_fitted(ds_info const& ds)
{
   const double secs_in_a_hour = 3600;
   const double secs_in_a_month = 30 * 24 * secs_in_a_hour;
   std::cout << "### " << ds.name << std::endl;
   std::cout << "* Fitted Request Interarrival Time" << std::endl;
   std::cout << " - Mean (SD): " << boost::math::mean(ds.iat_he) << " (" << boost::math::standard_deviation(ds.iat_he) << ") seconds." << std::endl;
   std::cout << " - 99th Percentile: " << boost::math::quantile(ds.iat_he, 0.99) << " seconds." << std::endl;
   std::cout << " - Probability that a VM will arrive within 30 minutes: " << boost::math::cdf(ds.iat_he, secs_in_a_hour / 2.0) << std::endl;
   std::cout << " - Probability that a VM will arrive after 1 hour: " << boost::math::cdf(boost::math::complement(ds.iat_he, secs_in_a_hour)) << std::endl;
   std::cout << "* Fitted Multi-core VM Lifetime" << std::endl;
   std::cout << " - Mean (SD): " << boost::math::mean(ds.multi_lt_he) << " (" << boost::math::standard_deviation(ds.multi_lt_he) << ") seconds." << std::endl;
   std::cout << " - 99th Percentile: " << boost::math::quantile(ds.multi_lt_he, 0.99) << " seconds." << std::endl;
   std::cout << " - Probability that a VM will last for less than 1 month: " << boost::math::cdf(ds.multi_lt_he, secs_in_a_month) << std::endl;
   std::cout << " - Probability that a VM will last for more than 3 months: " << boost::math::cdf(boost::math::complement(ds.multi_lt_he, 3.0*secs_in_a_month)) << std::endl;
   std::cout << "* Fitted Single-core VM Lifetime" << std::endl;
   std::cout << " - Mean (SD): " << boost::math::mean(ds.single_lt_he) << " (" << boost::math::standard_deviation(ds.single_lt_he) << ") seconds." << std::endl;
   std::cout << " - 99th Percentile: " << boost::math::quantile(ds.single_lt_he, 0.99) << " seconds." << std::endl;
   std::cout << " - Probability that a VM will last for less than 1 month: " << boost::math::cdf(ds.single_lt_he, secs_in_a_month) << std::endl;
   std::cout << " - Probability that a VM will last for more than 3 months: " << boost::math::cdf(boost::math::complement(ds.single_lt_he, 3.0*secs_in_a_month)) << std::endl;
}
int main()
{
   print_fitted(make_ds1());
   print_fitted(make_ds2());
   print_fitted(make_ds3());
}

Полученный выход (с точностью плавающей точки, установленной на 2) является:

### DS1
* Fitted Request Interarrival Time
 - Mean (SD): 2.2e+03 (8.1e+03) seconds.
 - 99th Percentile: 4.3e+04 seconds.
 - Probability that a VM will arrive within 30 minutes: 0.84
 - Probability that a VM will arrive after 1 hour: 0.092
* Fitted Multi-core VM Lifetime
 - Mean (SD): 2e+05 (3.9e+05) seconds.
 - 99th Percentile: 1.8e+06 seconds.
 - Probability that a VM will last for less than 1 month: 1
 - Probability that a VM will last for more than 3 months: 6.7e-08
* Fitted Single-core VM Lifetime
 - Mean (SD): 3.2e+04 (1.4e+05) seconds.
 - 99th Percentile: 7.4e+05 seconds.
 - Probability that a VM will last for less than 1 month: 1
 - Probability that a VM will last for more than 3 months: 6.9e-12
### DS2
* Fitted Request Interarrival Time
 - Mean (SD): 6.5e+04 (1.3e+05) seconds.
 - 99th Percentile: 6.1e+05 seconds.
 - Probability that a VM will arrive within 30 minutes: 0.52
 - Probability that a VM will arrive after 1 hour: 0.4
* Fitted Multi-core VM Lifetime
 - Mean (SD): 1.8e+05 (6.4e+05) seconds.
 - 99th Percentile: 3.3e+06 seconds.
 - Probability that a VM will last for less than 1 month: 0.98
 - Probability that a VM will last for more than 3 months: 0.00028
* Fitted Single-core VM Lifetime
 - Mean (SD): 6.2e+05 (1.6e+06) seconds.
 - 99th Percentile: 8e+06 seconds.
 - Probability that a VM will last for less than 1 month: 0.91
 - Probability that a VM will last for more than 3 months: 0.011
### DS3
* Fitted Request Interarrival Time
 - Mean (SD): 9.7e+03 (2.2e+04) seconds.
 - 99th Percentile: 1.1e+05 seconds.
 - Probability that a VM will arrive within 30 minutes: 0.53
 - Probability that a VM will arrive after 1 hour: 0.36
* Fitted Multi-core VM Lifetime
 - Mean (SD): 3.2e+04 (1e+05) seconds.
 - 99th Percentile: 5.4e+05 seconds.
 - Probability that a VM will last for less than 1 month: 1
 - Probability that a VM will last for more than 3 months: 1.9e-18
* Fitted Single-core VM Lifetime
 - Mean (SD): 4.3e+04 (1.6e+05) seconds.
 - 99th Percentile: 8.4e+05 seconds.
 - Probability that a VM will last for less than 1 month: 1
 - Probability that a VM will last for more than 3 months: 9.3e-12
[Note] Note

Приведенные выше результаты отличаются от результатов, показанных в таблицах III, V и VII (Wolski et al., 2013). Мы тщательно проверили их с помощью Wolfram Mathematica 10, что подтвердило наши результаты.

Member Functions

Default Constructor
hyperexponential_distribution();

Построение a1-фазного гиперэкспоненциального распределения (т.е. экспоненциального распределения) со скоростью<1>.

Constructor from Iterators
template <typename ProbIterT, typename RateIterT>
hyperexponential_distribution(ProbIterT prob_first, ProbIterT prob_last,
                              RateIterT rate_first, RateIterT rate_last);

Построение гиперэкспоненциального распределения сфазовым вектором вероятностипараметром, заданным диапазоном, определенным парой итераторов<prob_first>,<prob_lastвектором скоростипараметром, заданным диапазоном, заданным парой итераторов<rate_first>,<rate_last>.

Parameters
  • <prob_first>,<prob_last>: диапазон неотрицательных действительных элементов, представляющих фазовые вероятности; элементы нормализуются в сумме до единицы.
  • <rate_first>,<rate_last>: диапазон положительных элементов, представляющих ставки.
Type Requirements
  • <ProbIterT>,<RateIterT>: должен соответствовать требованиям концепцииInputIterator.
Example
std::array<double, 2> phase_prob = { 0.5, 0.5 };
std::array<double, 2> rates = { 1.0 / 10, 1.0 / 12 };
hyperexponential he(phase_prob.begin(), phase_prob.end(), rates.begin(), rates.end());
Construction from Ranges/Containers
template <typename ProbRangeT, typename RateRangeT>
hyperexponential_distribution(ProbRangeT const& prob_range,
                              RateRangeT const& rate_range);

Построение гиперэкспоненциального распределения сфазовым вектором вероятностипараметром, заданным диапазоном, определенным<prob_range>, ивектором скоростипараметром, заданным диапазоном, заданным<rate_range>.

[Note] Note

В качестве детали реализации этот конструктор использует механизмBoost's enable_if/disable_ifдля разграничения между этим и другими конструкторами 2-аргументов. Обратитесь к исходному коду для более подробной информации.

Parameters
  • <prob_range>: диапазон неотрицательных действительных элементов, представляющих фазовые вероятности; элементы нормализуются в сумме до единицы.
  • <rate_range>: диапазон положительных реальных элементов, представляющих ставки.
Type Requirements
  • <ProbRangeT>,<RateRangeT>: должен соответствовать требованиям концепцииRange, которая включает в себя нативные массивы C++, стандартные библиотечные контейнеры или std::pair или итераторы.
Examples
// We could be using any standard library container here... vector, deque, array, list etc:
std::array<double, 2> phase_prob = { 0.5, 0.5 };
std::array<double, 2> rates      = { 1.0 / 10, 1.0 / 12 };
hyperexponential he1(phase_prob, rates);    // Construct from standard library container.
double phase_probs2[] = { 0.5, 0.5 };
double rates2[]       = { 1.0 / 10, 1.0 / 12 };
hyperexponential he2(phase_probs2, rates2);  // Construct from native C++ array.
Construction with rates-iterators (and all phase probabilities equal)
template <typename RateIterT, typename RateIterT2>
hyperexponential_distribution(RateIterT const& rate_first,
                              RateIterT2 const& rate_last);

Конструирует гиперэкспоненциальное распределение свектором скоростипараметром, заданным диапазоном, определенным парой итераторов<rate_first>,<rate_lastвектором вероятности фазы, установленным на равные фазовые вероятности (т.е. на вектор одинаковой длины<n>вектора скоростии с каждым элементом, установленным на<1.0/n>).

[Note] Note

В качестве детали реализации этот конструктор использует механизмBoost's enable_if/disable_ifдля разграничения между этим и другими конструкторами 2-аргументов. Обратитесь к исходному коду для более подробной информации.

Parameters
  • <rate_first>,<rate_last>: диапазон положительных элементов, представляющих ставки.
Type Requirements
  • <RateIterT>,<RateIterT2>: должен соответствовать требованиям концепцииInputIterator.
Example
// We could be using any standard library container here... vector, deque, array, list etc:
std::array<double, 2> rates = { 1.0 / 10, 1.0 / 12 };
hyperexponential he(rates.begin(), rates.end());
assert(he.probabilities()[0] == 0.5); // Phase probabilities will be equal and normalised to unity.
Construction from a single range of rates (all phase probabilities will be equal)
template <typename RateRangeT>
hyperexponential_distribution(RateRangeT const& rate_range);

Построено гиперэкспоненциальное распределение свектором скоростипараметром, заданным диапазоном, определенным<rate_range>, ивектором вероятности фазы, установленным на равные фазовые вероятности (т.е. на вектор одинаковой длины<n>вектора скоростии с каждым элементом, установленным на<1.0/n>).

Parameters
  • <rate_range>: диапазон положительных реальных элементов, представляющих ставки.
Type Requirements
  • <RateRangeT>: должен соответствовать требованиям концепцииRange: это включает в себя нативный массив C++, стандартные библиотечные контейнеры и<std::pair>итераторов.
Examples
std::array<double, 2> rates = { 1.0 / 10, 1.0 / 12 };
hyperexponential he(rates);
assert(he.probabilities()[0] == 0.5); // Phase probabilities will be equal and normalised to unity.
Construction from Initializer lists
hyperexponential_distribution(std::initializer_list<RealType> l1, std::initializer_list<RealType> l2);

Построено гиперэкспоненциальное распределение сфазовым вектором вероятностипараметром, заданнымскобчатым списком, определенным<l1>, ивектором скоростипараметром, заданнымскобчатым списком, определенным<l2>.

Parameters
  • <l1>: список неотрицательных реальных элементов, представляющих фазовые вероятности; элементы нормализованы, чтобы суммироваться в единство.
  • <l2>: скобка-в-список положительных реальных элементов, представляющих ставки.

Количество элементов списка фазовых вероятностей и списка ставок должно быть одинаковым.

Example
hyperexponential he = { { 0.5, 0.5 }, { 1.0 / 10, 1.0 / 12 } };
Construction from a single initializer list (all phase probabilities will be equal)
hyperexponential_distribution(std::initializer_list<RealType> l1);

Построение гиперэкспоненциального распределения свектором скоростипараметром, заданнымскобчатым списком, определенным<l1>, ивектором фазовой вероятности, установленным на равные фазовые вероятности (т.е. на вектор одинаковой длины<n>вектора скоростии с каждым элементом, установленным на<1.0/n>).

Parameters
  • <l1>: сводный список неотрицательных реальных элементов, представляющих фазовые вероятности; они нормализуются для обеспечения их суммирования в единство.
Example
hyperexponential he = { 1.0 / 10, 1.0 / 12 };
assert(he.probabilities()[0] == 0.5);
Accessors
std::size_t num_phases() const;

Получает число фаз этого распределения (размер как векторов скорости, так и векторов вероятности).

Return Value

Неотрицательное целое число, представляющее число фаз этого распределения.

std::vector<RealType> probabilities() const;

Получаетфазовый вектор вероятностипараметр этого распределения.

[Note] Note

Возвращаемыми вероятностями являютсянормализованныеверсии значений параметров вероятности, прошедших в момент построения.

Return Value

Вектор неотрицательных действительных чисел, представляющийфазовый вектор вероятностипараметра этого распределения.

std::vector<RealType> rates() const;

Получаетвектор скоростипараметр этого распределения.

Return Value

Вектор положительных действительных чисел, представляющийвектор скоростипараметра этого распределения.

[Warning] Warning

Тип возврата этих функций представляет собой вектор по значению. Это преднамеренно, поскольку мы хотим скрыть фактический контейнер, используемый внутри, который может быть подвержен будущим изменениям (например, для облегчения векторизации кода CDF и т. Д.). Пользователи должны отметить, что некоторые коды, которые в противном случае могли бы работать, не работают. Например, попытка вывести (нормализованные) вероятности:

std::copy(he.probabilities().begin(), he.probabilities().end(), std::ostream_iterator<double>(std::cout, " "));

не удается компиляция или время выполнения, потому что типы итераторов несовместимы, но, например,

std::cout << he.probabilities()[0] << ' ' << he.probabilities()[1] << std::endl;

выдает ожидаемые значения.

В общем случае, если вы хотите получить доступ к элементу возвращаемого контейнера, сначала назначьте переменную, а затем получите доступ к этим элементам:

std::vector<double> t = he.probabilities();
std::copy(t.begin(), t.end(), std::ostream_iterator<double>(std::cout, " "));

Non-member Accessor Functions

Поддерживаются всеобычные нечленные функции доступа, которые являются общими для всех распределений:Кумулятивная функция распределения,Функция плотности вероятности,Количественная,Функция опасности,Кумулятивная функция опасности,среднее,медианное,режим,дисперсия,стандартное отклонение,искажение,куртоз,куртоз_избыток,диапазониподдержка.

Формулы для их расчета приведены в таблице ниже.

Accuracy

Гиперэкспоненциальное распределение реализуется в терминахЭкспоненциальное распределениеи как таковое должно иметь очень небольшие ошибки, обычноэпсилонили несколько.

Implementation

В следующей таблице:

  • α= [α1,...,αk]являетсяпараметромk-фазового гиперэкспоненциального распределения,
  • & #955;= [λ1, ..., & #955;k]являетсявектором скоростипараметромk-фазовое гиперэкспоненциальное распределение,
  • x— случайная вариация.

Функция

Записки об осуществлении

поддержка

x& #8712; [0, & #8734;]

pdf

cdf

cdf

квантиль

Закрытая форма отсутствует. Вычисляется численно.

квантиль от дополнения

Закрытая форма отсутствует. Вычисляется численно.

означает

Разница

Режим

<0>

Искажение

Куртоз

Избыток куртоза

Куртоз<-3>

References

  • А.О. Аллен,Вероятность, статистика и теория очередей с применением компьютерных наук, второе издание, Академическая пресса, 1990.
  • Д.Г. ФейтельсонМоделирование рабочей нагрузки для оценки производительности компьютерных систем, издательство Кембриджского университета, 2014
  • А. Фельдман и У. УиттПодбор смесей экспоненциальных распределений с длинным хвостом для анализа моделей производительности сети, Оценка производительности 31(3-4):245, doi:10.1016/S0166-5316(97)00003-5, 1998.
  • H.T. Papadopolous, C. Heavey and J. Browne,Queueing Theory in Manufacturing Systems Analysis and Design, Chapman & Hall/CRC, 1993, p.
  • Р.Ф. РозинОпределение среды вычислительного центра, Коммуникации ACM 8(7):463-468, 1965.
  • К.С. ТриведиВероятность и статистика с надежностью, очередями и приложениями для компьютерных наук, John Wiley & Sons, Inc., 2002.
  • Википедия,Гиперэкспоненциальное распространение, Онлайн:http://en.wikipedia.org/wiki/Hyperexponential_distribution, 2014
  • R. Wolski and J. Brevik,Using Parametric Models to Represent Private Cloud Workloads, IEEE TSC, PrePrint, DOI:10.1109/TSC.2013.48, 2013.
  • Wolfram Mathematica,Hyperexponential Distribution, Online:http://reference.wolfram.com/language/ref/HyperexponentialDistribution.html, 2014.

PrevUpHomeNext

Статья Hyperexponential Distribution раздела Math Toolkit 2.5.0 Distributions может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Distributions ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 07:02:10/0.012524127960205/0