11.5. Вычисление дисперсии, стандартного отклонения и других статистических функций
11.5. Вычисление дисперсии, стандартного отклонения и других статистических функций
Проблема
Требуется рассчитать значение одной или нескольких обычных статистических функций, например дисперсии (variance), стандартного отклонения (standard deviation), коэффициента асимметрии (skew) и эксцесса (kurtosis) для последовательности чисел.
Решение
Функцию accumulate из заголовочного файла <numeric> можно использовать для расчета многих статистических параметров, а не только для суммирования пользовательских объектов-функций. Пример 11.9 показывает, как можно вычислить значения некоторых важных статистические функций при помощи accumulate.
Пример 11.9. Статистические функции
#include <numeric>
#include <cmath>
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
using namespace std;
template<int N, class T>
T nthPnwer(T x) {
T ret = x;
for (int i=1; i < N; ++i) {
ret *= x;
}
return ret;
}
template<class T, int N>
struct SumDiffNthPower {
SumDiffNthPower(T x) : mean_(x) {};
T operator()(T sum, T current) {
return sum + nthPower<N>(current - mean_);
}
T mean_;
};
template<class T, int N, class Iter_T>
T nthMoment(Iter_T first, Iter_T last, T mean) {
size_t cnt = distance(first, last);
return accumulate(first, last, T(), SumDiffNthPower<T, N>(mean)) / cnt;
}
template<class T, class Iter_T>
T computeVariance(Iter_T first, Iter_T last, T mean) {
return nthMoment<T, 2>(first, last, mean);
}
template<class T, class Iter_T>
T computeStdDev(Iter_T first, Iter_T last, T mean) {
return sqrt(computeVariance(first, last, mean));
}
template<class T, class Iter_T>
T computeSkew(Iter_T begin, Iter_T end, T mean) {
T m3 = nthMoment<T, 3>(begin, end, mean);
T m2 = nthMoment<T, 2>(begin, end, mean);
return m3 / (m2 * sqrt(m2));
}
template<class T, class Iter_T>
T computeKurtosisExcess(Iter_T begin, Iter_T end, T mean) {
T m4 = nthMoment<T, 4>(begin, end, mean);
T m2 = nthMoment<T, 2>(begin, end, mean);
return m4 / (m2 * m2) - 3;
}
template<class T, class Iter_T>
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<int> 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() << " ";
cout << "sum = " << sum << " ";
cout << "mean = " << mean << " ";
cout << "variance = " << var << " ";
cout << "standard deviation = " << dev << " ";
cout << "skew = " << skew << " ";
cout << "kurtosis excess = " << kurt << " ";
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) ?(xi-mean)n Дисперсия ?2 Стандартное отклонение ??2 Коэффициент асимметрии ?2/?33/2 Эксцесс (?4/?2?)-3
Момент характеризует последовательность чисел. Другими словами, он определяет некий способ математического описания последовательности чисел. Моменты являются основой для расчета нескольких важных статистических функций, например дисперсии, стандартного отклонения, коэффициента асимметрии и эксцесса. Центральный момент — это момент, рассчитанный относительно среднего значения, а не нуля. Выборочный момент — это момент, рассчитанный для дискретного набора числовых значений, а не для всех значений функции. Нормализованный момент — это момент, поделенный на некоторую степень стандартного отклонения (стандартное отклонение рассчитывается как квадратный корень второго момента).
Проще всего программировать статистические функции, определяя их через моменты. Поскольку используется несколько различных моментов, каждый из которых характеризуется целочисленной константой, я передаю эту константу как параметр шаблона. Это в целом позволяет компилятору генерировать более эффективный программный код, потому что это целочисленное значение известно на этапе компиляции.
Функция момента определяется при помощи математического оператора суммы. Во всех случаях, когда речь идет об этом операторе, следует иметь в виду функцию accumulate, определенную в заголовочном файле <numeric>. Существует две разновидности функции accumulate: одна подсчитывает сумму, используя operator+, а другая использует функтор суммирования, который вы должны предоставить. Ваш функтор суммирования будет принимать значение накопленной суммы и значение конкретного элемента последовательности.
Пример 11.10 иллюстрирует работу функции accumulate, показывая, как предоставленный пользователем функтор вызывается для каждого элемента последовательности.
Пример 11.10. Пример реализации функции accumulate
template<class Iter_T, class Value_T, class BinOp_T>
Iter_T accumulate(Iter_T begin, Iter_T end, Value_T value, BinOp_T op) {
while (begin != end) {
value = op(value, *begin++)
}
return value;
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Вычисление постоянных
Вычисление постоянных Вот что мы собираемся сделать: пройтись по всем объявлениям стилей и заменить вычисление выражения его постоянным значением. В предыдущем примере, предполагая, что мы используем IE6 в стандартном режиме, нам хотелось бы видеть следующий код:#myDiv {border:
7.4. Использование стандартного брандмауэра Windows 7
7.4. Использование стандартного брандмауэра Windows 7 Возможно, вам не понравится Comodo Internet Security. Тогда некоторое время, пока вы не найдете другую подходящую программу, вам придется использовать стандартный брандмауэр Windows 7.Нужно отметить, что новый брандмауэр Windows 7 довольно
Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC Как известно, InterBase использует два типа хранимых процедур" так называемые selectable-процедуры и executeable-процедуры; при этом процедуры разного типа отличаются способом вызова в SQL. В отличие от других ODBC-
Архитектура стандартного маршалинга
Архитектура стандартного маршалинга Как уже упоминалось ранее в этой главе, СОМ использует протокол ORPC для всех обращений между апартаментами. Это обстоятельство может представлять интерес с точки зрения архитектуры, но некоторые разработчики желают программировать
Совет 46. Передавайте алгоритмам объекты функций вместо функций
Совет 46. Передавайте алгоритмам объекты функций вместо функций Часто говорят, что повышение уровня абстракции языков высокого уровня приводит к снижению эффективности сгенерированного кода. Александр Степанов, изобретатель STL, однажды разработал небольшой комплекс
12.3.5. Адаптеры функций для объектов-функций
12.3.5. Адаптеры функций для объектов-функций В стандартной библиотеке имеется также ряд адаптеров функций, предназначенных для специализации и расширения как унарных, так и бинарных объектов-функций. Адаптеры – это специальные классы, разбитые на следующие две
Использование стандартного шифрования.
Использование стандартного шифрования. Иногда вам необходимо зашифровать файл традиционным способом, с помощью шифрования с одним ключом. Это может быть полезно для зашиты файлов в архиве, которые будут сохраняться, но не будут посылаться кому-нибудь. Так как
5.7.2. Переадресация стандартного потока ввода
5.7.2. Переадресация стандартного потока ввода Рассмотрим несколько примеров переадресации стандартного потока ввода. Чтобы из командной строки отправить пользователю электронное сообщение, которое находится в файле, следует направить файл программе mail. Посредством
5.7.3. Переадресация стандартного потока ошибок
5.7.3. Переадресация стандартного потока ошибок При переадресации стандартного потока ошибок указывается дескриптор 2. Рассмотрим пример. Утилита grep ищет в файле missiles строку "trident":$ grep "trident" missilesgrep: missiles: No such file or directoryОднако в текущем каталоге нет такого файла, и
11.5.4. Чтение данных и» стандартного входного потока
11.5.4. Чтение данных и» стандартного входного потока Команда paste имеет удобную опцию — (дефис), которая позволяет принимать данные из стандартного входного потока. Каждый дефис в командной строке соответствует одной колонке выходных данных. Например, список файлов
19.11.2. Вызов функций из файла функций
19.11.2. Вызов функций из файла функций Мы уже рассматривали, каким образом функции вызываются из командной строки. Эти типы функций обычно используются утилитами, создающими системные сообщения.А теперь воспользуемся снова описанной выше функцией, но в этом случае
Требования к качеству стандартного стокового снимка
Требования к качеству стандартного стокового снимка На самом деле требований к качеству самого обыкновенного микростокового снимка достаточно много. Так много, что если начать хотя бы просто перечислять, то у того, кто не сталкивался ранее с профессиональными
11.3. Использование стандартного брандмауэра Windows 7
11.3. Использование стандартного брандмауэра Windows 7 Бастион (он же брандмауэр, он же firewall) — это пакетный фильтр, позволяющий защитить ваш компьютер от действия вредоносных программ, сетевых червей, нежелательного трафика и всевозможных атак.Разберемся, как работает