使用boost查找数据集的峰度

时间:2013-03-05 12:11:35

标签: c++ boost

我有一个数据向量,我想找到数据集的峰度。我想用Boost这样做,这是我到目前为止(不可编译):

#include <boost/math/distributions.hpp>
using namespace std;

int main()
{
    vector<double> a;
    a.push_back(-1);
    a.push_back(0);
    a.push_back(1);

    cout << "Kurtosis:"<< kurtosis(a) << endl;
    return 0;
}

为什么这不起作用?我的编译器给了我错误:“[...] \ main.cpp | 28 |错误:'kurtosis'未在此范围内声明|”

1 个答案:

答案 0 :(得分:1)

如果你没有包含kurtosis的标题:

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

即使您这样做了,因为您认为它不适用于直线vector,您可能要做的是使用accumulator_set以及更多标题。

以下是使用accumulator_set的最小示例,这显示了两种解决问题的方法:

#include <boost/math/distributions.hpp>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/mean.hpp>
#include <boost/accumulators/statistics/variance.hpp>
#include <boost/accumulators/statistics/kurtosis.hpp>
#include <iostream>
#include <vector>

using namespace boost::accumulators;

int main()
{
    accumulator_set<double, stats<tag::mean, tag::kurtosis > > acc;
    accumulator_set<double, stats<tag::mean, tag::kurtosis > > acc2;

    acc(2) ;
    acc(3) ;
    acc(4) ;

    std::cout << mean(acc) << " " << kurtosis(acc) << std::endl ;

    std::vector<double> v1 ;

    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);

    acc2 = std::for_each( v1.begin(), v1.end(), acc2 ) ;

    std::cout << mean(acc2) << " " << kurtosis(acc2) << std::endl ;
}

以下是指向Accumulators Framework User's Guide的链接。本指南有一些很好的例子。

之前的thread找到了一种使用vector的方式,虽然它根本不是直截了当的,但我无法让它发挥作用。