1 #include "../frequency/frequencydistribution.h"
18 size_t fSize = f.size();
19 unsigned long fSum = accumulate(f.begin(), f.end(), 0);
21 for(
size_t i = 0; i < fSize; i++)
33 unsigned int num = distributions.size();
34 unsigned int length = 0;
35 for (
unsigned int i=0; i<num; i++)
37 unsigned int l = distributions[i]->size();
43 for (
unsigned int i=0; i<num; i++)
45 unsigned int l = distributions[i]->size();
46 for (
unsigned int j=0; j<l; j++)
48 this->
frequencies[j] += distributions[i]->frequencies[j];
54 for(
size_t i = 0; i < fSize; i++)
55 probabilities.push_back(
double(this->frequencies[i]) / this->frequencysum);
58 std::clog <<
"FrequencyDistribution::FrequencyDistribution - WARNING: returning empty frequency distribution" << std::endl;
83 std::clog <<
"FrequencyDistribution::probability - WARNING: returning zero, index out of bound" << std::endl;
92 std::vector<double> temp;
93 for(
unsigned int i=0;i < this->
frequencies.size(); i++)
99 temp.push_back(p*log(p));
103 std::sort(temp.begin(), temp.end());
104 return -accumulate(temp.begin(), temp.end(), .0)/log(2);
111 if (fdlength!=length)
113 std::cerr <<
"FrequencyDistribution::kullbackleibler - ERROR: frequency distributions have different lengths! ("
114 << fdlength <<
"!=" << length <<
")" << std::endl;
115 return std::numeric_limits<double>::quiet_NaN();
122 return std::numeric_limits<double>::infinity();
124 std::vector<double> temp;
125 for(
unsigned int i=0; i<length; i++)
130 return std::numeric_limits<double>::infinity();
139 temp.push_back(p*log(r));
140 }
else return std::numeric_limits<double>::infinity();
144 std::sort(temp.begin(), temp.end());
145 return accumulate(temp.begin(), temp.end(), .0)/log(2);
150 unsigned int dimension = fd.
size();
151 os <<
"FrequencyDistribution(";
152 for (
unsigned int i=0;i<dimension;i++)
156 os <<
"sum=" << fd.
total() <<
")";
virtual double probability(unsigned int) const
virtual unsigned long frequency(unsigned int) const
virtual double entropy() const
Probability distribution on non-negative integers.
std::vector< unsigned long > frequencies
virtual unsigned int size() const
virtual double kullbackleibler(FrequencyDistribution const &) const
FrequencyDistribution(std::vector< unsigned long > const &f)
constructs the centroid of the given vector of FrequencyDistribution objects.
std::vector< double > probabilities
virtual unsigned long total() const
unsigned long frequencysum
std::ostream & operator<<(std::ostream &, FrequencyDistribution &)