![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
User's GuideBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 1. Boost.Accumulators
|
Инструмент | Описание |
---|---|
This is the most important type in the Accumulators Framework.
It is a collection of accumulators. A datum pushed into an | |
Used to specify which other features a feature depends on. | |
Trait used to tell the Accumulators Framework that, for the purpose of feature-based dependency resolution, one feature should be treated the same as another. | |
Used to create an alias for a feature. For example, if there are
two features, fast_X and accurate_X, they can be mapped to X(fast)
and X(accurate) with | |
An MPL sequence.
We can use | |
|
Used when declaring an |
|
A class template useful for creating an extractor function object.
It is parameterized on a feature, and it has member functions for
extracting from an |
Наша экскурсия по шаблону<accumulator_set<>
>класса начинается с форвардной декларации:
template< typename Sample, typename Features, typename Weight = void > struct accumulator_set;
Параметры шаблона имеют следующее значение:
Sample
Тип данных, которые будут накапливаться.
Features
ПоследовательностьMPLпризнаков, подлежащих вычислению.
Weight
Тип (необязательно) весового параметра.
Например, следующая строка объявляет<accumulator_set<>
>, которая будет принимать последовательность удваивается по одному за раз и вычислять мин и среднее:
accumulator_set< double, features< tag::min, tag::mean > > acc;
Обратите внимание, что мы используем шаблон<features<>
>, чтобы указать список функций для расчета.<features<>
>является последовательность признаков MPL.
![]() | Note |
---|---|
< |
После того, как мы определили<accumulator_set<>
>, мы можем ввести в него данные, и он рассчитает запрошенные вами количества, как показано ниже.
// push some data into the accumulator_set ... acc(1.2); acc(2.3); acc(3.4);
Поскольку<accumulator_set<>
>определяет свою накопительную функцию как оператор вызова функции, у нас может возникнуть соблазн использовать<accumulator_set<>
>в качестве унарной функции для стандартного алгоритма, такого как<std::for_each
>. Это нормально, если учесть, что стандартные алгоритмы принимают объекты UnaryFunction по значению, которое включает в себя создание копии объекта<accumulator_set<>
>. Рассмотрим следующее:
// The data for which we wish to calculate statistical properties: std::vector< double > data( /* stuff */ ); // The accumulator set which will calculate the properties for us: accumulator_set< double, features< tag::min, tag::mean > > acc; // Use std::for_each to accumulate the statistical properties: acc = std::for_each( data.begin(), data.end(), acc );
Обратите внимание, как мы должны присвоить значение возврата<std::for_each
><accumulator_set<>
>. Это работает, но некоторые аккумуляторы не дешевы для копирования. Например,<tail
>и<tail_variate<>
>аккумуляторы должны хранить<std::vector<>
>, поэтому копирование этих аккумуляторов предполагает динамическое распределение. В этом случае мы могли бы лучше передать аккумулятор по ссылке с помощью<boost::bind()
>и<boost::ref()
>. См. ниже:
// The data for which we wish to calculate statistical properties: std::vector< double > data( /* stuff */ ); // The accumulator set which will calculate the properties for us: accumulator_set< double, features< tag::tail<left> > > acc( tag::tail<left>::cache_size = 4 ); // Use std::for_each to accumulate the statistical properties: std::for_each( data.begin(), data.end(), bind<void>( ref(acc), _1 ) );
Обратите внимание, что мы больше не заботимся о возвратном значении<std::for_each()
>, потому что<std::for_each()
>напрямую изменяет<acc
>.
![]() | Note |
---|---|
Чтобы использовать< |
Как только мы объявим<accumulator_set<>
>и введем в него данные, мы должны быть в состоянии извлечь из него результаты. Для каждой функции, которую мы можем добавить к<accumulator_set<>
>, есть соответствующий экстрактор для получения его результата. Обычно экстрактор имеет то же название, что и функция, но в другом пространстве имен. Например, если мы накапливаем<tag::min
>и<tag::max
>признаки, мы можем извлечь результаты с помощью<min
>и<max
>экстракторов следующим образом:
// Calculate the minimum and maximum for a sequence of integers. accumulator_set< int, features< tag::min, tag::max > > acc; acc( 2 ); acc( -1 ); acc( 1 ); // This displays "(-1, 2)" std::cout << '(' << min( acc ) << ", " << max( acc ) << ")\n";
Все вытяжки объявлены в пространстве имен<boost::accumulators::extract
>, но они приведены в пространстве имен<boost::accumulators
>с декларацией<using
>.
![]() | Tip |
---|---|
На платформе Windows< |
Другой способ извлечь результат из<accumulator_set<>
>— это<extract_result()
>функция. Это может быть более удобно, если нет объекта-экстрактора, удобного для определенной функции. Линия, выше которой отображаются результаты, может быть написана следующим образом:
// This displays "(-1, 2)" std::cout << '(' << extract_result< tag::min >( acc ) << ", " << extract_result< tag::max >( acc ) << ")\n";
Наконец, мы можем определить наш собственный экстрактор, используя шаблон класса<extractor<>
>. Например, еще один способ избежать макробизнеса<min
>/<max
>- это определить экстракторы с именами, которые не конфликтуют с макросами.
extractor< tag::min > min_; extractor< tag::min > max_; // This displays "(-1, 2)" std::cout << '(' << min_( acc ) << ", " << max_( acc ) << ")\n";
Некоторые аккумуляторы нуждаются в параметрах инициализации. Кроме того, возможно, некоторая вспомогательная информация должна быть передана в<accumulator_set<>
>вместе с каждым образцом. Повышаю. Накопители обрабатывают эти случаи с помощью названных параметров из библиотекиBoost.Parameter.
Рассмотрим, например,<tail
>и<tail_variate<>
>особенности.<tail
>ведет упорядоченный список крупнейших<N
>образцов, где<N
>может быть указан в момент строительства. Кроме того, функция<tail_variate<>
>, которая зависит от<tail
>, отслеживает некоторые данные, которые ковариатны с образцами<N
>, отслеживаемыми<tail
>. Код ниже показывает, как все это работает, и более подробно описано ниже.
// Define a feature for tracking covariate data typedef tag::tail_variate< int, tag::covariate1, left > my_tail_variate_tag; // This will calculate the left tail and my_tail_variate_tag for N == 2 // using the tag::tail<left>::cache_size named parameter accumulator_set< double, features< my_tail_variate_tag > > acc( tag::tail<left>::cache_size = 2 ); // push in some samples and some covariates by using // the covariate1 named parameter acc( 1.2, covariate1 = 12 ); acc( 2.3, covariate1 = -23 ); acc( 3.4, covariate1 = 34 ); acc( 4.5, covariate1 = -45 ); // Define an extractor for the my_tail_variate_tag feature extractor< my_tail_variate_tag > my_tail_variate; // Write the tail statistic to std::cout. This will print "4.5, 3.4, " std::ostream_iterator< double > dout( std::cout, ", " ); std::copy( tail( acc ).begin(), tail( acc ).end(), dout ); // Write the tail_variate statistic to std::cout. This will print "-45, 34, " std::ostream_iterator< int > iout( std::cout, ", " ); std::copy( my_tail_variate( acc ).begin(), my_tail_variate( acc ).end(), iout );
Есть несколько вещей, чтобы отметить о коде выше. Во-первых, обратите внимание, что нам не нужно было просить, чтобы функция<tail
>была рассчитана. Это объясняется тем, что<tail_variate<>
>зависит от<tail
>признака. Далее обратите внимание, как инициализируется<acc
>объект:<acc(
tag::tail<left>::cache_size=
2)
>. Здесь<cache_size
>— названный параметр. Он используется для определения<tail
>и<tail_variate<>
>аккумуляторов, сколько образцов и ковариатов хранить. Концептуально каждый параметр конструкции доступен для каждого аккумулятора в наборе аккумуляторов.
Мы также используем названный параметр для передачи ковариативных данных в аккумулятор, установленный вместе с образцами. Как и в случае с параметрами конструктора, все параметры накопительной функции доступны для всех аккумуляторов в наборе. В этом случае только аккумулятор для характеристики<my_tail_variate
>будет заинтересован в значении названного параметра<covariate1
>.
Мы можем сделать одно заключительное замечание о примере выше. Поскольку<tail
>и<tail_variate<>
>являются многозначными признаками, то результат, который мы для них извлекаем, представлен в виде диапазона итераторов. Вот почему мы можем сказать<tail(acc).begin()
>и<tail(acc).end()
>.
Даже экстракторы могут принимать названные параметры. Через некоторое время мы увидим ситуацию, в которой это будет полезно.
Некоторые аккумуляторы, в частности, статистические аккумуляторы, имеют дело с данными, которыевзвешены. Каждый образец, вдавленный в аккумулятор, имеет соответствующий вес, с помощью которого образец концептуально умножается. Библиотека статистических накопителей предоставляет ассортимент этих взвешенных статистических накопителей. И многие невзвешенные статистические аккумуляторы имеют взвешенные варианты. Например, взвешенный вариант аккумулятора<sum
>называется<weighted_sum
>и рассчитывается путем накопления всех образцов, умноженных на их веса.
Чтобы объявить<accumulator_set<>
>, который принимает взвешенные образцы, вы должны указать тип параметра веса в качестве 3-го шаблонного параметра следующим образом:
// 3rd template parameter 'int' means this is a weighted // accumulator set where the weights have type 'int' accumulator_set< int, features< tag::sum >, int > acc;
При указании веса все аккумуляторы в комплекте заменяются на их взвешенные эквиваленты. Например, приведенное выше<accumulator_set<>
>заявление эквивалентно следующему:
// Since we specified a weight, tag::sum becomes tag::weighted_sum accumulator_set< int, features< tag::weighted_sum >, int > acc;
При передаче образцов в комплект аккумулятора необходимо также указать вес каждого образца. Вы можете сделать это с помощью параметра<weight
>:
acc(1, weight = 2); // 1 * 2 acc(2, weight = 4); // 2 * 4 acc(3, weight = 6); // + 3 * 6 // ------- // = 28
Затем вы можете извлечь результат с помощью экстрактора<sum()
>следующим образом:
// This prints "28" std::cout << sum(acc) << std::endl;
![]() | Note |
---|---|
При работе с взвешенными статистическими аккумуляторами из Библиотеки статистических накопителей обязательно включите соответствующий заголовок. Например,< |
Этот раздел описывает объекты функций в пространстве имен<boost::numeric
>, которое представляет собой подбиблиотеку, которая предоставляет объекты функций и мета-функции, соответствующие операторам исправления в C++.
В пространстве имен<boost::numeric::operators
>имеются дополнительные операторские перегрузки для некоторых полезных операций, не предусмотренных стандартной библиотекой, таких как умножение<std::complex<>
>на скаляр.
В<boost::numeric::functional
>пространстве имен находятся эквиваленты объектов функций операторов фиксации. Эти типы функциональных объектов неоднородны, и поэтому являются более общими, чем стандартные, найденные в заголовке<<functional>
>. Они используют буст. Тип библиотеки для вывода типов возврата выражений исправления, которые они оценивают. Кроме того, они смотрят в пространстве имен<boost::numeric::operators
>, чтобы рассмотреть любые дополнительные перегрузки, которые могут быть определены там.
В пространстве имен<boost::numeric
>находятся глобальные полиморфные объекты функций, соответствующие типам объектов функций, определенным в пространстве имен<boost::numeric::functional
>. Например,<boost::numeric::plus(a,b)
>эквивалентно<boost::numeric::functional::plus<A,B>()(a,b)
>, и оба эквивалентны<usingnamespace
boost::numeric::operators;
a+
b;
>.
Подбиблиотека числовых операторов также дает несколько способов подкласса и способ подкласса и специализации операций. Один из способов использует отправку тегов по типам операндов. Другой путь основан на свойствах времени компиляции операндов.
В этом разделе описывается, как расширить структуру аккумуляторов путем определения новых аккумуляторов, функций и экстракторов. Также рассматриваются способы контроля разрешения зависимостей функций в наборе аккумуляторов.
Все новые аккумуляторы должны удовлетворятьКонцепции аккумулятора. Ниже приведен класс выборки, который удовлетворяет концепции аккумулятора, который просто суммирует значения всех образцов, переданных в него.
#include <boost/accumulators/framework/accumulator_base.hpp> #include <boost/accumulators/framework/parameters/sample.hpp> namespace boost { // Putting your accumulators in the namespace accumulators { // impl namespace has some namespace impl { // advantages. See below. template<typename Sample> struct sum_accumulator // All accumulators should inherit from : accumulator_base // accumulator_base. { typedef Sample result_type; // The type returned by result() below. template<typename Args> // The constructor takes an argument pack. sum_accumulator(Args const & args) : sum(args[sample | Sample()]) // Maybe there is an initial value in the { // argument pack. ('sample' is defined in } // sample.hpp, included above.) template<typename Args> // The accumulate function is the function void operator ()(Args const & args) // call operator, and it also accepts an { // argument pack. this->sum += args[sample]; } result_type result(dont_care) const // The result function will also be passed { // an argument pack, but we don't use it here, return this->sum; // so we use "dont_care" as the argument type. } private: Sample sum; }; }}}
Большая часть вышесказанного должна быть довольно понятной, за исключением использования пакетов аргументов, которые могут сбивать с толку, если вы никогда раньше не использовали библиотекуBoost.Parameter. Пакет аргументов представляет собой кластер значений, к каждому из которых можно получить доступ с помощью ключа. Так<args[sample]
>извлекает из упаковки значение, связанное с<sample
>ключом. И загадочный<args[sample|Sample()]
>оценивает значение, связанное с<sample
>ключом, если он существует, или построенным по умолчанию<Sample
>, если он не существует.
Приведенный выше пример демонстрирует наиболее распространенные атрибуты аккумулятора. Есть и другие необязательные членские функции, которые имеют особое значение. В частности:
Optional Accumulator Member Functions
on_drop(Args)
Определяет действие, которое необходимо предпринять при сбросе этого аккумулятора. См. разделОслабляемые аккумуляторы.
Некоторые аккумуляторы зависят от других аккумуляторов в том же наборе аккумуляторов. В этих случаях необходимо иметь доступ к другим аккумуляторам. Чтобы сделать это возможным,<accumulator_set<>
>передает ссылку на себя при вызове функций члена содержащихся в нем аккумуляторов. К нему можно получить доступ, используя специальный ключ<accumulator
>с пакетом аргументов. Рассмотрим, как мы можем реализовать<mean_accumulator
>:
// Mean == (Sum / Count) template<typename Sample> struct mean_accumulator : accumulator_base { typedef Sample result_type; mean_accumulator(dont_care) {} template<typename Args> result_type result(Args const &args) const { return sum(args[accumulator]) / count(args[accumulator]); } };
<mean
>зависит от<sum
>и<count
>аккумуляторов. (В следующем разделе мы рассмотрим, как определить эти зависимости.) Результат среднего аккумулятора - это просто результат суммарного аккумулятора, деленного на результат счетного аккумулятора. Рассмотрим, как мы это пишем<sum(args[accumulator])
/count(args[accumulator])
>. Выражение<args[accumulator]
>оценивает со ссылкой на<accumulator_set<>
>, содержащее это<mean_accumulator
>. Он также содержит<sum
>и<count
>аккумуляторы, и мы можем получить доступ к их результатам с помощью экстракторов, определенных для этих функций:<sum
>и<count
>.
![]() | Note |
---|---|
Накопители, которые наследуют от< |
Все функции-члены, принимающие пакет аргументов, имеют доступ к прилагаемому<accumulator_set<>
>через<accumulator
>ключ, включая конструктор. Аккумуляторы внутри набора построены в порядке, определяемом их взаимозависимостью. В результате аккумулятору безопасно получить доступ к тому, от которого он зависит во время строительства.
Несмотря на то, что в этом нет необходимости, может быть хорошей идеей разместить ваши реализации аккумуляторов в пространстве имен<boost::accumulators::impl
>. Это пространство имен привлекает любых операторов, определенных в пространстве имен<boost::numeric::operators
>, с помощью директивы. Подбиблиотека числовых операторов определяет некоторые дополнительные перегрузки, которые заставят ваши аккумуляторы работать со всеми типами данных.
Рассмотрим<mean_accumulator
>выше. Он делит сумму образцов на количество. Тип счета<std::size_t
>. Что, если тип выборки не определяет деление на<std::size_t
>? Таково положение<std::complex<>
>. Вы можете подумать, что если тип выборки<std::complex<>
>, код не будет работать, но на самом деле он работает. Это потому, что подбиблиотека числовых операторов определяет перегруженную<operator/
>для<std::complex<>
>и<std::size_t
>. Этот оператор определен в пространстве имен<boost::numeric::operators
>и будет найден в пространстве имен<boost::accumulators::impl
>. Вот почему это хорошая идея, чтобы поставить свои аккумуляторы там.
Термин «удаляемый» относится к аккумулятору, который может быть удален из<accumulator_set<>
>. Вы можете запросить, чтобы аккумулятор стал капельным, используя шаблон класса<droppable<>
>.
// calculate sum and count, make sum droppable: accumulator_set< double, features< tag::count, droppable<tag::sum> > > acc; // add some data acc(3.0); acc(2.0); // drop the sum (sum is 5 here) acc.drop<tag::sum>(); // add more data acc(1.0); // This will display "3" and "5" std::cout << count(acc) << ' ' << sum(acc);
Любые аккумуляторы, которые добавляются в набор аккумуляторов для удовлетворения зависимостей от капельных аккумуляторов, сами по себе являются капельными. Рассмотрим следующий аккумулятор:
// Sum is not droppable. Mean is droppable. Count, brought in to // satisfy mean's dependencies, is implicitly droppable, too. accumulator_set< double, features< tag::sum, droppable<tag::mean> > > acc;
<mean
>зависит от<sum
>и<count
>. Так как<mean
>опущено, то и<count
>тоже. Тем не менее, мы явно просили, чтобы<sum
>не опускались, поэтому это не так. Если бы мы оставили<tag::sum
>из вышеприведенной декларации,<sum
>аккумулятор был бы неявно опускаемым.
Опускаемый аккумулятор считается эталоном и действительно сбрасывается только после того, как все аккумуляторы, которые зависят от него, были сброшены. Это может привести к неожиданному поведению в некоторых ситуациях.
// calculate sum and mean, make mean droppable. accumulator_set< double, features< tag::sum, droppable<tag::mean> > > acc; // add some data acc(1.0); acc(2.0); // drop the mean. mean's reference count // drops to 0, so it's really dropped. So // too, count's reference count drops to 0 // and is really dropped. acc.drop<tag::mean>(); // add more data. Sum continues to accumulate! acc(3.0); // This will display "6 2 3" std::cout << sum(acc) << ' ' << count(acc) << ' ' << mean(acc);
Обратите внимание, что в точке, в которой<mean
>падает,<sum
>составляет 3,<count
>- 2, и, следовательно,<mean
>- 1,5. Но поскольку<sum
>продолжает накапливаться даже после того, как<mean
>было сброшено, значение<mean
>продолжает меняться. Если вы хотите запомнить значение<mean
>в точке его падения, вы должны сохранить его значение в локальную переменную.
Следующие правила более точно определяют, как капельные и нераскачивающиеся аккумуляторы ведут себя в наборе аккумуляторов.
X
>оба<X
>и<droppable<X>
>удовлетворяют<X
>зависимости.X
>зависит от<Y
>и<Z
>, то<droppable<X>
>зависит от<droppable<Y>
>и<droppable<Z>
>.add_ref()
>и<drop()
>.drop()
>представляет собой no-op, а<add_ref()
>вызывает<add_ref()
>на всех аккумуляторах, соответствующих признакам, от которых зависит ток аккумулятора.add_ref()
>и<drop()
>для управления счетчиком отсчета.add_ref()
>увеличивается исходное количество аккумулятора, а также<add_ref()
>аккумуляторов, соответствующих особенностям, от которых зависит текущий аккумулятор.drop()
>сокращает исходное количество аккумулятора, а также<drop()
>аккумуляторов, соответствующих особенностям, от которых зависит текущий аккумулятор.add_ref()
>аккумулятора, который соответствует каждому из них. (Примечание: это означает, что аккумулятор, который не определен пользователем, а находится в наборе только для удовлетворения зависимости, будет сброшен, как только все его зависимости будут сброшены. Те, которые были указаны пользователем, не сбрасываются до тех пор, пока их зависимости не будут сброшеныи.В качестве оптимизации:
X
>, которая зависит от<Y
>и<Z
>, то аккумуляторы для<Y
>и<Z
>могут быть безопасно сделаны не сбрасываемыми, а также любые аккумуляторы, от которых они зависят.После того, как мы внедрили аккумулятор, мы должны определить для него функцию, чтобы пользователи могли указать функцию при объявлении<accumulator_set<>
>. Обычно мы помещаем функции в вложенное пространство имен, чтобы позже мы могли определить экстрактор с тем же названием. Все функции должны соответствоватьFeature Concept. Использование<depends_on<>
>делает удовлетворение концепции простым. Ниже приведен пример определения характеристик.
namespace boost { namespace accumulators { namespace tag { struct mean // Features should inherit from : depends_on< count, sum > // depends_on<> to specify dependencies { // Define a nested typedef called 'impl' that specifies which // accumulator implements this feature. typedef accumulators::impl::mean_accumulator< mpl::_1 > impl; }; }}}
Единственные две вещи, которые мы должны сделать, чтобы определить функцию<mean
>, это указать зависимости с<depends_on<>
>и определить вложенный<impl
>типдеф. Даже черты, не имеющие зависимостей, должны наследоваться от<depends_on<>
>. Вложенный<impl
>тип должен бытьMPL Lambda Expression. Результатом<mpl::apply<impl,
должен быть тип аккумулятора, который реализует эту функцию. ИспользованиеMPLзаполнителей, таких как<sample-type
>,<weight-type
>>::типаmpl::_1
>, делает особенно легким создание шаблона, такого как<mean_accumulator<>
>MPL Lambda Expression. Здесь<mpl::_1
>будет заменен типом образца. Если бы мы использовали<mpl::_2
>, он был бы заменен на весовой тип.
Как насчет типов аккумуляторов, которые не являются шаблонами? Если у вас есть<foo_accumulator
>, который является простой структурой, а не шаблоном, вы можете превратить его вMPL Lambda Expression, используя<mpl::always<>
>, например:
// An MPL lambda expression that always evaluates to // foo_accumulator: typedef mpl::always< foo_accumulator > impl;
Если вы когда-либо не уверены, или если вам не нравится выражение лямбда MPL, вы всегда можете четко определить<impl
>:
// Same as 'typedef mpl::always< foo_accumulator > impl;' struct impl { template< typename Sample, typename Weight > struct apply { typedef foo_accumulator type; }; };
Здесь<impl
>представляет собой двоичныйMPL Metafunction Class, который является своего родаMPL Lambda Expression. Вложенный<apply<>
>шаблон является частью протокола класса метафункций и сообщает MPL, как построить тип аккумулятора с учетом типов образца и веса.
Все функции также должны обеспечивать вложенный<is_weight_accumulator
>типдеф. Он должен быть либо<mpl::true_
>, либо<mpl::false_
>.<depends_on<>
>обеспечивает по умолчанию<mpl::false_
>для всех признаков, которые наследуются от него, но которые могут быть переопределены (или скрыты, технически говоря) в производном типе. Когда функция представляет собой накопление информации о весах вместо образцов, мы можем отметить эту функцию как таковую<typedef
mpl::true_is_weight_accumulator;
>. Аккумуляторы веса изготавливаются внешними, если тип веса указан с использованием шаблона<external<>
>.
Теперь, когда у нас есть аккумулятор и функция, единственное, чего не хватает, — это способ получить результаты от набора аккумуляторов. Система аккумуляторов предоставляет шаблон класса<extractor<>
>, чтобы упростить определение экстрактора для вашей функции. Вот вытяжка для функции<mean
>, которую мы определили выше:
namespace boost { namespace accumulators { // By convention, we put extractors namespace extract { // in the 'extract' namespace extractor< tag::mean > const mean = {}; // Simply define our extractor with // our feature tag, like this. } using extract::mean; // Pull the extractor into the // enclosing namespace. }}
После определения<mean
>экстрактор может быть использован для извлечения результата<tag::mean
>признака из<accumulator_set<>
>.
Параметризованные особенности усложняют эту простую картину. Рассмотрим функцию<moment
>для вычисления<N
>-го момента, где<N
>указан в качестве параметра шаблона:
// An accumulator set for calculating the N-th moment, for N == 2 ... accumulator_set< double, features< tag::moment<2> > > acc; // ... add some data ... // Display the 2nd moment ... std::cout << "2nd moment is " << accumulators::moment<2>(acc) << std::endl;
Что такое<accumulators::moment<2>(acc)
>, что такое<moment
>? Он не может быть объектом — синтаксис C++ не позволяет этого. Очевидно, что если мы хотим предоставить этот синтаксис, мы должны сделать<moment
>шаблон функции. Вот как выглядит определение экстрактора<moment
>:
namespace boost { namespace accumulators { // By convention, we put extractors namespace extract { // in the 'extract' namespace template<int N, typename AccumulatorSet> typename mpl::apply<AccumulatorSet, tag::moment<N> >::type::result_type moment(AccumulatorSet const &acc) { return extract_result<tag::moment<N> >(acc); } } using extract::moment; // Pull the extractor into the // enclosing namespace. }}
Тип возврата заслуживает некоторых объяснений. Каждый<accumulator_set<>
>тип на самом деле является унарнымMPL метафункциональным классом. Когда вы<mpl::apply<>
>a<accumulator_set<>
>и функция, результатом является тип аккумулятора в наборе, который реализует эту функцию. И каждый аккумулятор обеспечивает вложенный<result_type
>типдеф, который сообщает, каков его тип возврата. Экстрактор просто делегирует свою работу функции<extract_result()
>.
Разрешение зависимостей на основе функций Accumulators Framework предназначено для обеспечения нескольких различных стратегий реализации для каждой функции. Например, два разных аккумулятора могут вычислять одну и ту же величину с различными режимами округления или с использованием различных алгоритмов с различными соотношениями размера и скорости. Другие аккумуляторы, которые зависят от этого количества, не должны заботиться о том, как оно рассчитывается. Накопители Framework обрабатывает это, позволяя нескольким различным аккумуляторам удовлетворять одной и той же функции.
Отчуждение зависимостей признаков<feature_of<>
>
Представьте, что вы хотите реализовать гипотетическуюстатистику фубараи что вы знаете два способа вычисления фубара на куче образцов: точный, но медленный расчет и приблизительный, но быстрый расчет. Вы можете выбрать точный расчет по умолчанию, поэтому вы реализуете два аккумулятора и называете их<impl::fubar_impl
>и<impl::fast_fubar_impl
>. Вы также можете определить<tag::fubar
>и<tag::fast_fubar
>функции, как описановыше. Теперь вы хотите сообщить Accumulators Framework, что эти две функции одинаковы с точки зрения разрешения зависимости. Вы можете сделать это с помощью<feature_of<>
>:
namespace boost { namespace accumulators { // For the purposes of feature-based dependency resolution, // fast_fubar provides the same feature as fubar template<> struct feature_of<tag::fast_fubar> : feature_of<tag::fubar> { }; }}
Вышеприведенный код инструктирует Accumulators Framework, что, если другой аккумулятор в наборе зависит от функции<tag::fubar
>, функция<tag::fast_fubar
>является приемлемой заменой.
Регистрация вариантов с<as_feature<>
>
Возможно, вы заметили, что некоторые варианты функций в Accumulators Framework могут быть указаны с более приятным синтаксисом. Например, вместо<tag::mean
>и<tag::immediate_mean
>вы можете указать их<tag::mean(lazy)
>и<tag::mean(immediate)
>соответственно. Это просто псевдонимы, но синтаксис делает отношения между ними более ясными. Вы можете создать эти псевдонимы с чертой<as_feature<>
>. В этом случае вы можете выбрать<tag::fubar(accurate)
>с<tag::fubar
>и<tag::fubar(fast)
>с<tag::fast_fubar
>. Вы сделаете это следующим образом:
namespace boost { namespace accumulators { struct fast {}; // OK to leave these tags empty struct accurate {}; template<> struct as_feature<tag::fubar(accurate)> { typedef tag::fubar type; }; template<> struct as_feature<tag::fubar(fast)> { typedef tag::fast_fubar type; }; }}
После того, как вы это сделаете, пользователи вашего аккумулятора могут запросить функции<tag::fubar(fast)
>и<tag::fubar(accurate)
>при определении их<accumulator_set
>и получить правильный аккумулятор.
В этом разделе описывается, как адаптировать сторонние числовые типы для работы с Accumulator Framework.
Вместо того, чтобы полагаться на встроенных операторов, Accumulators Framework полагается на функции и перегрузки операторов, определенные вподбиблиотеке числовых операторовдля многих своих числовых операций. Это позволяет придавать арифметическим операциям нестандартные значения. Например, при вычислении среднего путем деления двух целых чисел стандартное поведение целочисленного деления было бы математически неправильным для большинства статистических величин. Таким образом, вместо использования<x/y
>, структура аккумуляторов использует<numeric::fdiv(x,y)
>, которая делает деление с плавающей точкой, даже если оба<x
>и<y
>являются целыми числами.
Другой пример, когда подбиблиотека числовых операторов полезна, это когда тип не определяет перегрузки оператора, необходимые для использования его для некоторых статистических расчетов. Например,<std::vector<>
>не перегружает никаких арифметических операторов, но может быть полезно использовать<std::vector<>
>в качестве образца или вариантного типа. Подбиблиотека числовых операторов определяет необходимые операторские перегрузки в пространстве имен<boost::numeric::operators
>, которые вводятся в область применения Рамками аккумуляторов с помощью директивы.
Объекты числовых функций и диспетчеризация меток
Как объект числовой функции, определяемый подбиблиотекой числовых операторов, работает с такими типами, как<std::vector<>
>? Свободные функции в пространстве имен<boost::numeric
>реализуются в терминах объектов функций в пространстве имен<boost::numeric::functional
>, поэтому для того, чтобы заставить<boost::numeric::fdiv()
>сделать что-то разумное с<std::vector<>
>, например, нам потребуется частично специализировать объект функции<boost::numeric::functional::fdiv<>
>.
Функциональные объекты используют технику, известную как.отправка метокдля выбора правильной реализации для заданных операндов. Он работает следующим образом:
namespace boost { namespace numeric { namespace functional { // Metafunction for looking up the tag associated with // a given numeric type T. template<typename T> struct tag { // by default, all types have void as a tag type typedef void type; }; // Forward declaration looks up the tag types of each operand template< typename Left , typename Right , typename LeftTag = typename tag<Left>::type , typename RightTag = typename tag<Right>::type > struct fdiv; }}}
Если у вас есть определенный пользователем тип<MyDouble
>, для которого вы хотели бы настроить поведение<numeric::fdiv()
>, вы бы специализировались<numeric::functional::fdiv<>
>, сначала определив тип тега, как показано ниже:
namespace boost { namespace numeric { namespace functional { // Tag type for MyDouble struct MyDoubleTag {}; // Specialize tag<> for MyDouble. // This only needs to be done once. template<> struct tag<MyDouble> { typedef MyDoubleTag type; }; // Specify how to divide a MyDouble by an integral count template<typename Left, typename Right> struct fdiv<Left, Right, MyDoubleTag, void> { // Define the type of the result typedef ... result_type; result_type operator()(Left & left, Right & right) const { return ...; } }; }}}
Как только вы это сделаете,<numeric::fdiv()
>будет использовать вашу специализацию<numeric::functional::fdiv<>
>, когда первый аргумент является<MyDouble
>объектом. Все функциональные объекты в подбиблиотеке числовых операторов могут быть настроены аналогичным образом.
В следующей таблице<Acc
>является типом аккумулятора,<acc
>и<acc2
>являются объектами типа<Acc
>, а<args
>является названием набора аргументов из библиотекиBoost.Parameter.
Table 1.2. Accumulator Requirements
Выражение |
Тип возврата |
Утверждение/Примечание/Предварительное/Пост-условие |
---|---|---|
< | реализация определена | |
< | Нет | Построение из набора аргументов. |
Acc acc(acc2) | Нет | Пост:< |
< | неуказанный | |
< | неуказанный | |
< | < |
В следующей таблице<F
>— тип признака, а<S
>— некоторый скалярный тип.
Table 1.3. Feature Requirements
Выражение |
Тип возврата |
Утверждение/Примечание/Предварительное/Пост-условие |
---|---|---|
< | неуказанный | Последовательность MPL других признаков, от которых зависит< |
< | < | < |
< | неуказанный | MPL Lambda ExpressionMPL Lambda Expressionвозвращает тип аккумулятора, который реализует эту функцию при прохождении типа образца и типа веса. |
Библиотека статистических накопителей определяет аккумуляторы для дополнительных статистических вычислений. Он построен на вершине. Структура аккумулятора.
Функция<count
>представляет собой простой счетчик, который отслеживает количество образцов, выталкиваемых в набор аккумулятора.
std::size_t
none
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/count.hpp
>
Пример
accumulator_set<int, features<tag::count> > acc; acc(0); acc(0); acc(0); assert(3 == count(acc));
См. также
Функция<covariance
>является итеративной оценкой Монте-Карло для ковариации. Он указан как<tag::covariance<
.variate-type
>,<variate-tag
>>
numeric::functional::outer_product< numeric::functional::fdiv<sample-type
, std::size_t>::result_type , numeric::functional::fdiv<variate-type
, std::size_t>::result_type >::result_type
count
mean
mean_of_variates<
variate-type
, variate-tag
>
abstract_covariance
none
variate-tag
none
ТОДО
O(1)
Заголовки
#include <boost/accumulators/statistics/covariance.hpp
> #include <boost/accumulators/statistics/variates/covariate.hpp
>
Пример
accumulator_set<double, stats<tag::covariance<double, tag::covariate1> > > acc; acc(1., covariate1 = 2.); acc(1., covariate1 = 4.); acc(2., covariate1 = 3.); acc(6., covariate1 = 1.); assert(covariance(acc) == -1.75);
См. также
Функция<tag::density
>возвращает гистограмму распределения образца. Подробнее о реализации см.<density_impl
>.
iterator_range< std::vector< std::pair< numeric::functional::fdiv<sample-type
, std::size_t>::result_type , numeric::functional::fdiv<sample-type
, std::size_t>::result_type > >::iterator >
count
min
max
none
density::cache_size
density::num_bins
none
none
ТОДО
O(N), when N is density::num_bins
Заголовок
#include <boost/accumulators/statistics/density.hpp
>
Примечание
Результаты от<density
>аккумулятора могут быть извлечены только после того, как количество образцов соответствует или превышает размер кэша.
См. также
Функция<error_of<mean>
>вычисляет погрешность средней функции. Она равна<sqrt(variance/
(count
-1))
>.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
count
variance
error_of<immediate_mean>
none
none
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/error_of.hpp
> #include <boost/accumulators/statistics/error_of_mean.hpp
>
Пример
accumulator_set<double, stats<tag::error_of<tag::mean> > > acc; acc(1.1); acc(1.2); acc(1.3); assert(0.057735 == error_of<tag::mean>(acc));
См. также
Оценка множественного квантиля с помощью расширенного алгоритма<P^2
>. Подробнее см.<extended_p_square_impl
>.
boost::iterator_range<
implementation-defined
>
count
none
tag::extended_p_square::probabilities
none
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/extended_p_square.hpp
>
Пример
boost::array<double> probs = {0.001,0.01,0.1,0.25,0.5,0.75,0.9,0.99,0.999}; accumulator_set<double, stats<tag::extended_p_square> > acc(tag::extended_p_square::probabilities = probs); boost::lagged_fibonacci607 rng; // a random number generator for (int i=0; i<10000; ++i) acc(rng()); BOOST_CHECK_CLOSE(extended_p_square(acc)[0], probs[0], 25); BOOST_CHECK_CLOSE(extended_p_square(acc)[1], probs[1], 10); BOOST_CHECK_CLOSE(extended_p_square(acc)[2], probs[2], 5); for (std::size_t i=3; i < probs.size(); ++i) { BOOST_CHECK_CLOSE(extended_p_square(acc)[i], probs[i], 2); }
См. также
Количественная оценка с использованием расширенного алгоритма<P^2
>для взвешенных и невзвешенных образцов. По умолчанию расчет линейный и невзвешенный, но также предусмотрены квадратичные и взвешенные варианты. Подробнее о реализации см.<extended_p_square_quantile_impl
>.
Все варианты имеют общую функцию<tag::quantile
>и могут быть извлечены с помощью экстрактора<quantile()
>.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
weighted variants depend on weighted_extended_p_square
unweighted variants depend on extended_p_square
extended_p_square_quantile_quadratic
weighted_extended_p_square_quantile
weighted_extended_p_square_quantile_quadratic
tag::extended_p_square::probabilities
<weight
>для взвешенных вариантов
quantile_probability
ТОДО
O(N) где N — число вероятностей.
Заголовок
#include <boost/accumulators/statistics/extended_p_square_quantile.hpp
>
Пример
typedef accumulator_set<double, stats<tag::extended_p_square_quantile> > accumulator_t; typedef accumulator_set<double, stats<tag::weighted_extended_p_square_quantile>, double > accumulator_t_weighted; typedef accumulator_set<double, stats<tag::extended_p_square_quantile(quadratic)> > accumulator_t_quadratic; typedef accumulator_set<double, stats<tag::weighted_extended_p_square_quantile(quadratic)>, double > accumulator_t_weighted_quadratic; // tolerance double epsilon = 1; // a random number generator boost::lagged_fibonacci607 rng; boost::array<double> probs = { 0.990, 0.991, 0.992, 0.993, 0.994, 0.995, 0.996, 0.997, 0.998, 0.999 }; accumulator_t acc(extended_p_square_probabilities = probs); accumulator_t_weighted acc_weighted(extended_p_square_probabilities = probs); accumulator_t_quadratic acc2(extended_p_square_probabilities = probs); accumulator_t_weighted_quadratic acc_weighted2(extended_p_square_probabilities = probs); for (int i=0; i<10000; ++i) { double sample = rng(); acc(sample); acc2(sample); acc_weighted(sample, weight = 1.); acc_weighted2(sample, weight = 1.); } for (std::size_t i = 0; i < probs.size() - 1; ++i) { BOOST_CHECK_CLOSE( quantile(acc, quantile_probability = 0.99025 + i*0.001) , 0.99025 + i*0.001 , epsilon ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.99025 + i*0.001) , 0.99025 + i*0.001 , epsilon ); BOOST_CHECK_CLOSE( quantile(acc_weighted, quantile_probability = 0.99025 + i*0.001) , 0.99025 + i*0.001 , epsilon ); BOOST_CHECK_CLOSE( quantile(acc_weighted2, quantile_probability = 0.99025 + i*0.001) , 0.99025 + i*0.001 , epsilon ); }
См. также
numeric::functional::fdiv<sample-type
,sample-type
>::result_type
mean
moment<2>
moment<3>
moment<4>
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/kurtosis.hpp
>
Пример
accumulator_set<int, stats<tag::kurtosis > > acc; acc(2); acc(7); acc(4); acc(9); acc(3); BOOST_CHECK_EQUAL( mean(acc), 5 ); BOOST_CHECK_EQUAL( accumulators::moment<2>(acc), 159./5. ); BOOST_CHECK_EQUAL( accumulators::moment<3>(acc), 1171./5. ); BOOST_CHECK_EQUAL( accumulators::moment<4>(acc), 1863 ); BOOST_CHECK_CLOSE( kurtosis(acc), -1.39965397924, 1e-6 );
См. также
Вычисляет максимальное значение всех образцов.
sample-type
none
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/max.hpp
>
Пример
accumulator_set<int, stats<tag::max> > acc; acc(1); BOOST_CHECK_EQUAL(1, (max)(acc)); acc(0); BOOST_CHECK_EQUAL(1, (max)(acc)); acc(2); BOOST_CHECK_EQUAL(2, (max)(acc));
См. также
Вычисляет среднее значение образцов, весов или вариаций. Расчет либо ленивый (в результате экстрактор), либо немедленный (в аккумуляторе). Ленивая реализация — это дефолт. Более подробную информацию о реализации см. в<mean_impl
>или<immediate_mean_impl
>.
For samples, numeric::functional::fdiv<
sample-type
, std::size_t>::result_type
For weights,
numeric::functional::fdiv<
weight-type
, std::size_t>::result_type
For variates, numeric::functional::fdiv<
variate-type
, std::size_t>::result_type
count
The
lazy mean of samples depends on sum
The lazy mean of weights depends on sum_of_weights
The lazy mean of variates depends on sum_of_variates<>
mean_of_weights
mean_of_variates<
variate-type
, variate-tag
>
immediate_mean
immediate_mean_of_weights
immediate_mean_of_variates<
variate-type
, variate-tag
>
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/mean.hpp
>
Пример
accumulator_set< int , stats< tag::mean , tag::mean_of_weights , tag::mean_of_variates<int, tag::covariate1> > , int > acc; acc(1, weight = 2, covariate1 = 3); BOOST_CHECK_CLOSE(1., mean(acc), 1e-5); BOOST_CHECK_EQUAL(1u, count(acc)); BOOST_CHECK_EQUAL(2, sum(acc)); BOOST_CHECK_CLOSE(2., mean_of_weights(acc), 1e-5); BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates<int, tag::covariate1>(acc)), 1e-5); acc(0, weight = 4, covariate1 = 4); BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc), 1e-5); BOOST_CHECK_EQUAL(2u, count(acc)); BOOST_CHECK_EQUAL(2, sum(acc)); BOOST_CHECK_CLOSE(3., mean_of_weights(acc), 1e-5); BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates<int, tag::covariate1>(acc)), 1e-5); acc(2, weight = 9, covariate1 = 8); BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc), 1e-5); BOOST_CHECK_EQUAL(3u, count(acc)); BOOST_CHECK_EQUAL(20, sum(acc)); BOOST_CHECK_CLOSE(5., mean_of_weights(acc), 1e-5); BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates<int, tag::covariate1>(acc)), 1e-5); accumulator_set< int , stats< tag::mean(immediate) , tag::mean_of_weights(immediate) , tag::mean_of_variates<int, tag::covariate1>(immediate) > , int > acc2; acc2(1, weight = 2, covariate1 = 3); BOOST_CHECK_CLOSE(1., mean(acc2), 1e-5); BOOST_CHECK_EQUAL(1u, count(acc2)); BOOST_CHECK_CLOSE(2., mean_of_weights(acc2), 1e-5); BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates<int, tag::covariate1>(acc2)), 1e-5); acc2(0, weight = 4, covariate1 = 4); BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc2), 1e-5); BOOST_CHECK_EQUAL(2u, count(acc2)); BOOST_CHECK_CLOSE(3., mean_of_weights(acc2), 1e-5); BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates<int, tag::covariate1>(acc2)), 1e-5); acc2(2, weight = 9, covariate1 = 8); BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc2), 1e-5); BOOST_CHECK_EQUAL(3u, count(acc2)); BOOST_CHECK_CLOSE(5., mean_of_weights(acc2), 1e-5); BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates<int, tag::covariate1>(acc2)), 1e-5);
См. также
Медианная оценка на основе<P^2
>квантильной оценки, оценки плотности или<P^2
>кумулятивной оценки распределения. Более подробную информацию о реализации см.<median_impl
>,<with_density_median_impl
>и<with_p_square_cumulative_distribution_median_impl
>.
Все три средних аккумулятора удовлетворяют характеристике<tag::median
>и могут быть извлечены с помощью<median()
>экстрактора.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
median
depends on
p_square_quantile_for_median
with_density_median
depends on count
and density
with_p_square_cumulative_distribution_median
depends on p_square_cumulative_distribution
with_density_median
with_p_square_cumulative_distribution_median
with_density_median
requires tag::density::cache_size
and tag::density::num_bins
with_p_square_cumulative_distribution_median
requires tag::p_square_cumulative_distribution::num_cells
none
none
ТОДО
ТОДО
Заголовок
#include <boost/accumulators/statistics/median.hpp
>
Пример
// two random number generators double mu = 1.; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma(mu,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma); accumulator_set<double, stats<tag::median(with_p_square_quantile) > > acc; accumulator_set<double, stats<tag::median(with_density) > > acc_dens( density_cache_size = 10000, density_num_bins = 1000 ); accumulator_set<double, stats<tag::median(with_p_square_cumulative_distribution) > > acc_cdist( p_square_cumulative_distribution_num_cells = 100 ); for (std::size_t i=0; i<100000; ++i) { double sample = normal(); acc(sample); acc_dens(sample); acc_cdist(sample); } BOOST_CHECK_CLOSE(1., median(acc), 1.); BOOST_CHECK_CLOSE(1., median(acc_dens), 1.); BOOST_CHECK_CLOSE(1., median(acc_cdist), 3.);
См. также
Вычисляет минимальное значение всех образцов.
sample-type
none
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/min.hpp
>
Пример
accumulator_set<int, stats<tag::min> > acc; acc(1); BOOST_CHECK_EQUAL(1, (min)(acc)); acc(0); BOOST_CHECK_EQUAL(0, (min)(acc)); acc(2); BOOST_CHECK_EQUAL(0, (min)(acc));
См. также
Вычисляет N-й момент образцов, который определяется как сумма N-й мощности образцов над количеством образцов.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
count
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/moment.hpp
>
Пример
accumulator_set<int, stats<tag::moment<2> > > acc1; acc1(2); // 4 acc1(4); // 16 acc1(5); // + 25 // = 45 / 3 = 15 BOOST_CHECK_CLOSE(15., accumulators::moment<2>(acc1), 1e-5); accumulator_set<int, stats<tag::moment<5> > > acc2; acc2(2); // 32 acc2(3); // 243 acc2(4); // 1024 acc2(5); // + 3125 // = 4424 / 4 = 1106 BOOST_CHECK_CLOSE(1106., accumulators::moment<5>(acc2), 1e-5);
См. также
count
Расчет гистограммы кумулятивного распределения с помощью алгоритма<P^2
>. Подробнее о реализации см.<p_square_cumulative_distribution_impl
>
iterator_range< std::vector< std::pair< numeric::functional::fdiv<sample-type
, std::size_t>::result_type , numeric::functional::fdiv<sample-type
, std::size_t>::result_type > >::iterator >
count
none
tag::p_square_cumulative_distribution::num_cells
none
none
ТОДО
O(N) where N is num_cells
Заголовок
#include <boost/accumulators/statistics/p_square_cumul_dist.hpp
>
Пример
// tolerance in % double epsilon = 3; typedef accumulator_set<double, stats<tag::p_square_cumulative_distribution> > accumulator_t; accumulator_t acc(tag::p_square_cumulative_distribution::num_cells = 100); // two random number generators boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma(0,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma); for (std::size_t i=0; i<100000; ++i) { acc(normal()); } typedef iterator_range<std::vector<std::pair<double, double> >::iterator > histogram_type; histogram_type histogram = p_square_cumulative_distribution(acc); for (std::size_t i = 0; i < histogram.size(); ++i) { // problem with small results: epsilon is relative (in percent), not absolute! if ( histogram[i].second > 0.001 ) BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram[i].first / sqrt(2.0) )), histogram[i].second, epsilon ); }
См. также
Единый квантиль с алгоритмом<P^2
>. Подробнее о реализации см.<p_square_quantile_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
count
p_square_quantile_for_median
<quantile_probability
>, который не соответствует<0.5
>. (Примечание: для<p_square_quantile_for_median
>параметр<quantile_probability
>игнорируется и всегда<0.5
>.)
none
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/p_square_quantile.hpp
>
Пример
typedef accumulator_set<double, stats<tag::p_square_quantile> > accumulator_t; // tolerance in % double epsilon = 1; // a random number generator boost::lagged_fibonacci607 rng; accumulator_t acc0(quantile_probability = 0.001); accumulator_t acc1(quantile_probability = 0.01 ); accumulator_t acc2(quantile_probability = 0.1 ); accumulator_t acc3(quantile_probability = 0.25 ); accumulator_t acc4(quantile_probability = 0.5 ); accumulator_t acc5(quantile_probability = 0.75 ); accumulator_t acc6(quantile_probability = 0.9 ); accumulator_t acc7(quantile_probability = 0.99 ); accumulator_t acc8(quantile_probability = 0.999); for (int i=0; i<100000; ++i) { double sample = rng(); acc0(sample); acc1(sample); acc2(sample); acc3(sample); acc4(sample); acc5(sample); acc6(sample); acc7(sample); acc8(sample); } BOOST_CHECK_CLOSE( p_square_quantile(acc0), 0.001, 15*epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc1), 0.01 , 5*epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc2), 0.1 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc3), 0.25 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc4), 0.5 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc5), 0.75 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc6), 0.9 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc7), 0.99 , epsilon ); BOOST_CHECK_CLOSE( p_square_quantile(acc8), 0.999, epsilon );
См. также
Метод Peaks Over Threshold для квантиля и хвоста означает оценку. Подробности реализации см. в<peaks_over_threshold_impl
>и<peaks_over_threshold_prob_impl
>.
Как<tag::peaks_over_threshold
>, так и<tag::peaks_over_threshold_prob<>
>удовлетворяют<tag::abstract_peaks_over_threshold
>признаку и могут быть извлечены с помощью<peaks_over_threshold()
>экстрактора. В результате получается 3-х трубка, представляющая параметры соответствия<u_bar
>,<beta_bar
>и<xi_hat
>.
boost::tuple< numeric::functional::fdiv<sample-type
, std::size_t>::result_type // u_bar , numeric::functional::fdiv<sample-type
, std::size_t>::result_type // beta_bar , numeric::functional::fdiv<sample-type
, std::size_t>::result_type // xi_hat >
count
In addition,
tag::peaks_over_threshold_prob<>
depends on tail<
left-or-right
>
peaks_over_threshold_prob<
left-or-right
>
tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<
left-or-right
>::cache_size
none
none
ТОДО
ТОДО
Заголовок
#include <boost/accumulators/statistics/peaks_over_threshold.hpp
>
Пример
См. пример<pot_quantile
>.
См. также
Количественная оценка основана на методе Peaks over Threshold (как для левого, так и для правого хвоста). Подробности реализации см.<pot_quantile_impl
>.
Оба<tag::pot_quantile<
и<left-or-right
>>tag::pot_quantile_prob<
удовлетворяют<left-or-right
>>tag::quantile
>признаку и могут быть извлечены с помощью<quantile()
>экстрактора.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
pot_quantile_prob<
зависит от left-or-right
>peaks_over_threshold_prob<
left-or-right
>
pot_quantile_prob<
left-or-right
>
tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
ТОДО
ТОДО
Заголовок
#include <boost/accumulators/statistics/pot_quantile.hpp
>
Пример
// tolerance in % double epsilon = 1.; double alpha = 0.999; double threshold_probability = 0.99; double threshold = 3.; // two random number generators boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma(0,1); boost::exponential_distribution<> lambda(1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma); boost::variate_generator<boost::lagged_fibonacci607&, boost::exponential_distribution<> > exponential(rng, lambda); accumulator_set<double, stats<tag::pot_quantile<right>(with_threshold_value)> > acc1( tag::peaks_over_threshold::threshold_value = threshold ); accumulator_set<double, stats<tag::pot_quantile<right>(with_threshold_probability)> > acc2( tag::tail<right>::cache_size = 2000 , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability ); threshold_probability = 0.995; threshold = 5.; accumulator_set<double, stats<tag::pot_quantile<right>(with_threshold_value)> > acc3( tag::peaks_over_threshold::threshold_value = threshold ); accumulator_set<double, stats<tag::pot_quantile<right>(with_threshold_probability)> > acc4( tag::tail<right>::cache_size = 2000 , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability ); for (std::size_t i = 0; i < 100000; ++i) { double sample = normal(); acc1(sample); acc2(sample); } for (std::size_t i = 0; i < 100000; ++i) { double sample = exponential(); acc3(sample); acc4(sample); } BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = alpha), 3.090232, epsilon ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = alpha), 3.090232, epsilon ); BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = alpha), 6.908, epsilon ); BOOST_CHECK_CLOSE( quantile(acc4, quantile_probability = alpha), 6.908, epsilon );
См. также
Оценка (когерентного) хвостового среднего на основе метода пиков над порогом (как для левого, так и для правого хвоста). Подробности реализации см.<pot_tail_mean_impl
>.
Оба<tag::pot_tail_mean<
и<left-or-right
>>tag::pot_tail_mean_prob<
удовлетворяют<left-or-right
>>tag::tail_mean
>признаку и могут быть извлечены с помощью<tail_mean()
>экстрактора.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
pot_tail_mean<
depends on left-or-right
>peaks_over_threshold<
and left-or-right
>pot_quantile<
left-or-right
>
pot_tail_mean_prob<
depends on left-or-right
>peaks_over_threshold_prob<
and left-or-right
>pot_quantile_prob<
left-or-right
>
pot_tail_mean_prob<
left-or-right
>
tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
ТОДО
ТОДО
Заголовок
#include <boost/accumulators/statistics/pot_tail_mean.hpp
>
Пример
// TODO
См. также
Подсчет качения - это текущее количество элементов в окне качения.
std::size_t
rolling_window_plus1
none
tag::rolling_window::window_size
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/rolling_count.hpp
>
Пример
accumulator_set<int, stats<tag::rolling_count> > acc(tag::rolling_window::window_size = 3); BOOST_CHECK_EQUAL(0u, rolling_count(acc)); acc(1); BOOST_CHECK_EQUAL(1u, rolling_count(acc)); acc(1); BOOST_CHECK_EQUAL(2u, rolling_count(acc)); acc(1); BOOST_CHECK_EQUAL(3u, rolling_count(acc)); acc(1); BOOST_CHECK_EQUAL(3u, rolling_count(acc)); acc(1); BOOST_CHECK_EQUAL(3u, rolling_count(acc));
См. также
Сумма качения является суммой последнихNобразцов.
sample-type
rolling_window_plus1
none
tag::rolling_window::window_size
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/rolling_sum.hpp
>
Пример
accumulator_set<int, stats<tag::rolling_sum> > acc(tag::rolling_window::window_size = 3); BOOST_CHECK_EQUAL(0, rolling_sum(acc)); acc(1); BOOST_CHECK_EQUAL(1, rolling_sum(acc)); acc(2); BOOST_CHECK_EQUAL(3, rolling_sum(acc)); acc(3); BOOST_CHECK_EQUAL(6, rolling_sum(acc)); acc(4); BOOST_CHECK_EQUAL(9, rolling_sum(acc)); acc(5); BOOST_CHECK_EQUAL(12, rolling_sum(acc));
См. также
Средняя скользящая средняя является средней по последнимNобразцам. Он вычисляется путем деления суммы качения на счет качения.
Ленивый или итеративный расчет среднего значения по последнимNобразцам. Ленивый расчет связан с<tag::lazy_rolling_mean
>признаком, а итеративный расчет (который является по умолчанию) с<tag::immediate_rolling_mean
>признаком. Оба могут быть извлечены с помощью экстрактора<tag::rolling_mean()
>. Для получения дополнительной информации о реализации см.<lazy_rolling_mean_impl
>и<immediate_rolling_mean_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
lazy_rolling_mean
depends on rolling_sum
and rolling_count
immediate_rolling_mean
depends on rolling_count
lazy_rolling_mean
(a.k.a. rolling_mean(lazy))
immediate_rolling_mean
(a.k.a. rolling_mean(immediate)
)
tag::rolling_window::window_size
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/rolling_mean.hpp
>
Пример
accumulator_set<int, stats<tag::rolling_mean> > acc(tag::rolling_window::window_size = 5); acc(1); acc(2); acc(3); BOOST_CHECK_CLOSE( rolling_mean(acc), 2.0, 1e-6 ); acc(4); acc(5); acc(6); acc(7); BOOST_CHECK_CLOSE( rolling_mean(acc), 5.0, 1e-6 );
См. также
rolling_moment
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
none
none
tag::rolling_window::window_size
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/rolling_moment.hpp
>
Пример
accumulator_set<int, stats<tag::rolling_moment<2> > > acc(tag::rolling_window::window_size = 3); acc(2); acc(4); BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (4.0 + 16.0)/2, 1e-5 ); acc(5); acc(6); BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (16.0 + 25.0 + 36.0)/3, 1e-5 );
См. также
Ленивый или итеративный расчет дисперсии по последнимNобразцам. С ленивым вычислением связан<tag::lazy_rolling_variance
>признак, а с итеративным вычислением —<tag::immediate_rolling_variance
>признак. Оба могут быть извлечены с помощью<tag::rolling_variance()
>экстрактора. Более подробную информацию о реализации см.<lazy_rolling_variance_impl
>и<immediate_rolling_variance_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
lazy_rolling_variance
depends on rolling_moment<2>
, rolling_count
and rolling_mean
immediate_rolling_variance
depends on rolling_count
and immediate_rolling_mean
<lazy_rolling_variance
>(a.k.a.<rolling_variance(lazy))
>
<immediate_rolling_variance
>(a.k.a.<rolling_variance(immediate)
>)
tag::rolling_window::window_size
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/rolling_variance.hpp
>
Пример
accumulator_set<double, stats<tag::rolling_variance> > acc(tag::rolling_window::window_size = 4); acc(1.2); BOOST_CHECK_CLOSE( rolling_variance(acc), 0.0, 1e-10 ); // variance is not defined for a single sample acc(2.3); acc(3.4); BOOST_CHECK_CLOSE( rolling_variance(acc), 1.21, 1e-10 ); // variance over samples 1-3 acc(4.5); acc(0.4); acc(2.2); acc(7.1); BOOST_CHECK_CLOSE( rolling_variance(acc), 8.41666666666667, 1e-10 ); // variance over samples 4-7
См. также
Искаженность распределения выборки определяется как отношение 3-го центрального момента и<3/2
>- мощности 2-го центрального момента (разница) выборки. 3. Подробности осуществления см.<skewness_impl
>.
numeric::functional::fdiv<sample-type
,sample-type
>::result_type
mean
moment<2>
moment<3>
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/skewness.hpp
>
Пример
accumulator_set<int, stats<tag::skewness > > acc2; acc2(2); acc2(7); acc2(4); acc2(9); acc2(3); BOOST_CHECK_EQUAL( mean(acc2), 5 ); BOOST_CHECK_EQUAL( accumulators::moment<2>(acc2), 159./5. ); BOOST_CHECK_EQUAL( accumulators::moment<3>(acc2), 1171./5. ); BOOST_CHECK_CLOSE( skewness(acc2), 0.406040288214, 1e-6 );
См. также
Для суммирования образцов, весов или вариаций. Реализация по умолчанию использует стандартную операцию суммирования, но также предусмотрены варианты с использованием алгоритма суммирования Кахана.
<
для суммирования образцовsample-type
>
<
для суммирования весовweight-type
>
<
для суммирования вариацийvariate-type
>
none
tag::sum
tag::sum_of_weights
tag::sum_of_variates<
variate-type
, variate-tag
>
tag::sum_kahan
(a.k.a. tag::sum(kahan)
)
tag::sum_of_weights_kahan
(a.k.a. tag::sum_of_weights(kahan)
)
tag::sum_of_variates_kahan<
variate-type
, variate-tag
>
none
<weight
>для суммирования весов
<
для суммирования вариацийvariate-tag
>
none
О(1). Обратите внимание, что сумма Кахана выполняет четыре операции с плавающей точкой на накопленную стоимость, тогда как наивная сумма выполняет только одну.
O(1)
Заголовок
#include <boost/accumulators/statistics/sum.hpp
> #include <boost/accumulators/statistics/sum_kahan.hpp
>
Пример
accumulator_set< int , stats< tag::sum , tag::sum_of_weights , tag::sum_of_variates<int, tag::covariate1> > , int > acc; acc(1, weight = 2, covariate1 = 3); BOOST_CHECK_EQUAL(2, sum(acc)); // weighted sample = 1 * 2 BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); BOOST_CHECK_EQUAL(3, sum_of_variates(acc)); acc(2, weight = 4, covariate1 = 6); BOOST_CHECK_EQUAL(10, sum(acc)); // weighted sample = 2 * 4 BOOST_CHECK_EQUAL(6, sum_of_weights(acc)); BOOST_CHECK_EQUAL(9, sum_of_variates(acc)); acc(3, weight = 6, covariate1 = 9); BOOST_CHECK_EQUAL(28, sum(acc)); // weighted sample = 3 * 6 BOOST_CHECK_EQUAL(12, sum_of_weights(acc)); BOOST_CHECK_EQUAL(18, sum_of_variates(acc)); // demonstrate Kahan summation accumulator_set<float, stats<tag::sum_kahan> > acc; BOOST_CHECK_EQUAL(0.0f, sum_kahan(acc)); for (size_t i = 0; i < 1e6; ++i) { acc(1e-6f); } BOOST_CHECK_EQUAL(1.0f, sum_kahan(acc));
См. также
Отслеживает наибольшее или наименьшее значение<N
>.<tag::tail<right>
>отслеживает самый большой<N
>, и<tag::tail<left>
>отслеживает самый маленький. Параметр<N
>задан параметром<tag::tail<
параметра инициализации. Подробности реализации см.<left-or-right
>>::кэш_sizetail_impl
>.
<tag::tail<left>
>и<tag::tail<right>
>удовлетворяют<tag::abstract_tail
>признаку и могут быть извлечены с помощью<tail()
>экстрактора.
boost::iterator_range<
boost::reverse_iterator<
boost::permutation_iterator<
std::vector<sample-type
>::const_iterator // samples
, std::vector<std::size_t>::iterator // indices
>
>
>
none
abstract_tail
tag::tail<
left-or-right
>::cache_size
none
none
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail.hpp
>
Пример
См. пример<tail_variate
>.
См. также
Оценка когерентного хвостового среднего значения на основе статистики заказов (как для левого, так и для правого хвоста). Средняя характеристика левого когерентного хвоста<tag::coherent_tail_mean<left>
>, а средняя характеристика правого когерентного хвоста<tag::coherent_tail_mean<right>
>. Они оба обладают свойством<tag::tail_mean
>и могут быть извлечены с помощью<tail_mean()
>экстрактора. Подробнее о реализации см.<coherent_tail_mean_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
count
quantile
non_coherent_tail_mean<
left-or-right
>
none
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail_mean.hpp
>
Пример
См. пример<non_coherent_tail_mean
>.
См. также
Оценка (некогерентного) хвостового среднего на основе статистики заказов (как для левого, так и для правого хвоста). Средняя характеристика левого некогерентного хвоста<tag::non_coherent_tail_mean<left>
>, а средняя характеристика правого некогерентного хвоста<tag::non_coherent_tail_mean<right>
>. Они оба имеют свойство<tag::abstract_non_coherent_tail_mean
>и могут быть извлечены из<non_coherent_tail_mean()
>экстрактора. Подробнее о реализации см.<non_coherent_tail_mean_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
count
tail<
left-or-right
>
abstract_non_coherent_tail_mean
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail_mean.hpp
>
Пример
// tolerance in % double epsilon = 1; std::size_t n = 100000; // number of MC steps std::size_t c = 10000; // cache size typedef accumulator_set<double, stats<tag::non_coherent_tail_mean<right>, tag::tail_quantile<right> > > accumulator_t_right1; typedef accumulator_set<double, stats<tag::non_coherent_tail_mean<left>, tag::tail_quantile<left> > > accumulator_t_left1; typedef accumulator_set<double, stats<tag::coherent_tail_mean<right>, tag::tail_quantile<right> > > accumulator_t_right2; typedef accumulator_set<double, stats<tag::coherent_tail_mean<left>, tag::tail_quantile<left> > > accumulator_t_left2; accumulator_t_right1 acc0( right_tail_cache_size = c ); accumulator_t_left1 acc1( left_tail_cache_size = c ); accumulator_t_right2 acc2( right_tail_cache_size = c ); accumulator_t_left2 acc3( left_tail_cache_size = c ); // a random number generator boost::lagged_fibonacci607 rng; for (std::size_t i = 0; i < n; ++i) { double sample = rng(); acc0(sample); acc1(sample); acc2(sample); acc3(sample); } // check uniform distribution BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.01), 0.005, 5 ); BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 10 ); BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.95), 0.975, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.975), 0.9875, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.99), 0.995, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.999), 0.9995, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.05), 0.025, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.025), 0.0125, epsilon ); BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.01), 0.005, 5 ); BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.001), 0.0005, 10 );
См. также
sample-type
count
tail<
left-or-right
>
none
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail_quantile.hpp
>
Пример
// tolerance in % double epsilon = 1; std::size_t n = 100000; // number of MC steps std::size_t c = 10000; // cache size typedef accumulator_set<double, stats<tag::tail_quantile<right> > > accumulator_t_right; typedef accumulator_set<double, stats<tag::tail_quantile<left> > > accumulator_t_left; accumulator_t_right acc0( tag::tail<right>::cache_size = c ); accumulator_t_right acc1( tag::tail<right>::cache_size = c ); accumulator_t_left acc2( tag::tail<left>::cache_size = c ); accumulator_t_left acc3( tag::tail<left>::cache_size = c ); // two random number generators boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma(0,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma); for (std::size_t i = 0; i < n; ++i) { double sample1 = rng(); double sample2 = normal(); acc0(sample1); acc1(sample2); acc2(sample1); acc3(sample2); } // check uniform distribution BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.95 ), 0.95, epsilon ); BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.975), 0.975, epsilon ); BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.99 ), 0.99, epsilon ); BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.999), 0.999, epsilon ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.05 ), 0.05, 2 ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), 0.025, 2 ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.01 ), 0.01, 3 ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), 0.001, 20 ); // check standard normal distribution BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.025), -1.959963, epsilon ); BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.001), -3.090232, epsilon );
См. также
Отслеживает ковариаты самых больших или самых маленьких<N
>образцов.<tag::tail_variate<
отслеживает ковариат, связанный с<variate-type
>,<variate-tag
>,справа>variate-tag
>для самого большого<N
>и<tag::tail_variate<
для самого маленького. Параметр<variate-type
>,,слева>N
>задан параметром<tag::tail<
параметра инициализации. Подробности реализации см.<left-or-right
>>::кэш_sizetail_variate_impl
>.
Оба<tag::tail_variate<
и<variate-type
>,<variate-tag
>,справа>tag::tail_variate<
удовлетворяют<variate-type
>,<variate-tag
>,слева>tag::abstract_tail_variate
>признаку и могут быть извлечены из<tail_variate()
>экстрактора.
boost::iterator_range<
boost::reverse_iterator<
boost::permutation_iterator<
std::vector<variate-type
>::const_iterator // variates
, std::vector<std::size_t>::iterator // indices
>
>
>
tail<
left-or-right
>
abstract_tail_variate
tag::tail<
left-or-right
>::cache_size
none
none
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail_variate.hpp
>
Пример
accumulator_set<int, stats<tag::tail_variate<int, tag::covariate1, right> > > acc( tag::tail<right>::cache_size = 4 ); acc(8, covariate1 = 3); CHECK_RANGE_EQUAL(tail(acc), {8}); CHECK_RANGE_EQUAL(tail_variate(acc), {3}); acc(16, covariate1 = 1); CHECK_RANGE_EQUAL(tail(acc), {16, 8}); CHECK_RANGE_EQUAL(tail_variate(acc), {1, 3}); acc(12, covariate1 = 4); CHECK_RANGE_EQUAL(tail(acc), {16, 12, 8}); CHECK_RANGE_EQUAL(tail_variate(acc), {1, 4, 3}); acc(24, covariate1 = 5); CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); acc(1, covariate1 = 9); CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); acc(9, covariate1 = 7); CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 9}); CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 7});
См. также
Оценка абсолютного и относительного разновидностей хвоста (как для левого, так и для правого хвоста). Средство абсолютной хвостовой вариации имеет признак<tag::absolute_tail_variate_means<
, а относительное значение хвостовой вариации имеет признак<left-or-right
>,<variate-type
>,<variate-tag
>>tag::relative_tail_variate_means<
. Все абсолютные хвостовые средние характеристики имеют общую характеристику<left-or-right
>,,<variate-tag
>>tag::abstract_absolute_tail_variate_means
>и могут быть извлечены с помощью экстрактора<tail_variate_means()
>. Все относительные хвостовые средние характеристики имеют общую характеристику<tag::abstract_relative_tail_variate_means
>и могут быть извлечены с помощью экстрактора<relative_tail_variate_means()
>.
Подробнее о реализации см.<tail_variate_means_impl
>
boost::iterator_range<
std::vector<
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
>::iterator
>
non_coherent_tail_mean<
left-or-right
>
tail_variate<
variate-type
, variate-tag
, left-or-right
>
tag::absolute_tail_variate_means<
left-or-right
, variate-type
, variate-tag
>
tag::relative_tail_variate_means<
left-or-right
, variate-type
, variate-tag
>
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/tail_variate_means.hpp
>
Пример
std::size_t c = 5; // cache size typedef double variate_type; typedef std::vector<variate_type> variate_set_type; typedef accumulator_set<double, stats< tag::tail_variate_means<right, variate_set_type, tag::covariate1>(relative)>, tag::tail<right> > accumulator_t1; typedef accumulator_set<double, stats< tag::tail_variate_means<right, variate_set_type, tag::covariate1>(absolute)>, tag::tail<right> > accumulator_t2; typedef accumulator_set<double, stats< tag::tail_variate_means<left, variate_set_type, tag::covariate1>(relative)>, tag::tail<left> > accumulator_t3; typedef accumulator_set<double, stats< tag::tail_variate_means<left, variate_set_type, tag::covariate1>(absolute)>, tag::tail<left> > accumulator_t4; accumulator_t1 acc1( right_tail_cache_size = c ); accumulator_t2 acc2( right_tail_cache_size = c ); accumulator_t3 acc3( left_tail_cache_size = c ); accumulator_t4 acc4( left_tail_cache_size = c ); variate_set_type cov1, cov2, cov3, cov4, cov5; double c1[] = { 10., 20., 30., 40. }; // 100 double c2[] = { 26., 4., 17., 3. }; // 50 double c3[] = { 46., 64., 40., 50. }; // 200 double c4[] = { 1., 3., 70., 6. }; // 80 double c5[] = { 2., 2., 2., 14. }; // 20 cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); acc1(100., covariate1 = cov1); acc1( 50., covariate1 = cov2); acc1(200., covariate1 = cov3); acc1( 80., covariate1 = cov4); acc1( 20., covariate1 = cov5); acc2(100., covariate1 = cov1); acc2( 50., covariate1 = cov2); acc2(200., covariate1 = cov3); acc2( 80., covariate1 = cov4); acc2( 20., covariate1 = cov5); acc3(100., covariate1 = cov1); acc3( 50., covariate1 = cov2); acc3(200., covariate1 = cov3); acc3( 80., covariate1 = cov4); acc3( 20., covariate1 = cov5); acc4(100., covariate1 = cov1); acc4( 50., covariate1 = cov2); acc4(200., covariate1 = cov3); acc4( 80., covariate1 = cov4); acc4( 20., covariate1 = cov5); // check relative risk contributions BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), 14./75. ); // (10 + 46) / 300 = 14/75 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), 7./25. ); // (20 + 64) / 300 = 7/25 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), 7./30. ); // (30 + 40) / 300 = 7/30 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), 3./10. ); // (40 + 50) / 300 = 3/10 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), 14./35. ); // (26 + 2) / 70 = 14/35 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), 3./35. ); // ( 4 + 2) / 70 = 3/35 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), 19./70. ); // (17 + 2) / 70 = 19/70 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), 17./70. ); // ( 3 + 14) / 70 = 17/70 // check absolute risk contributions BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() ), 28 ); // (10 + 46) / 2 = 28 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), 42 ); // (20 + 64) / 2 = 42 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), 35 ); // (30 + 40) / 2 = 35 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), 45 ); // (40 + 50) / 2 = 45 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() ), 14 ); // (26 + 2) / 2 = 14 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), 3 ); // ( 4 + 2) / 2 = 3 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2),9.5 ); // (17 + 2) / 2 = 9.5 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3),8.5 ); // ( 3 + 14) / 2 = 8.5 // check relative risk contributions BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 23./100. ); // 46/200 = 23/100 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 8./25. ); // 64/200 = 8/25 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1./5. ); // 40/200 = 1/5 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1./4. ); // 50/200 = 1/4 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1./10. ); // 2/ 20 = 1/10 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1./10. ); // 2/ 20 = 1/10 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1./10. ); // 2/ 20 = 1/10 BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 7./10. ); // 14/ 20 = 7/10 // check absolute risk contributions BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 46 ); // 46 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 64 ); // 64 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 40 ); // 40 BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 50 ); // 50 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 2 ); // 2 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 2 ); // 2 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 2 ); // 2 BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 14 ); // 14
См. также
Ленивый или итеративный расчет дисперсии. Ленивый расчет связан с признаком<tag::lazy_variance
>и итеративный расчет с признаком<tag::variance
>. Оба могут быть извлечены с помощью экстрактора<tag::variance()
>. Подробнее о реализации см.<lazy_variance_impl
>и<variance_impl
>
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
tag::lazy_variance
depends on tag::moment<2>
and tag::mean
tag::variance
depends on tag::count
and tag::immediate_mean
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/variance.hpp
>
Пример
// lazy variance accumulator_set<int, stats<tag::variance(lazy)> > acc1; acc1(1); acc1(2); acc1(3); acc1(4); acc1(5); BOOST_CHECK_EQUAL(5u, count(acc1)); BOOST_CHECK_CLOSE(3., mean(acc1), 1e-5); BOOST_CHECK_CLOSE(11., accumulators::moment<2>(acc1), 1e-5); BOOST_CHECK_CLOSE(2., variance(acc1), 1e-5); // immediate variance accumulator_set<int, stats<tag::variance> > acc2; acc2(1); acc2(2); acc2(3); acc2(4); acc2(5); BOOST_CHECK_EQUAL(5u, count(acc2)); BOOST_CHECK_CLOSE(3., mean(acc2), 1e-5); BOOST_CHECK_CLOSE(2., variance(acc2), 1e-5);
См. также
Итеративная оценка Монте-Карло для взвешенной ковариации. Особенность указывается как<tag::weighted_covariance<
и извлекается с помощью<variate-type
>,<variate-tag
>>weighted_variate()
>экстрактора. Подробнее о реализации см.<weighted_covariance_impl
>
numeric::functional::outer_product< numeric::functional::multiplies<weight-type
, numeric::functional::fdiv<sample-type
, std::size_t>::result_type >::result_type , numeric::functional::multiplies<weight-type
, numeric::functional::fdiv<variate-type
, std::size_t>::result_type >::result_type>
count
sum_of_weights
weighted_mean
weighted_mean_of_variates<
variate-type
, variate-tag
>
abstract_weighted_covariance
none
weight
variate-tag
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_covariance.hpp
>
Пример
accumulator_set<double, stats<tag::weighted_covariance<double, tag::covariate1> >, double > acc; acc(1., weight = 1.1, covariate1 = 2.); acc(1., weight = 2.2, covariate1 = 4.); acc(2., weight = 3.3, covariate1 = 3.); acc(6., weight = 4.4, covariate1 = 1.); double epsilon = 1e-6; BOOST_CHECK_CLOSE(weighted_covariance(acc), -2.39, epsilon);
См. также
Функция<tag::weighted_density
>возвращает гистограмму распределения взвешенного образца. Подробнее о реализации см.<weighted_density_impl
>.
iterator_range< std::vector< std::pair< numeric::functional::fdiv<weight-type
, std::size_t>::result_type , numeric::functional::fdiv<weight-type
, std::size_t>::result_type > >::iterator>
count
sum_of_weights
min
max
none
tag::weighted_density::cache_size
tag::weighted_density::num_bins
weight
none
ТОДО
O(N), when N is weighted_density::num_bins
Заголовок
#include <boost/accumulators/statistics/weighted_density.hpp
>
См. также
Оценка множественного квантиля с помощью расширенного алгоритма<P^2
>для взвешенных образцов. Подробнее см.<weighted_extended_p_square_impl
>.
boost::iterator_range<
implementation-defined
>
count
sum_of_weights
none
tag::weighted_extended_p_square::probabilities
weight
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_extended_p_square.hpp
>
Пример
typedef accumulator_set<double, stats<tag::weighted_extended_p_square>, double> accumulator_t; // tolerance in % double epsilon = 1; // some random number generators double mu1 = -1.0; double mu2 = 1.0; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma1(mu1, 1); boost::normal_distribution<> mean_sigma2(mu2, 1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal1(rng, mean_sigma1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal2(rng, mean_sigma2); std::vector<double> probs_uniform, probs_normal1, probs_normal2, probs_normal_exact1, probs_normal_exact2; double p1[] = {/*0.001,*/ 0.01, 0.1, 0.5, 0.9, 0.99, 0.999}; probs_uniform.assign(p1, p1 + sizeof(p1) / sizeof(double)); double p2[] = {0.001, 0.025}; double p3[] = {0.975, 0.999}; probs_normal1.assign(p2, p2 + sizeof(p2) / sizeof(double)); probs_normal2.assign(p3, p3 + sizeof(p3) / sizeof(double)); double p4[] = {-3.090232, -1.959963}; double p5[] = {1.959963, 3.090232}; probs_normal_exact1.assign(p4, p4 + sizeof(p4) / sizeof(double)); probs_normal_exact2.assign(p5, p5 + sizeof(p5) / sizeof(double)); accumulator_t acc_uniform(tag::weighted_extended_p_square::probabilities = probs_uniform); accumulator_t acc_normal1(tag::weighted_extended_p_square::probabilities = probs_normal1); accumulator_t acc_normal2(tag::weighted_extended_p_square::probabilities = probs_normal2); for (std::size_t i = 0; i < 100000; ++i) { acc_uniform(rng(), weight = 1.); double sample1 = normal1(); double sample2 = normal2(); acc_normal1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); acc_normal2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); } // check for uniform distribution for (std::size_t i = 0; i < probs_uniform.size(); ++i) { BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_uniform)[i], probs_uniform[i], epsilon); } // check for standard normal distribution for (std::size_t i = 0; i < probs_normal1.size(); ++i) { BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal1)[i], probs_normal_exact1[i], epsilon); BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal2)[i], probs_normal_exact2[i], epsilon); }
См. также
Куртоз распределения образца определяется как отношение 4-го центрального момента и квадрата 2-го центрального момента (вариантность) образцов минус 3. Термин 1180 добавляется для того, чтобы гарантировать, что нормальное распределение имеет нулевой куртоз. Подробнее о реализации см.<weighted_kurtosis_impl
>
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , numeric::functional::multiplies<sample-type
,weight-type
>::result_type>::result_type
weighted_mean
weighted_moment<2>
weighted_moment<3>
weighted_moment<4>
none
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_kurtosis.hpp
>
Пример
accumulator_set<int, stats<tag::weighted_kurtosis>, int > acc2; acc2(2, weight = 4); acc2(7, weight = 1); acc2(4, weight = 3); acc2(9, weight = 1); acc2(3, weight = 2); BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); BOOST_CHECK_EQUAL( accumulators::weighted_moment<4>(acc2), 9956./11. ); BOOST_CHECK_CLOSE( weighted_kurtosis(acc2), 0.58137026432, 1e-6 );
См. также
Вычисляет средневзвешенное значение образцов или вариаций. Расчет либо ленивый (в результате экстрактор), либо немедленный (в аккумуляторе). Ленивая реализация — это дефолт. Более подробную информацию о реализации см. в<weighted_mean_impl
>или<immediate_weighted_mean_impl
>.
For samples, numeric::functional::fdiv<numeric::functional::multiplies<
sample-type
, weight-type
>::result_type, weight-type
>::result_type
For variates,
numeric::functional::fdiv<numeric::functional::multiplies<
variate-type
, weight-type
>::result_type,weight-type
>::result_type
sum_of_weights
The lazy mean of samples depends on weighted_sum
The lazy mean of variates depends on weighted_sum_of_variates<>
weighted_mean_of_variates<
variate-type
, variate-tag
>
immediate_weighted_mean
immediate_weighted_mean_of_variates<
variate-type
, variate-tag
>
none
none
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_mean.hpp
>
Пример
accumulator_set< int , stats< tag::weighted_mean , tag::weighted_mean_of_variates<int, tag::covariate1> > , int > acc; acc(10, weight = 2, covariate1 = 7); // 20 BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); // // acc(6, weight = 3, covariate1 = 8); // 18 BOOST_CHECK_EQUAL(5, sum_of_weights(acc)); // // acc(4, weight = 4, covariate1 = 9); // 16 BOOST_CHECK_EQUAL(9, sum_of_weights(acc)); // // acc(6, weight = 5, covariate1 = 6); //+ 30 BOOST_CHECK_EQUAL(14, sum_of_weights(acc)); // //= 84 / 14 = 6 BOOST_CHECK_EQUAL(6., weighted_mean(acc)); BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc))); accumulator_set< int , stats< tag::weighted_mean(immediate) , tag::weighted_mean_of_variates<int, tag::covariate1>(immediate) > , int > acc2; acc2(10, weight = 2, covariate1 = 7); // 20 BOOST_CHECK_EQUAL(2, sum_of_weights(acc2)); // // acc2(6, weight = 3, covariate1 = 8); // 18 BOOST_CHECK_EQUAL(5, sum_of_weights(acc2)); // // acc2(4, weight = 4, covariate1 = 9); // 16 BOOST_CHECK_EQUAL(9, sum_of_weights(acc2)); // // acc2(6, weight = 5, covariate1 = 6); //+ 30 BOOST_CHECK_EQUAL(14, sum_of_weights(acc2)); // //= 84 / 14 = 6 BOOST_CHECK_EQUAL(6., weighted_mean(acc2)); BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates<int, tag::covariate1>(acc2)));
См. также
Медианная оценка для взвешенных образцов на основе квантильной оценки<P^2
>, оценки плотности или кумулятивной оценки распределения<P^2
>. Для более подробной информации о реализации см.<weighted_median_impl
>,<with_weighted_density_median_impl
>и<with_weighted_p_square_cumulative_distribution_median_impl
>.
Все три средних аккумулятора удовлетворяют свойству<tag::weighted_median
>и могут быть извлечены с помощью<weighted_median()
>экстрактора.
numeric::functional::fdiv<sample-type
, std::size_t>::result_type
weighted_median
depends
on weighted_p_square_quantile_for_median
with_weighted_density_median
depends on count
and weighted_density
with_weighted_p_square_cumulative_distribution_median
depends on weighted_p_square_cumulative_distribution
<with_weighted_density_median
>(a.k.a.<weighted_median(with_weighted_density)
>)
<with_weighted_p_square_cumulative_distribution_median
>(a.k.a.<weighted_median(with_weighted_p_square_cumulative_distribution)
>)
with_weighted_density_median
requires tag::weighted_density::cache_size
and tag::weighted_density::num_bins
with_weighted_p_square_cumulative_distribution_median
requires tag::weighted_p_square_cumulative_distribution::num_cells
weight
none
ТОДО
ТОДО
Заголовок
#include <boost/accumulators/statistics/weighted_median.hpp
>
Пример
// Median estimation of normal distribution N(1,1) using samples from a narrow normal distribution N(1,0.01) // The weights equal to the likelihood ratio of the corresponding samples // two random number generators double mu = 1.; double sigma_narrow = 0.01; double sigma = 1.; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma_narrow(mu,sigma_narrow); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal_narrow(rng, mean_sigma_narrow); accumulator_set<double, stats<tag::weighted_median(with_weighted_p_square_quantile) >, double > acc; accumulator_set<double, stats<tag::weighted_median(with_weighted_density) >, double > acc_dens( tag::weighted_density::cache_size = 10000, tag::weighted_density::num_bins = 1000 ); accumulator_set<double, stats<tag::weighted_median(with_weighted_p_square_cumulative_distribution) >, double > acc_cdist( tag::weighted_p_square_cumulative_distribution::num_cells = 100 ); for (std::size_t i=0; i<100000; ++i) { double sample = normal_narrow(); acc(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); acc_dens(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); acc_cdist(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); } BOOST_CHECK_CLOSE(1., weighted_median(acc), 1e-1); BOOST_CHECK_CLOSE(1., weighted_median(acc_dens), 1e-1); BOOST_CHECK_CLOSE(1., weighted_median(acc_cdist), 1e-1);
См. также
weighted_median_impl
with_weighted_density_median_impl
count
weighted_p_square_quantile
weighted_p_square_cumulative_distribution
Рассчитывается N-й момент взвешенных образцов, который определяется как сумма взвешенной N-й мощности образцов над суммой весов.
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , weight_type>::result_type
count
sum_of_weights
none
none
weight
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_moment.hpp
>
Пример
accumulator_set<double, stats<tag::weighted_moment<2> >, double> acc2; accumulator_set<double, stats<tag::weighted_moment<7> >, double> acc7; acc2(2.1, weight = 0.7); acc2(2.7, weight = 1.4); acc2(1.8, weight = 0.9); acc7(2.1, weight = 0.7); acc7(2.7, weight = 1.4); acc7(1.8, weight = 0.9); BOOST_CHECK_CLOSE(5.403, accumulators::weighted_moment<2>(acc2), 1e-5); BOOST_CHECK_CLOSE(548.54182, accumulators::weighted_moment<7>(acc7), 1e-5);
См. также
Расчет гистограммы кумулятивного распределения с алгоритмом<P^2
>для взвешенных образцов. Подробнее о реализации см.<weighted_p_square_cumulative_distribution_impl
>
iterator_range< std::vector< std::pair< numeric::functional::fdiv<weighted_sample, std::size_t>::result_type , numeric::functional::fdiv<weighted_sample, std::size_t>::result_type > >::iterator >
where weighted_sample
is numeric::functional::multiplies<
sample-type
, weight-type
>::result_type
count
sum_or_weights
none
tag::weighted_p_square_cumulative_distribution::num_cells
weight
none
ТОДО
O(N) where N is num_cells
Заголовок
#include <boost/accumulators/statistics/weighted_p_square_cumul_dist.hpp
>
Пример
// tolerance in % double epsilon = 4; typedef accumulator_set<double, stats<tag::weighted_p_square_cumulative_distribution>, double > accumulator_t; accumulator_t acc_upper(tag::weighted_p_square_cumulative_distribution::num_cells = 100); accumulator_t acc_lower(tag::weighted_p_square_cumulative_distribution::num_cells = 100); // two random number generators double mu_upper = 1.0; double mu_lower = -1.0; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma_upper(mu_upper,1); boost::normal_distribution<> mean_sigma_lower(mu_lower,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal_upper(rng, mean_sigma_upper); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal_lower(rng, mean_sigma_lower); for (std::size_t i=0; i<100000; ++i) { double sample = normal_upper(); acc_upper(sample, weight = std::exp(-mu_upper * (sample - 0.5 * mu_upper))); } for (std::size_t i=0; i<100000; ++i) { double sample = normal_lower(); acc_lower(sample, weight = std::exp(-mu_lower * (sample - 0.5 * mu_lower))); } typedef iterator_range<std::vector<std::pair<double, double> >::iterator > histogram_type; histogram_type histogram_upper = weighted_p_square_cumulative_distribution(acc_upper); histogram_type histogram_lower = weighted_p_square_cumulative_distribution(acc_lower); // Note that applying importance sampling results in a region of the distribution // to be estimated more accurately and another region to be estimated less accurately // than without importance sampling, i.e., with unweighted samples for (std::size_t i = 0; i < histogram_upper.size(); ++i) { // problem with small results: epsilon is relative (in percent), not absolute! // check upper region of distribution if ( histogram_upper[i].second > 0.1 ) BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_upper[i].first / sqrt(2.0) )), histogram_upper[i].second, epsilon ); // check lower region of distribution if ( histogram_lower[i].second < -0.1 ) BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_lower[i].first / sqrt(2.0) )), histogram_lower[i].second, epsilon ); }
См. также
Единый квантиль с алгоритмом<P^2
>. Подробнее о реализации см.<weighted_p_square_quantile_impl
>
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , std::size_t>::result_type
count
sum_of_weights
weighted_p_square_quantile_for_median
<quantile_probability
>, который не соответствует<0.5
>. (Примечание: для<weighted_p_square_quantile_for_median
>параметр<quantile_probability
>игнорируется и всегда<0.5
>.)
weight
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_p_square_quantile.hpp
>
Пример
typedef accumulator_set<double, stats<tag::weighted_p_square_quantile>, double> accumulator_t; // tolerance in % double epsilon = 1; // some random number generators double mu4 = -1.0; double mu5 = -1.0; double mu6 = 1.0; double mu7 = 1.0; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma4(mu4, 1); boost::normal_distribution<> mean_sigma5(mu5, 1); boost::normal_distribution<> mean_sigma6(mu6, 1); boost::normal_distribution<> mean_sigma7(mu7, 1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal4(rng, mean_sigma4); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal5(rng, mean_sigma5); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal6(rng, mean_sigma6); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal7(rng, mean_sigma7); accumulator_t acc0(quantile_probability = 0.001); accumulator_t acc1(quantile_probability = 0.025); accumulator_t acc2(quantile_probability = 0.975); accumulator_t acc3(quantile_probability = 0.999); accumulator_t acc4(quantile_probability = 0.001); accumulator_t acc5(quantile_probability = 0.025); accumulator_t acc6(quantile_probability = 0.975); accumulator_t acc7(quantile_probability = 0.999); for (std::size_t i=0; i<100000; ++i) { double sample = rng(); acc0(sample, weight = 1.); acc1(sample, weight = 1.); acc2(sample, weight = 1.); acc3(sample, weight = 1.); double sample4 = normal4(); double sample5 = normal5(); double sample6 = normal6(); double sample7 = normal7(); acc4(sample4, weight = std::exp(-mu4 * (sample4 - 0.5 * mu4))); acc5(sample5, weight = std::exp(-mu5 * (sample5 - 0.5 * mu5))); acc6(sample6, weight = std::exp(-mu6 * (sample6 - 0.5 * mu6))); acc7(sample7, weight = std::exp(-mu7 * (sample7 - 0.5 * mu7))); } // check for uniform distribution with weight = 1 BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc0), 0.001, 15 ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc1), 0.025, 5 ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc2), 0.975, epsilon ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc3), 0.999, epsilon ); // check for shifted standard normal distribution ("importance sampling") BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc4), -3.090232, epsilon ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc5), -1.959963, epsilon ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc6), 1.959963, epsilon ); BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc7), 3.090232, epsilon );
См. также
Весовые пики над пороговым методом для взвешенного квантиля и взвешенного хвоста означают оценку. Более подробную информацию о реализации см. в<weighted_peaks_over_threshold_impl
>и<weighted_peaks_over_threshold_prob_impl
>.
Оба<tag::weighted_peaks_over_threshold<
и<left-or-right
>>tag::weighted_peaks_over_threshold_prob<
удовлетворяют<left-or-right
>>tag::weighted_peaks_over_threshold<
признаку и могут быть извлечены с использованием<left-or-right
>>weighted_peaks_over_threshold()
>экстрактора.
<tuple<float_type,
float_type,
float_type>
>где<float_type
>
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , std::size_t>::result_type
weighted_peaks_over_threshold<
depends on left-or-right
>sum_of_weights
weighted_peaks_over_threshold_prob<
depends on left-or-right
>sum_of_weights
and tail_weights<
left-or-right
>
weighted_peaks_over_threshold_prob
tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<
left-or-right
>::cache_size
weight
none
ТОДО
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_peaks_over_threshold.hpp
>
См. также
Искаженность распределения выборки определяется как отношение 3-го центрального момента и<3/2
>— мощность 2-го центрального момента (разница) выборки 3.Оценщик смещения для взвешенных образцов формально идентичен оценке для невзвешенных образцов, за исключением того, что должны быть приняты взвешенные аналоги всех мер, от которых он зависит.
Подробности реализации см.<weighted_skewness_impl
>.
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , numeric::functional::multiplies<sample-type
,weight-type
>::result_type>::result_type
weighted_mean
weighted_moment<2>
weighted_moment<3>
none
none
weight
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_skewness.hpp
>
Пример
accumulator_set<int, stats<tag::weighted_skewness>, int > acc2; acc2(2, weight = 4); acc2(7, weight = 1); acc2(4, weight = 3); acc2(9, weight = 1); acc2(3, weight = 2); BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); BOOST_CHECK_CLOSE( weighted_skewness(acc2), 1.30708406282, 1e-6 );
См. также
Для суммирования взвешенных образцов или вариаций. Все<tag::weighted_sum_of_variates<>
>признаки могут быть извлечены с помощью<weighted_sum_of_variates()
>экстрактора. Также представлены варианты, реализующие алгоритм суммирования Кахана.
<numeric::functional::multiplies<
для суммирования взвешенных образцовsample-type
>,<weight-type
>>::результат_тип
<numeric::functional::multiplies<
для суммирования взвешенных вариацийvariate-type
>,<weight-type
>>::результат_тип
none
tag::weighted_sum
tag::weighted_sum_of_variates<
variate-type
, variate-tag
>
tag::weighted_sum_kahan
(a.k.a. tag::weighted_sum(kahan))
tag::weighted_sum_of_variates_kahan<
variate-type
, variate-tag
>
none
<weight
>
<
для суммирования вариацийvariate-tag
>
none
О(1). Обратите внимание, что сумма Кахана выполняет четыре операции с плавающей точкой на накопленную стоимость, тогда как наивная сумма выполняет только одну.
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_sum.hpp
> #include <boost/accumulators/statistics/weighted_sum_kahan.hpp
>
Пример
accumulator_set<int, stats<tag::weighted_sum, tag::weighted_sum_of_variates<int, tag::covariate1> >, int> acc; acc(1, weight = 2, covariate1 = 3); BOOST_CHECK_EQUAL(2, weighted_sum(acc)); BOOST_CHECK_EQUAL(6, weighted_sum_of_variates(acc)); acc(2, weight = 3, covariate1 = 6); BOOST_CHECK_EQUAL(8, weighted_sum(acc)); BOOST_CHECK_EQUAL(24, weighted_sum_of_variates(acc)); acc(4, weight = 6, covariate1 = 9); BOOST_CHECK_EQUAL(32, weighted_sum(acc)); BOOST_CHECK_EQUAL(78, weighted_sum_of_variates(acc)); // demonstrate weighted Kahan summation accumulator_set<float, stats<tag::weighted_sum_kahan>, float > acc; BOOST_CHECK_EQUAL(0.0f, weighted_sum_kahan(acc)); for (size_t i = 0; i < 1e6; ++i) { acc(1.0f, weight = 1e-6f); } BOOST_CHECK_EQUAL(1.0f, weighted_sum_kahan(acc));
См. также
Оценка (некогерентного) взвешенного хвостового среднего на основе статистики заказов (как для левого, так и для правого хвоста). Средняя характеристика левого некогерентного взвешенного хвоста<tag::non_coherent_weighted_tail_mean<left>
>, а средняя характеристика правого некогерентного взвешенного хвоста<tag::non_coherent_weighted_tail_mean<right>
>. Они оба имеют функцию<tag::abstract_non_coherent_tail_mean
>с невзвешенными некогерентными хвостовыми средними аккумуляторами и могут быть извлечены либо с экстракторами<non_coherent_tail_mean()
>, либо с экстракторами<non_coherent_weighted_tail_mean()
>. Подробнее о реализации см.<non_coherent_weighted_tail_mean_impl
>.
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , std::size_t>::result_type
sum_of_weights
tail_weights<
left-or-right
>
abstract_non_coherent_tail_mean
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/weighted_tail_mean.hpp
>
Пример
// tolerance in % double epsilon = 1; std::size_t n = 100000; // number of MC steps std::size_t c = 25000; // cache size accumulator_set<double, stats<tag::non_coherent_weighted_tail_mean<right> >, double > acc0( right_tail_cache_size = c ); accumulator_set<double, stats<tag::non_coherent_weighted_tail_mean<left> >, double > acc1( left_tail_cache_size = c ); // random number generators boost::lagged_fibonacci607 rng; for (std::size_t i = 0; i < n; ++i) { double smpl = std::sqrt(rng()); acc0(smpl, weight = 1./smpl); } for (std::size_t i = 0; i < n; ++i) { double smpl = rng(); acc1(smpl*smpl, weight = smpl); } // check uniform distribution BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.01), 0.005, epsilon ); BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 5*epsilon );
См. также
Оценка хвостового квантиля на основе статистики заказов взвешенных образцов (как для левого, так и для правого хвоста). Функция левого взвешенного хвостового квантиля<tag::weighted_tail_quantile<left>
>, а функция правого взвешенного хвостового квантиля<tag::weighted_tail_quantile<right>
>. Они оба имеют функцию<tag::quantile
>с невзвешенными аккумуляторами хвостового квантиля и могут быть извлечены либо с экстракторами<quantile()
>, либо с экстракторами<weighted_tail_quantile()
>. Подробнее о реализации см.<weighted_tail_quantile_impl
>
sample-type
sum_of_weights
tail_weights<
left-or-right
>
none
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/weighted_tail_quantile.hpp
>
Пример
// tolerance in % double epsilon = 1; std::size_t n = 100000; // number of MC steps std::size_t c = 20000; // cache size double mu1 = 1.0; double mu2 = -1.0; boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma1(mu1,1); boost::normal_distribution<> mean_sigma2(mu2,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal1(rng, mean_sigma1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal2(rng, mean_sigma2); accumulator_set<double, stats<tag::weighted_tail_quantile<right> >, double> acc1(right_tail_cache_size = c); accumulator_set<double, stats<tag::weighted_tail_quantile<left> >, double> acc2(left_tail_cache_size = c); for (std::size_t i = 0; i < n; ++i) { double sample1 = normal1(); double sample2 = normal2(); acc1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); acc2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); } // check standard normal distribution BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), -1.959963, epsilon ); BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), -3.090232, epsilon );
См. также
Оценка абсолютного и относительного взвешенного значения переменного хвоста (как для левого, так и для правого хвоста) Средство абсолютной взвешенной вариации хвоста имеет признак<tag::absolute_weighted_tail_variate_means<
, а относительное среднее значение взвешенной вариации хвоста имеет признак<left-or-right
>,,<variate-tag
>>tag::relative_weighted_tail_variate_means<
. Все абсолютные взвешенные хвостовые вариации имеют общую характеристику<left-or-right
>,,<variate-tag
><variate-tag
>>tag::abstract_absolute_tail_variate_means
>с их невзвешенными вариантами и могут быть извлечены с помощью экстракторов<tail_variate_means()
>и<weighted_tail_variate_means()
>. Все относительные взвешенные хвостовые вариации имеют общую характеристику<tag::abstract_relative_tail_variate_means
>с их невзвешенными вариантами и могут быть извлечены либо с экстракторами<relative_tail_variate_means()
>, либо<relative_weighted_tail_variate_means()
>.
Подробнее о реализации см.<weighted_tail_variate_means_impl
>
boost::iterator_range< numeric::functional::fdiv< numeric::functional::multiplies<variate-type
,weight-type
>::result_type ,weight-type
>::result_type::iterator>
non_coherent_weighted_tail_mean<
left-or-right
>
tail_variate<
variate-type
, variate-tag
, left-or-right
>
tail_weights<
left-or-right
>
tag::absolute_weighted_tail_variate_means<
left-or-right
, variate-type
, variate-tag
>
tag::relative_weighted_tail_variate_means<
left-or-right
, variate-type
, variate-tag
>
tag::tail<
left-or-right
>::cache_size
none
quantile_probability
O(log N), где N - размер кэша
O(N log N), где N - размер кэша
Заголовок
#include <boost/accumulators/statistics/weighted_tail_variate_means.hpp
>
Пример
std::size_t c = 5; // cache size typedef double variate_type; typedef std::vector<variate_type> variate_set_type; accumulator_set<double, stats<tag::weighted_tail_variate_means<right, variate_set_type, tag::covariate1>(relative)>, double > acc1( right_tail_cache_size = c ); accumulator_set<double, stats<tag::weighted_tail_variate_means<right, variate_set_type, tag::covariate1>(absolute)>, double > acc2( right_tail_cache_size = c ); accumulator_set<double, stats<tag::weighted_tail_variate_means<left, variate_set_type, tag::covariate1>(relative)>, double > acc3( left_tail_cache_size = c ); accumulator_set<double, stats<tag::weighted_tail_variate_means<left, variate_set_type, tag::covariate1>(absolute)>, double > acc4( left_tail_cache_size = c ); variate_set_type cov1, cov2, cov3, cov4, cov5; double c1[] = { 10., 20., 30., 40. }; // 100 double c2[] = { 26., 4., 17., 3. }; // 50 double c3[] = { 46., 64., 40., 50. }; // 200 double c4[] = { 1., 3., 70., 6. }; // 80 double c5[] = { 2., 2., 2., 14. }; // 20 cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); acc1(100., weight = 0.8, covariate1 = cov1); acc1( 50., weight = 0.9, covariate1 = cov2); acc1(200., weight = 1.0, covariate1 = cov3); acc1( 80., weight = 1.1, covariate1 = cov4); acc1( 20., weight = 1.2, covariate1 = cov5); acc2(100., weight = 0.8, covariate1 = cov1); acc2( 50., weight = 0.9, covariate1 = cov2); acc2(200., weight = 1.0, covariate1 = cov3); acc2( 80., weight = 1.1, covariate1 = cov4); acc2( 20., weight = 1.2, covariate1 = cov5); acc3(100., weight = 0.8, covariate1 = cov1); acc3( 50., weight = 0.9, covariate1 = cov2); acc3(200., weight = 1.0, covariate1 = cov3); acc3( 80., weight = 1.1, covariate1 = cov4); acc3( 20., weight = 1.2, covariate1 = cov5); acc4(100., weight = 0.8, covariate1 = cov1); acc4( 50., weight = 0.9, covariate1 = cov2); acc4(200., weight = 1.0, covariate1 = cov3); acc4( 80., weight = 1.1, covariate1 = cov4); acc4( 20., weight = 1.2, covariate1 = cov5); // check relative risk contributions BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/(0.8*100 + 1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/(0.8*100 + 1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/(0.8*100 + 1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/(0.8*100 + 1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/(0.9*50 + 1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/(0.9*50 + 1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/(0.9*50 + 1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/(0.9*50 + 1.2*20) ); // check absolute risk contributions BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/1.8 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/1.8 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/1.8 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/1.8 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/2.1 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/2.1 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/2.1 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/2.1 ); // check relative risk contributions BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 1.0*46/(1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 1.0*64/(1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1.0*40/(1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1.0*50/(1.0*200) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1.2*2/(1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1.2*2/(1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1.2*2/(1.2*20) ); BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 1.2*14/(1.2*20) ); // check absolute risk contributions BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 1.0*46/1.0 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 1.0*64/1.0 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 1.0*40/1.0 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 1.0*50/1.0 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 1.2*2/1.2 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 1.2*2/1.2 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 1.2*2/1.2 ); BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 1.2*14/1.2 );
См. также
Ленивый или итеративный расчет взвешенной дисперсии. Ленивый расчет связан с признаком<tag::lazy_weighted_variance
>и итеративный расчет с признаком<tag::weighted_variance
>. Оба могут быть извлечены с помощью экстрактора<tag::weighted_variance()
>. Более подробную информацию о реализации см. в<lazy_weighted_variance_impl
>и<weighted_variance_impl
>.
numeric::functional::fdiv< numeric::functional::multiplies<sample-type
,weight-type
>::result_type , std::size_t>::result_type
tag::lazy_weighted_variance
depends
on tag::weighted_moment<2>
and tag::weighted_mean
tag::weighted_variance
depends on tag::count
and tag::immediate_weighted_mean
tag::weighted_variance
(a.k.a.sum
)
none
weight
none
O(1)
O(1)
Заголовок
#include <boost/accumulators/statistics/weighted_variance.hpp
>
Пример
// lazy weighted_variance accumulator_set<int, stats<tag::weighted_variance(lazy)>, int> acc1; acc1(1, weight = 2); // 2 acc1(2, weight = 3); // 6 acc1(3, weight = 1); // 3 acc1(4, weight = 4); // 16 acc1(5, weight = 1); // 5 // weighted_mean = (2+6+3+16+5) / (2+3+1+4+1) = 32 / 11 = 2.9090909090909090909090909090909 BOOST_CHECK_EQUAL(5u, count(acc1)); BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc1), 1e-5); BOOST_CHECK_CLOSE(10.1818182, accumulators::weighted_moment<2>(acc1), 1e-5); BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc1), 1e-5); // immediate weighted_variance accumulator_set<int, stats<tag::weighted_variance>, int> acc2; acc2(1, weight = 2); acc2(2, weight = 3); acc2(3, weight = 1); acc2(4, weight = 4); acc2(5, weight = 1); BOOST_CHECK_EQUAL(5u, count(acc2)); BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc2), 1e-5); BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc2), 1e-5); // check lazy and immediate variance with random numbers // two random number generators boost::lagged_fibonacci607 rng; boost::normal_distribution<> mean_sigma(0,1); boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma); accumulator_set<double, stats<tag::weighted_variance>, double > acc_lazy; accumulator_set<double, stats<tag::weighted_variance(immediate)>, double > acc_immediate; for (std::size_t i=0; i<10000; ++i) { double value = normal(); acc_lazy(value, weight = rng()); acc_immediate(value, weight = rng()); } BOOST_CHECK_CLOSE(1., weighted_variance(acc_lazy), 1.); BOOST_CHECK_CLOSE(1., weighted_variance(acc_immediate), 1.);
См. также
Статья User's Guide раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 1. Boost.Accumulators может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Boost.Accumulators ::
реклама |