2013-03-05 7 views
6

Ho un vettore di dati e voglio trovare la curtosi del set di dati. Volevo farlo con Boost e qui è quello che ho finora (non compilabile):trovare kurtosis per un set di dati con 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; 
} 

Perché non funziona? Il mio compilatore mi dà l'errore: "[...] \ main.cpp | 28 | errore: 'kurtosis' non è stato dichiarato in questo ambito |"

+3

Se non viene compilato, inserire l'errore del compilatore – mathematician1975

+1

La funzione è in un altro spazio dei nomi, è necessario utilizzare 'boost :: some :: namespace :: kurtosis (a)'. Sostituisci 'some :: namespace' con lo spazio dei nomi effettivo (che non so). –

+1

Disclaimer: Non ne so abbastanza del dominio del problema per essere assolutamente sicuro di quello che sto dicendo. La mia ipotesi è che gli algoritmi in funzionano solo con [distribuzioni predefinite parametrizzate] (http://www.boost.org/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref /dists.html). Un'alternativa che utilizza i set di dati potrebbe essere [Boost.Accumulators] (http://www.boost.org/libs/accumulators). [Qui] (http://liveworkspace.org/code/2cDjQ9$0) è un esempio. –

risposta

1

Per uno non eri con l'indicazione dell'header per kurtosis:

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

Anche se l'avete fatto, come si vede non funziona con un dritto vector, quello che probabilmente vuole fare è utilizzare un accumulator_set e più intestazioni pure.

Ecco un esempio minimo utilizzando accumulator_set, questo mostra un due metodi per risolvere il problema:

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

Ecco un link alla Accumulators FrameworkUser's Guide. Questa guida ha alcuni buoni esempi.

Questo precedente thread ha trovato un modo per utilizzare vector, anche se non è affatto lineare e non ho potuto farlo funzionare.

Problemi correlati