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

User's Guide

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 1. Boost.Accumulators

Boost C++ Libraries

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

PrevUpHomeNext

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

Hello, World!

Ниже приведен полный пример того, как использовать Рамки накопителей и Статистические накопители для выполнения дополнительных статистических расчетов. Он вычисляет среднее и 2-й момент последовательности двойников.

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/moment.hpp>
using namespace boost::accumulators;
int main()
{
    // Define an accumulator set for calculating the mean and the
    // 2nd moment ...
    accumulator_set<double, stats<tag::mean, tag::moment<2> > > acc;
    // push in some data ...
    acc(1.2);
    acc(2.3);
    acc(3.4);
    acc(4.5);
    // Display the results ...
    std::cout << "Mean:   " << mean(acc) << std::endl;
    std::cout << "Moment: " << accumulators::moment<2>(acc) << std::endl;
    return 0;
}

Эта программа отображает следующее:

Mean:   2.85
Moment: 9.635

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

  • Пользователи строят вычислительный объект, называемый<accumulator_set<>>, выбирая вычисления, в которых они заинтересованы, или создавая свои собственные вычислительные примитивы, которые вписываются в рамки.
  • Пользователи проталкивают данные в объект<accumulator_set<>>по одному образцу за раз.
  • <accumulator_set<>>вычисляет запрашиваемые величины наиболее эффективным способом, разрешая зависимости между запрашиваемыми вычислениями, возможно, кэшируя промежуточные результаты.

Структура аккумуляторов определяет утилиты, необходимые для определения примитивных вычислительных элементов, называемыхаккумуляторами. Кроме того, он содержит<accumulator_set<>>тип, описанный выше.

Terminology

В остальной части документации используются следующие термины.

Sample

A datum that is pushed into an accumulator_set<>. The type of the sample is the sample type.

Weight

An optional scalar value passed along with the sample specifying the weight of the sample. Conceptually, each sample is multiplied with its weight. The type of the weight is the weight type.

Feature

Абстрактная примитивная вычислительная сущность. При определении<accumulator_set<>>пользователи указывают особенности, в которых они заинтересованы, и<accumulator_set<>>выясняет, какиеаккумуляторылучше всего обеспечили бы эти функции. Функции могут зависеть от других функций. Если они это делают, аккумулятор устанавливает, какие аккумуляторы добавить для удовлетворения зависимостей.

Accumulator

Конкретный примитивный вычислительный объект. Аккумулятор является конкретной реализацией функции. Он удовлетворяет одной абстрактной функции. Несколько различных аккумуляторов могут обеспечивать одну и ту же функцию, но могут представлять различные стратегии реализации.

Accumulator Set

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

Extractor

Функция или объект функции, которые могут быть использованы для извлечения результата из<accumulator_set<>>.

Overview

Вот список важных типов и функций в структуре аккумулятора и краткое описание каждого из них.

Table 1.1. Accumulators Toolbox

Инструмент

Описание

accumulator_set<>

This is the most important type in the Accumulators Framework. It is a collection of accumulators. A datum pushed into an accumulator_set<> is forwarded to each accumulator, in an order determined by the dependency relationships between the accumulators. Computational results can be extracted from an accumulator at any time.

depends_on<>

Used to specify which other features a feature depends on.

feature_of<>

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.

as_feature<>

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 as_feature<>. This is just syntactic sugar.

features<>

An MPL sequence. We can use features<> as the second template parameter when declaring an accumulator_set<>.

external<>

Used when declaring an accumulator_set<>. If the weight type is specified with external<>, then the weight accumulators are assumed to reside in a separate accumulator set which will be passed in with a named parameter.

extractor<>

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<> the result corresponding to that feature.


Наша экскурсия по шаблону<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]Note

<features<>>является синонимом<mpl::vector<>>. На самом деле, мы могли бы использовать<mpl::vector<>>или любую последовательность MPL, если бы мы предпочли, и значение было бы одинаковым.

После того, как мы определили<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]Note

Чтобы использовать<boost::bind()>и<boost::ref()>, вы должны<#include><<boost/bind.hpp>>и<<boost/ref.hpp>>.

Как только мы объявим<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]Tip

На платформе Windows<min>и<max>являются препроцессорными макросами, определенными в<WinDef.h>. Чтобы использовать<min>и<max>экстракторы, вы должны либо составить<NOMINMAX>определено, или вы должны вызвать экстракторы, как:<(min)(acc)>и<(max)(acc)>. Скобки удерживают макрос от вызова.

Другой способ извлечь результат из<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]Note

При работе с взвешенными статистическими аккумуляторами из Библиотеки статистических накопителей обязательно включите соответствующий заголовок. Например,<weighted_sum>определено в<<boost/accumulators/statistics/weighted_sum.hpp>>.

Этот раздел описывает объекты функций в пространстве имен<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)

Определяет действие, которое необходимо предпринять при сбросе этого аккумулятора. См. разделОслабляемые аккумуляторы.

Accessing Other Accumulators in the Set

Некоторые аккумуляторы зависят от других аккумуляторов в том же наборе аккумуляторов. В этих случаях необходимо иметь доступ к другим аккумуляторам. Чтобы сделать это возможным,<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]Note

Накопители, которые наследуют от<accumulator_base>, получают пустые<operator()>, поэтому аккумуляторы, подобные<mean_accumulator>выше, не должны определять один.

Все функции-члены, принимающие пакет аргументов, имеют доступ к прилагаемому<accumulator_set<>>через<accumulator>ключ, включая конструктор. Аккумуляторы внутри набора построены в порядке, определяемом их взаимозависимостью. В результате аккумулятору безопасно получить доступ к тому, от которого он зависит во время строительства.

Infix Notation and the Numeric Operators Sub-Library

Несмотря на то, что в этом нет необходимости, может быть хорошей идеей разместить ваши реализации аккумуляторов в пространстве имен<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>. Вот почему это хорошая идея, чтобы поставить свои аккумуляторы там.

Droppable Accumulators

Термин «удаляемый» относится к аккумулятору, который может быть удален из<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()>аккумулятора, который соответствует каждому из них. (Примечание: это означает, что аккумулятор, который не определен пользователем, а находится в наборе только для удовлетворения зависимости, будет сброшен, как только все его зависимости будут сброшены. Те, которые были указаны пользователем, не сбрасываются до тех пор, пока их зависимости не будут сброшеныи.
  • Деппируемые аккумуляторы проверяют свой контрольный показатель в функции накопителя. Если число ссылок равно 0, то функция является no-op.
  • Пользователям не разрешается удалять функцию, которая не указана пользователем и помечена как опускаемая.

В качестве оптимизации:

  • Если пользователь указывает функцию<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,sample-type>,<weight-type>>::типадолжен быть тип аккумулятора, который реализует эту функцию. ИспользованиеMPLзаполнителей, таких как<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>объектом. Все функциональные объекты в подбиблиотеке числовых операторов могут быть настроены аналогичным образом.

Accumulator Concept

В следующей таблице<Acc>является типом аккумулятора,<acc>и<acc2>являются объектами типа<Acc>, а<args>является названием набора аргументов из библиотекиBoost.Parameter.

Table 1.2. Accumulator Requirements

Выражение

Тип возврата

Утверждение/Примечание/Предварительное/Пост-условие

<Acc::result_type>

реализация определена

<Accacc(args)>

Нет

Построение из набора аргументов.

Acc acc(acc2)

Нет

Пост:<acc.result(args)>эквивалентен<acc2.result(args)>

<acc(args)>

неуказанный

<acc.on_drop(args)>

неуказанный

<acc.result(args)>

<Acc::result_type>


Feature Concept

В следующей таблице<F>— тип признака, а<S>— некоторый скалярный тип.

Table 1.3. Feature Requirements

Выражение

Тип возврата

Утверждение/Примечание/Предварительное/Пост-условие

<F::dependencies>

неуказанный

Последовательность MPL других признаков, от которых зависит<F>.

<F::is_weight_accumulator>

<mpl::true_>или<mpl::false_>

<mpl::true_>, если аккумулятор для этой функции должен быть сделан внешним, когда весовой тип для набора аккумулятора составляет<external<S>>,<mpl::false_>иначе.

<F::impl>

неуказанный

MPL Lambda ExpressionMPL Lambda Expressionвозвращает тип аккумулятора, который реализует эту функцию при прохождении типа образца и типа веса.


Библиотека статистических накопителей определяет аккумуляторы для дополнительных статистических вычислений. Он построен на вершине. Структура аккумулятора.

Функция<count>представляет собой простой счетчик, который отслеживает количество образцов, выталкиваемых в набор аккумулятора.

Result Type

std::size_t

Depends On

none

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>>.

Result Type

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

Depends On

count
mean
mean_of_variates<variate-type, variate-tag>

Variants

abstract_covariance

Initialization Parameters

none

Accumulator Parameters

variate-tag

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>.

Result Type

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
>

Depends On

count
min
max

Variants

none

Initialization Parameters

density::cache_size
density::num_bins

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

O(N), when N is density::num_bins

Заголовок

#include <boost/accumulators/statistics/density.hpp>

Примечание

Результаты от<density>аккумулятора могут быть извлечены только после того, как количество образцов соответствует или превышает размер кэша.

См. также

Функция<error_of<mean>>вычисляет погрешность средней функции. Она равна<sqrt(variance/ (count -1))>.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

count
variance

Variants

error_of<immediate_mean>

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>.

Result Type

boost::iterator_range<
    implementation-defined
>

Depends On

count

Variants

none

Initialization Parameters

tag::extended_p_square::probabilities

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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()>.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

weighted variants depend on weighted_extended_p_square
unweighted variants depend on extended_p_square

Variants

extended_p_square_quantile_quadratic
weighted_extended_p_square_quantile
weighted_extended_p_square_quantile_quadratic

Initialization Parameters

tag::extended_p_square::probabilities

Accumulator Parameters

<weight>для взвешенных вариантов

Extractor Parameters

quantile_probability

Accumulator Complexity

ТОДО

Extractor Complexity

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
    );
}

См. также

Result Type

numeric::functional::fdiv<sample-type, sample-type>::result_type

Depends On

mean
moment<2>
moment<3>
moment<4>

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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 );

См. также

Вычисляет максимальное значение всех образцов.

Result Type

sample-type

Depends On

none

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>.

Result Type

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

Depends On

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<>

Variants

mean_of_weights
mean_of_variates<variate-type, variate-tag>
immediate_mean
immediate_mean_of_weights
immediate_mean_of_variates<variate-type, variate-tag>

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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()>экстрактора.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

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

Variants

with_density_median
with_p_square_cumulative_distribution_median

Initialization Parameters

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

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

ТОДО

Заголовок

#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.);

См. также

Вычисляет минимальное значение всех образцов.

Result Type

sample-type

Depends On

none

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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-й мощности образцов над количеством образцов.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

count

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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);

См. также

Расчет гистограммы кумулятивного распределения с помощью алгоритма<P^2>. Подробнее о реализации см.<p_square_cumulative_distribution_impl>

Result Type

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
>

Depends On

count

Variants

none

Initialization Parameters

tag::p_square_cumulative_distribution::num_cells

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

count

Variants

p_square_quantile_for_median

Initialization Parameters

<quantile_probability>, который не соответствует<0.5>. (Примечание: для<p_square_quantile_for_median>параметр<quantile_probability>игнорируется и всегда<0.5>.)

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>.

Result Type

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
>

Depends On

count
In addition, tag::peaks_over_threshold_prob<> depends on tail<left-or-right>

Variants

peaks_over_threshold_prob<left-or-right>

Initialization Parameters

tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

ТОДО

Заголовок

#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()>экстрактора.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On


pot_quantile_prob<left-or-right> зависит от peaks_over_threshold_prob<left-or-right>

Variants

pot_quantile_prob<left-or-right>

Initialization Parameters

tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

ТОДО

Extractor Complexity

ТОДО

Заголовок

#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()>экстрактора.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

pot_tail_mean<left-or-right> depends on peaks_over_threshold<left-or-right> and pot_quantile<left-or-right>
pot_tail_mean_prob<left-or-right> depends on peaks_over_threshold_prob<left-or-right> and pot_quantile_prob<left-or-right>

Variants

pot_tail_mean_prob<left-or-right>

Initialization Parameters

tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

ТОДО

Extractor Complexity

ТОДО

Заголовок

#include <boost/accumulators/statistics/pot_tail_mean.hpp>

Пример

// TODO

См. также

Подсчет качения - это текущее количество элементов в окне качения.

Result Type

std::size_t

Depends On

rolling_window_plus1

Variants

none

Initialization Parameters

tag::rolling_window::window_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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образцов.

Result Type

sample-type

Depends On

rolling_window_plus1

Variants

none

Initialization Parameters

tag::rolling_window::window_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

lazy_rolling_mean depends on rolling_sum and rolling_count
immediate_rolling_mean depends on rolling_count

Variants

lazy_rolling_mean (a.k.a. rolling_mean(lazy))
immediate_rolling_mean (a.k.a. rolling_mean(immediate))

Initialization Parameters

tag::rolling_window::window_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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вычисляетM- момент образцов, который определяется как суммаM- мощности образцов по количеству образцов, по последнимNобразцам.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

none

Variants

none

Initialization Parameters

tag::rolling_window::window_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

lazy_rolling_variance depends on rolling_moment<2>, rolling_count and rolling_mean
immediate_rolling_variance depends on rolling_count and immediate_rolling_mean

Variants

<lazy_rolling_variance>(a.k.a.<rolling_variance(lazy))>
<immediate_rolling_variance>(a.k.a.<rolling_variance(immediate)>)

Initialization Parameters

tag::rolling_window::window_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>.

Result Type

numeric::functional::fdiv<sample-type, sample-type>::result_type

Depends On

mean
moment<2>
moment<3>

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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 );

См. также

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

Result Type

<sample-type>для суммирования образцов
<weight-type>для суммирования весов
<variate-type>для суммирования вариаций

Depends On

none

Variants

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>

Initialization Parameters

none

Accumulator Parameters

<weight>для суммирования весов
<variate-tag>для суммирования вариаций

Extractor Parameters

none

Accumulator Complexity

О(1). Обратите внимание, что сумма Кахана выполняет четыре операции с плавающей точкой на накопленную стоимость, тогда как наивная сумма выполняет только одну.

Extractor Complexity

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>>::кэш_sizeпараметра инициализации. Подробности реализации см.<tail_impl>.

<tag::tail<left>>и<tag::tail<right>>удовлетворяют<tag::abstract_tail>признаку и могут быть извлечены с помощью<tail()>экстрактора.

Result Type

boost::iterator_range<
    boost::reverse_iterator<
        boost::permutation_iterator<
            std::vector<sample-type>::const_iterator  // samples
          , std::vector<std::size_t>::iterator          // indices
        >
    >
>

Depends On

none

Variants

abstract_tail

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

count
quantile
non_coherent_tail_mean<left-or-right>

Variants

none

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

count
tail<left-or-right>

Variants

abstract_non_coherent_tail_mean

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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 );

См. также

Result Type

sample-type

Depends On

count
tail<left-or-right>

Variants

none

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>>::кэш_sizeпараметра инициализации. Подробности реализации см.<tail_variate_impl>.

Оба<tag::tail_variate<variate-type>,<variate-tag>,справа>и<tag::tail_variate<variate-type>,<variate-tag>,слева>удовлетворяют<tag::abstract_tail_variate>признаку и могут быть извлечены из<tail_variate()>экстрактора.

Result Type

boost::iterator_range<
    boost::reverse_iterator<
        boost::permutation_iterator<
            std::vector<variate-type>::const_iterator // variates
          , std::vector<std::size_t>::iterator          // indices
        >
    >
>

Depends On

tail<left-or-right>

Variants

abstract_tail_variate

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

boost::iterator_range<
    std::vector<
        numeric::functional::fdiv<sample-type, std::size_t>::result_type
    >::iterator
>

Depends On

non_coherent_tail_mean<left-or-right>
tail_variate<variate-type, variate-tag, left-or-right>

Variants

tag::absolute_tail_variate_means<left-or-right, variate-type, variate-tag>
tag::relative_tail_variate_means<left-or-right, variate-type, variate-tag>

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

tag::lazy_variance depends on tag::moment<2> and tag::mean
tag::variance depends on tag::count and tag::immediate_mean

Variants

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>

Result Type

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>

Depends On

count
sum_of_weights
weighted_mean
weighted_mean_of_variates<variate-type, variate-tag>

Variants

abstract_weighted_covariance

Initialization Parameters

none

Accumulator Parameters

weight
variate-tag

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>.

Result Type

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>

Depends On

count
sum_of_weights
min
max

Variants

none

Initialization Parameters

tag::weighted_density::cache_size
tag::weighted_density::num_bins

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

O(N), when N is weighted_density::num_bins

Заголовок

#include <boost/accumulators/statistics/weighted_density.hpp>

См. также

Оценка множественного квантиля с помощью расширенного алгоритма<P^2>для взвешенных образцов. Подробнее см.<weighted_extended_p_square_impl>.

Result Type

boost::iterator_range<
    implementation-defined
>

Depends On

count
sum_of_weights

Variants

none

Initialization Parameters

tag::weighted_extended_p_square::probabilities

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , numeric::functional::multiplies<sample-type, weight-type>::result_type>::result_type

Depends On

weighted_mean
weighted_moment<2>
weighted_moment<3>
weighted_moment<4>

Variants

none

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>.

Result Type

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

Depends On

sum_of_weights
The lazy mean of samples depends on weighted_sum
The lazy mean of variates depends on weighted_sum_of_variates<>

Variants

weighted_mean_of_variates<variate-type, variate-tag>
immediate_weighted_mean
immediate_weighted_mean_of_variates<variate-type, variate-tag>

Initialization Parameters

none

Accumulator Parameters

none

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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()>экстрактора.

Result Type

numeric::functional::fdiv<sample-type, std::size_t>::result_type

Depends On

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

Variants

<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)>)

Initialization Parameters

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

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

ТОДО

Заголовок

#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);

См. также

Рассчитывается N-й момент взвешенных образцов, который определяется как сумма взвешенной N-й мощности образцов над суммой весов.

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , weight_type>::result_type

Depends On

count
sum_of_weights

Variants

none

Initialization Parameters

none

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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>

Result Type

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

Depends On

count
sum_or_weights

Variants

none

Initialization Parameters

tag::weighted_p_square_cumulative_distribution::num_cells

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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>

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , std::size_t>::result_type

Depends On

count
sum_of_weights

Variants

weighted_p_square_quantile_for_median

Initialization Parameters

<quantile_probability>, который не соответствует<0.5>. (Примечание: для<weighted_p_square_quantile_for_median>параметр<quantile_probability>игнорируется и всегда<0.5>.)

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

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()>экстрактора.

Result Type

<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

Depends On

weighted_peaks_over_threshold<left-or-right> depends on sum_of_weights
weighted_peaks_over_threshold_prob<left-or-right> depends on sum_of_weights and tail_weights<left-or-right>

Variants

weighted_peaks_over_threshold_prob

Initialization Parameters

tag::peaks_over_threshold::threshold_value
tag::peaks_over_threshold_prob::threshold_probability
tag::tail<left-or-right>::cache_size

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

ТОДО

Extractor Complexity

O(1)

Заголовок

#include <boost/accumulators/statistics/weighted_peaks_over_threshold.hpp>

См. также

Искаженность распределения выборки определяется как отношение 3-го центрального момента и<3/2>— мощность 2-го центрального момента (разница) выборки 3.Оценщик смещения для взвешенных образцов формально идентичен оценке для невзвешенных образцов, за исключением того, что должны быть приняты взвешенные аналоги всех мер, от которых он зависит.

Подробности реализации см.<weighted_skewness_impl>.

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , numeric::functional::multiplies<sample-type, weight-type>::result_type>::result_type

Depends On

weighted_mean
weighted_moment<2>
weighted_moment<3>

Variants

none

Initialization Parameters

none

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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()>экстрактора. Также представлены варианты, реализующие алгоритм суммирования Кахана.

Result Type

<numeric::functional::multiplies<sample-type>,<weight-type>>::результат_типдля суммирования взвешенных образцов
<numeric::functional::multiplies<variate-type>,<weight-type>>::результат_типдля суммирования взвешенных вариаций

Depends On

none

Variants

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>

Initialization Parameters

none

Accumulator Parameters

<weight>
<variate-tag>для суммирования вариаций

Extractor Parameters

none

Accumulator Complexity

О(1). Обратите внимание, что сумма Кахана выполняет четыре операции с плавающей точкой на накопленную стоимость, тогда как наивная сумма выполняет только одну.

Extractor Complexity

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>.

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , std::size_t>::result_type

Depends On

sum_of_weights
tail_weights<left-or-right>

Variants

abstract_non_coherent_tail_mean

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

sample-type

Depends On

sum_of_weights
tail_weights<left-or-right>

Variants

none

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>

Result Type

boost::iterator_range<
    numeric::functional::fdiv<
        numeric::functional::multiplies<variate-type, weight-type>::result_type
      , weight-type
    >::result_type::iterator>

Depends On

non_coherent_weighted_tail_mean<left-or-right>
tail_variate<variate-type, variate-tag, left-or-right>
tail_weights<left-or-right>

Variants

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>

Initialization Parameters

tag::tail<left-or-right>::cache_size

Accumulator Parameters

none

Extractor Parameters

quantile_probability

Accumulator Complexity

O(log N), где N - размер кэша

Extractor Complexity

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>.

Result Type

numeric::functional::fdiv<
    numeric::functional::multiplies<sample-type, weight-type>::result_type
  , std::size_t>::result_type

Depends On

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

Variants


tag::weighted_variance (a.k.a.sum)

Initialization Parameters

none

Accumulator Parameters

weight

Extractor Parameters

none

Accumulator Complexity

O(1)

Extractor Complexity

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.);

См. также


PrevUpHomeNext

Статья User's Guide раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 1. Boost.Accumulators может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 1. Boost.Accumulators ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:54:28/0.076531171798706/1