skew = computeSkew(first, last, mean);
kurt = computeKurtosisExcess(first, last, mean);
}
int main() {
vector
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.
Статистическая функция | Формула |
---|---|
n-й центральный момент (μn) | ∑(xi-mean)n |
Дисперсия | μ2 |
Стандартное отклонение | √μ2 |
Коэффициент асимметрии | μ2/μ33/2 |
Эксцесс | (μ4/μ2²)-3 |
Проще всего программировать статистические функции, определяя их через моменты. Поскольку используется несколько различных моментов, каждый из которых характеризуется целочисленной константой, я передаю эту константу как параметр шаблона. Это в целом позволяет компилятору генерировать более эффективный программный код, потому что это целочисленное значение известно на этапе компиляции.
Функция момента определяется при помощи математического оператора суммы. Во всех случаях, когда речь идет об этом операторе, следует иметь в виду функцию accumulate
, определенную в заголовочном файле
. Существует две разновидности функции accumulate
: одна подсчитывает сумму, используя operator+
, а другая использует функтор суммирования, который вы должны предоставить. Ваш функтор суммирования будет принимать значение накопленной суммы и значение конкретного элемента последовательности.
Пример 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++)
}