28 template <
typename TYPE>
44 _mass(0.0), _numBins(n), _bins(NULL), _min(minVal), _max(maxVal) {
45 DRWN_ASSERT(minVal < maxVal);
46 _bins = (TYPE *)malloc(
sizeof(TYPE)*n);
47 memset(_bins, 0,
sizeof(TYPE)*n);
48 _alpha = ((double)_numBins) / (_max - _min);
54 _mass(h._mass), _numBins(h._numBins), _bins(NULL), _min(h._min), _max(h._max),
55 _alpha(h._alpha), _beta(h._beta) {
56 _bins = (TYPE *)malloc(
sizeof(TYPE) * _numBins);
57 memcpy(_bins, h._bins,
sizeof(TYPE) * _numBins);
68 inline void addSample(TYPE s) {
69 addWeightedSample(s, 1.0);
72 void addWeightedSample(TYPE s,
double w) {
73 const int binIndex = computeBin(s);
79 const double oldmass = _mass;
81 for (
int i = 0; i < _numBins; i++) {
83 _bins[i] = (oldmass * _bins[i] + w) / _mass;
85 _bins[i] = oldmass * _bins[i] / _mass;
91 void appendToFile(FILE* fp)
const {
92 fprintf(fp,
"%d\n", _numBins);
93 for (
int i = 0; i < _numBins; i++) {
94 fprintf(fp,
"%lf%s", (
double)_bins[i], (i == _numBins - 1) ?
"\n" :
" ");
102 DRWN_ASSERT(H._numBins == _numBins);
105 for (
int i = 0; i < _numBins; i++) {
106 const double a = _bins[i] + H._bins[i];
107 if (a == 0.0)
continue;
109 double b = _bins[i] - H._bins[i];
117 memset(_bins, 0,
sizeof(TYPE)*_numBins);
120 int computeBin(
const TYPE& s)
const {
125 }
else if (s >= _max) {
126 binIndex = _numBins - 1;
128 binIndex = std::max((
int)(_alpha * (s - _min)), _numBins - 1);
134 double entropy()
const {
135 double entropy = 0.0;
136 for (
int i = 0; i < _numBins; i++) {
137 entropy -= (_bins[i] == 0) ? 0.0 : _bins[i] * log((
double)_bins[i]);
142 void convertInternalToCDF() {
143 for (
int i = 1; i < _numBins; i++) {
144 _bins[i] += _bins[i-1];
149 DRWN_ASSERT(H._numBins == _numBins);
152 for (
int i = 0; i < _numBins; i++) {
153 euc += (_bins[i] - H._bins[i]) * (_bins[i] - H._bins[i]);
159 double getBinCenter(
int b)
const {
return _min + _beta*(double)b + (_beta / 2.0); }
160 double getBinLeft(
int b)
const {
return _min + _beta*(double)b; }
161 double getBinRight(
int b)
const {
return _min + _beta*(double)(b+1); }
162 double getBinMass(
int i)
const {
return _bins[i] * _mass; }
163 double getBinWeight(
int i)
const {
return _bins[i]; }
165 double getBinWeightMax()
const {
166 double m = getBinWeight(0);
167 for (
int i = 1; i < _numBins; i++) {
168 m = std::max(m, getBinWeight(i));
173 double getBinWeightMax(
int &binIndex)
const {
174 double m = getBinWeight(0);
176 for (
int i = 1; i < _numBins; i++) {
177 const double mm = getBinWeight(i);
187 double getBinWeightSum()
const {
189 for (
int i = 0; i < _numBins; i++) {
190 sum += getBinWeight(i);
195 double getLikelihood(
const TYPE& d)
const {
return _bins[computeBin(d)]; }
197 double getMass()
const {
return _mass; }
198 double getMax()
const {
return _max; }
199 double getMin()
const {
return _min; }
200 int getNumberOfBins()
const {
return _numBins; }
203 DRWN_ASSERT(_numBins == H._numBins);
206 for (
int i = 0; i < _numBins; i++) {
207 val += std::min(_bins[i], H._bins[i]);
221 for (
int i = 0; i < _numBins; i++) {
222 if ((_bins[i] != 0) && (H._bins[i] != 0)) {
223 d += _bins[i] * log(_bins[i]/H._bins[i]);
231 for (
int i = 0; i < _numBins; i++) {
232 d += fabs(_bins[i] - H._bins[i]);
238 for (
int i = 0; i < _numBins; i++) {
239 _bins[i] = (_bins[i] + H._bins[i]) / 2.0;
241 _mass += H.getMass();
247 for (
int i = 0; i < _numBins; i++) {
248 _bins[i] += H._bins[i] * w;
254 double invSum = 1.0 / H->getBinWeightSum();
255 for (
int i = 0; i < _numBins; i++) {
256 _bins[i] = invSum * H->_bins[i];
void mergeWeightedHistogram(const drwnHistogram &H, double w)
only works for the case that the initial histogram here is 0 mass
Definition: drwnHistogram.h:246
~drwnHistogram()
destructor
Definition: drwnHistogram.h:61
double chiSquared(const drwnHistogram &H) const
compute and return the chi-squared distance between the two histograms d(x,y) = sum( (xi-yi)^2 / (xi+...
Definition: drwnHistogram.h:101
double klDivergence(const drwnHistogram &H) const
compute the one-way kldivergence from this to H
Definition: drwnHistogram.h:219
double klDistance(const drwnHistogram &H) const
compute the symmetric kl Difference (averaging the two assymetric)
Definition: drwnHistogram.h:214
drwnHistogram(int n, double minVal, double maxVal)
constructor
Definition: drwnHistogram.h:43
drwnHistogram(const drwnHistogram &h)
copy constructor
Definition: drwnHistogram.h:53
Implements a simple templated histogram class.
Definition: drwnHistogram.h:29