C++. Сборник рецептов - [152]

Шрифт
Интервал

>struct SumDiffNthPower {

> SumDiffNthPower(T x) : mean_(x) {};

> T operator()(T sum, T current) {

>  return sum + nthPower(current - mean_);

> }

> T mean_;

>};


>template

>T nthMoment(Iter_T first, Iter_T last, T mean) {

> size_t cnt = distance(first, last);

> return accumulate(first, last, T(), SumDiffNthPower(mean)) / cnt;

>}


>template

>T computeVariance(Iter_T first, Iter_T last, T mean) {

> return nthMoment(first, last, mean);

>}


>template

>T computeStdDev(Iter_T first, Iter_T last, T mean) {

> return sqrt(computeVariance(first, last, mean));

>}


>template

>T computeSkew(Iter_T begin, Iter_T end, T mean) {

> T m3 = nthMoment(begin, end, mean);

> T m2 = nthMoment(begin, end, mean);

> return m3 / (m2 * sqrt(m2));

>}


>template

>T computeKurtosisExcess(Iter_T begin, Iter_T end, T mean) {

> T m4 = nthMoment(begin, end, mean);

> T m2 = nthMoment(begin, end, mean);

> return m4 / (m2 * m2) - 3;

>}


>template

>void computeStats(Iter_T first, Iter_T last, T& sum, T& mean,

> T& var, T& std_dev, T& skew, T& kurt) {

> size_t cnt = distance(first, last);

> sum = accumulate(first, last, T());

> mean = sum / cnt;

> var = computeVariance(first, last, mean);

> std_dev = sort(var);

> skew = computeSkew(first, last, mean);

> kurt = computeKurtosisExcess(first, last, mean);

>}


>int main() {

> vector v;

> v.push_back(2);

> v.push_back(4);

> v.push_back(8);

> v.push_back(10);

> v.push_back(99);

> v.push_back(1);

> double sum, mean, var, dev, skew, kurt;

> computeStats(v.begin(), v.end(), sum, mean, var, dev, skew, kurt);

> cout << "count = " << v.size() << "\n";

> cout << "sum = " << sum << "\n";

> cout << "mean = " << mean << "\n";

> cout << "variance = " << var << "\n";

> cout << "standard deviation = " << dev << "\n";

> cout << "skew = " << skew << "\n";

> cout << "kurtosis excess = " << kurt << "\n";

> cout << endl;

>}

Программа примера 11.9 выдает следующий результат

>count = 6

>sum = 124

>mean = 20.6667

>variance = 1237.22

>standard deviation = 35.1742

>skew = 1.75664

>kurtosis excess = 1.14171

Обсуждение

Некоторые наиболее важные статистические функции (например, дисперсия, стандартное отклонение, коэффициент асимметрии и эксцесс) определяются исходя из нормализованных выборочных моментов. Статистические функции определяются немного по-разному в различных текстах. Здесь мы используем несмещенные определения статистических функций, которые сведены в табл. 11.1.


Табл. 11.1. Определения статистических функций

Статистическая функцияФормула
n-й центральный момент (μ>n)∑(x>i-mean)>n
Дисперсияμ2
Стандартное отклонение√μ2
Коэффициент асимметрииμ2/μ3>3/2
Эксцесс(μ4/μ2²)-3

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

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

Функция момента определяется при помощи математического оператора суммы. Во всех случаях, когда речь идет об этом операторе, следует иметь в виду функцию >accumulate, определенную в заголовочном файле >. Существует две разновидности функции >accumulate: одна подсчитывает сумму, используя >operator+, а другая использует функтор суммирования, который вы должны предоставить. Ваш функтор суммирования будет принимать значение накопленной суммы и значение конкретного элемента последовательности.

Пример 11.10 иллюстрирует работу функции >accumulate, показывая, как предоставленный пользователем функтор вызывается для каждого элемента последовательности.

Пример 11.10. Пример реализации функции accumulate

>template

>Iter_T accumulate(Iter_T begin, Iter_T end, Value_T value, BinOp_T op) {

> while (begin != end) {

>  value = op(value, *begin++)

> }

> return value;

>}

11.6. Генерация случайных чисел

Проблема

Требуется сгенерировать несколько случайных чисел в формате с плавающей точкой в интервале значений >[0.0, 1.0) при равномерном их распределении.

Решение

Стандарт C++ предусматривает наличие C-функции библиотеки этапа исполнения >rand, определенной в заголовочном файле >, которая возвращает случайное число в диапазоне от 0 до >RAND_MAX включительно. Макропеременная


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.