14 #ifndef PROB_DISTRIBUTION_H_INCLUDED
15 #define PROB_DISTRIBUTION_H_INCLUDED
34 #include <boost/version.hpp>
35 #include <boost/math/distributions.hpp>
36 #include <boost/math/distributions/inverse_gamma.hpp>
37 #include <boost/math/distributions/negative_binomial.hpp>
76 #if BOOST_VERSION >= 104600
83 boost::math::negative_binomial(1, p)
108 template<
class Distribution>
130 template<
class T =
int>
134 typedef std::pair<const T*, double> Cdf_pair;
135 typedef typename std::map<T, double>::value_type Map_pair;
169 const std::vector<T>& values,
170 const std::vector<double>& probabilities
210 for(
typename std::map<T,size_t>::const_iterator it = m.begin();
213 db[it->first] =
static_cast<double>(it->second);
278 const std::map<T, double>& log_map
281 typedef typename std::map<T, double>::value_type Pair;
289 std::vector<double> log_probs;
290 log_probs.reserve(log_map.size());
292 typedef typename std::map<T,double>::const_iterator iterator;
293 for(iterator it = log_map.begin(); it != log_map.end(); ++it)
295 log_probs.push_back(it->second);
298 double log_total =
kjb::log_sum(log_probs.begin(), log_probs.end());
301 for(iterator it = result.db.begin(); it != result.db.end(); ++it)
302 it->second = exp(it->second - log_total);
330 size_t count = db.erase(key);
341 void remove(
const T& key)
354 void insert (
const T& key,
double weight = 1.0)
356 size_t count = db.count(key);
360 const T* stored_key = &db.insert(std::make_pair(key, weight)).first->first;
363 total_weight_ = weight;
365 total_weight_ += weight;
367 cdf_.push_back(Cdf_pair(stored_key, total_weight_));
375 void add(
const T& key,
double weight = 1.0)
398 using namespace boost;
400 cdf_.resize(db.size());
401 if(cdf_.size() == 0)
return;
406 kjb_parallel_std::transform(
414 kjb_parallel_std::partial_sum(
418 partial_sum_second<Cdf_pair>()
421 total_weight_ = cdf_.back().second;
425 if(total_weight_ < FLT_EPSILON)
452 struct make_cdf_pair :
public std::unary_function<Cdf_pair, const Map_pair&>
454 Cdf_pair operator()(
const Map_pair& pair)
const
456 return std::make_pair(&pair.first, pair.second);
460 struct cdf_pair_less_than_scalar
462 bool operator()(
const Cdf_pair& op1,
double op2)
const
464 return op1.second < op2;
468 struct cdf_key_less_than_scalar
470 bool operator()(
const Cdf_pair& op1,
const T& op2)
const
472 return op1.first < op2;
477 struct multiply_second_by_scalar
479 multiply_second_by_scalar(
double scalar) :
483 void operator()(U& in)
const
485 in.second *= scalar_;
492 struct partial_sum_second :
public std::binary_function<U, const U&, const U&>
494 U operator()(
const U& op1,
const U& op2)
497 result.second += op1.second;
502 std::map<T, double> db;
503 std::vector<Cdf_pair> cdf_;
504 double total_weight_;
514 const std::vector<double>& ps,
518 for(std::size_t
i = 0;
i < ps.size();
i++)
520 db[
static_cast<T
>(
i + t1)] = ps[
i];
536 db[
static_cast<T
>(
i + t1)] = ps[
i];
547 const std::vector<T>& values,
548 const std::vector<double>& probabilities)
550 for(std::size_t
i = 0;
i < probabilities.size();
i++)
552 db[values[
i]] = probabilities[
i];
585 double p = 1.0 /
static_cast<int>((max - min + 1) / step);
586 for(T
x = min;
x <=
max;
x += step)
650 log_abs_det(-std::numeric_limits<double>::max())
652 IFT(
mean.get_length() == cov_mat.get_num_rows()
653 && cov_mat.get_num_rows() == cov_mat.get_num_cols(),
655 "Mean vector dimension must equal covariance matrix's"
656 "number of rows and columns.");
671 log_abs_det(-std::numeric_limits<double>::max())
674 "Mean vector dimension must equal covariance matrix's"
675 "number of rows and columns.");
700 "mean vector must have same size as covariance matrix.");
711 "mean vector must have same size as covariance matrix.");
728 "mean vector must have same size as covariance matrix.");
745 return mean.get_length();
758 void update_cov_inv()
const
760 if(cov_inv.get_num_rows() == 0)
769 void update_cov_chol()
const
771 if(cov_chol.get_num_rows() == 0)
780 void update_abs_det()
const
784 abs_det = cov_mat.abs_of_determinant();
791 void update_log_abs_det()
const;
793 friend double pdf(
const MV_gaussian_distribution&,
const Vector&);
795 friend double log_pdf(
const MV_gaussian_distribution&,
const Vector&);
797 friend Vector
sample(
const MV_gaussian_distribution&);
803 mutable Matrix cov_inv;
804 mutable Matrix cov_chol;
805 mutable double abs_det;
806 mutable double log_abs_det;
808 const static int NORMAL = 0;
809 const static int INDEPENDENT = 1;
866 template<
class Distribution>
885 const std::vector<Distribution>& distributions,
886 const std::vector<double>& coefficients
888 dists(distributions), coeffs(coefficients)
899 dists(distributions), coeffs(1.0, distributions.
size(), 1.0)
911 const Distribution& dist1,
912 const Distribution& dist2,
915 coeffs(1, 2, pi1, 1 - pi1)
917 dists.push_back(dist1);
918 dists.push_back(dist2);
945 std::vector<Distribution> dists;
953 template<
class Distribution>
992 mu_(mean.normalized()),
998 double kappa()
const {
return kappa_; }
1019 typedef std::vector<std::vector<size_t> >
Type;
1023 theta_(concentration), nc_(nc)
Represents the dependence between X and Y in p(x | y), where (x,y) is a multivariate normal...
Definition: prob_conditional_distribution.h:246
Categorical_distribution< T > & operator=(const Categorical_distribution< T > &cd)
Assignment: needed to make sure init_cdf_ gets called.
Definition: prob_distribution.h:254
Matrix cholesky_decomposition(const Matrix &M)
Definition: n_cholesky.h:35
Definition for the Matrix class, a thin wrapper on the KJB Matrix struct and its related functionalit...
Int_matrix::Value_type max(const Int_matrix &mat)
Return the maximum value in this matrix.
Definition: l_int_matrix.h:1397
const kjb::Vector_d< D > & mu() const
Definition: prob_distribution.h:996
boost::math::bernoulli Bernoulli_distribution
Definition: prob_distribution.h:60
boost::math::chi_squared Chi_square_distribution
Definition: prob_distribution.h:63
const Matrix & get_covariance_matrix() const
Gets the covariance matrix of this distribution.
Definition: prob_distribution.h:689
double kappa() const
Definition: prob_distribution.h:998
std::vector< std::vector< size_t > > Type
Definition: prob_distribution.h:1019
MV_gaussian_distribution MV_normal_distribution
Definition: prob_distribution.h:813
Von_mises_fisher_distribution(const kjb::Vector_d< D > &mean, double kappa)
Definition: prob_distribution.h:991
int get_length() const
Return the length of the vector.
Definition: m_vector.h:501
Object thrown when an argument is of the wrong size or dimensions.
Definition: l_exception.h:426
double type
Definition: prob_distribution.h:850
int get_num_rows() const
Return the number of rows in the matrix.
Definition: m_matrix.h:543
This class implements a mixture distribution. In other words, it is the sum of a finite number of fra...
Definition: prob_distribution.h:867
boost::math::inverse_gamma_distribution Inverse_gamma_distribution
Definition: prob_distribution.h:71
Mixture_distribution(const std::vector< Distribution > &distributions)
Constructs a mixture distribution with equal mixing coefficients.
Definition: prob_distribution.h:898
double concentration() const
Definition: prob_distribution.h:1026
Int_matrix create_diagonal_matrix(const Int_matrix::Vec_type &diagonal)
Construct a one-row matrix by deep-copying a vector.
Definition: l_int_matrix.cpp:118
kjb::Vector_d< D > type
Definition: prob_distribution.h:1011
boost::math::poisson Poisson_distribution
Definition: prob_distribution.h:69
Log-normal distribution.
Definition: prob_distribution.h:827
boost::math::normal Gaussian_distribution
Definition: prob_distribution.h:66
Definition: prob_distribution.h:984
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
void add(const T &key, double weight=1.0)
Definition: prob_distribution.h:375
size_t size() const
Size of this distribution.
Definition: prob_distribution.h:316
Value_type mean(Iterator begin, Iterator end, const Value_type &)
Definition: prob_stat.h:56
Chinese_restaurant_process Crp
Definition: prob_distribution.h:1041
void set_covariance_matrix(const Matrix &S, const Vector &m)
Gets the covariance matrix of this distribution.
Definition: prob_distribution.h:725
~Categorical_distribution()
Definition: prob_distribution.h:380
A categorical distribution.
Definition: prob_distribution.h:131
double beta
Definition: prob_distribution.h:96
#define IFT(a, ex, msg)
Definition: l_exception.h:101
boost::math::laplace Laplace_distribution
Definition: prob_distribution.h:67
x1
Definition: APPgetLargeConnectedEdges.m:122
double dist(const pt a, const pt b)
compute approx. Great Circle distance between two UTM points
Definition: layer.cpp:45
Categorical_distribution(const std::map< T, size_t > &m)
Constructs an empirical distribution from a map of vals to counts.
Definition: prob_distribution.h:208
void set_covariance_matrix(const Matrix &S)
Gets the covariance matrix of this distribution.
Definition: prob_distribution.h:708
Matrix matrix_inverse(const Matrix &op1)
Invert this matrix.
Definition: m_matrix.cpp:730
MV_gaussian_distribution(const Vector &mu, const Matrix &sigma)
Constructs a multivariate Gaussian with a mean of mu and a covariance matrix of sigma. sigma must be positive-definite.
Definition: prob_distribution.h:645
double n
Definition: prob_distribution.h:96
void insert(const T &key, double weight=1.0)
Definition: prob_distribution.h:354
int get_dimension() const
Gets the dimension of this distribution.
Definition: prob_distribution.h:743
Log_normal_distribution(double mu, double sigma)
Definition: prob_distribution.h:834
boost::math::beta_distribution Beta_distribution
Definition: prob_distribution.h:61
MV_normal_conditional_distribution MV_gaussian_conditional_distribution
Definition: prob_conditional_distribution.h:323
boost::math::exponential Exponential_distribution
Definition: prob_distribution.h:64
double type
Definition: prob_distribution.h:111
A conditional distribution.
Definition: prob_conditional_distribution.h:62
x
Definition: APPgetLargeConnectedEdges.m:100
Generic traits struct for all distributions.
Definition: prob_distribution.h:109
static Categorical_distribution< T > construct_from_log_map(const std::map< T, double > &log_map)
Definition: prob_distribution.h:277
const Gaussian_distribution STD_NORMAL
Definition: prob_distribution.cpp:12
double log_pdf(const MV_gaussian_distribution &P, const Vector &x)
Computes the log PDF a multivariate normal distribution at x.
Definition: prob_pdf.cpp:64
Multivariate Gaussian (normal) distribution.
Definition: prob_distribution.h:619
friend double cdf(const Categorical_distribution< U > &dist, const U &x)
Definition: prob_distribution.h:79
Matrix create_identity_matrix(int rank)
Construct an identity matrix of specified rank.
Definition: m_matrix.h:1795
Log_normal_distribution()
Definition: prob_distribution.h:830
boost::math::binomial Binomial_distribution
Definition: prob_distribution.h:62
#define KJB_THROW_2(ex, msg)
Definition: l_exception.h:48
count
Definition: APPgetLargeConnectedEdges.m:71
Chinese_restaurant_process::Type type
Definition: prob_distribution.h:1037
x2
Definition: APPgetLargeConnectedEdges.m:123
Various utility functions for probabiliity-related stuff.
Matrix & resize(int new_rows, int new_cols, Value_type pad=Value_type(0))
Resize this matrix, retaining previous values. Space is reused if possible. Otherwise requires a new ...
Definition: m_matrix.cpp:457
Beta_binomial_distribution(size_t n_, double alpha_, double beta_)
Definition: prob_distribution.h:92
Int_matrix::Value_type min(const Int_matrix &mat)
Return the minimum value in this matrix.
Definition: l_int_matrix.h:1385
boost::math::normal Normal_distribution
Definition: prob_distribution.h:68
T type
Definition: prob_distribution.h:600
Distribution_traits< Distribution >::type type
Definition: prob_distribution.h:956
Object thrown when an argument to a function is not acceptable.
Definition: l_exception.h:377
void erase(const T &key)
Definition: prob_distribution.h:328
Definition: g_quaternion.h:37
size_t num_customers() const
Definition: prob_distribution.h:1027
Categorical_distribution(const T &x1, const T &x2, double p1, double p2)
Creates a two-element categorical distribution.
Definition: prob_distribution.h:239
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Categorical_distribution(const std::map< T, double > &d)
Constructs a categorical distribution over a set of values.
Definition: prob_distribution.h:197
Geometric_distribution(double p)
Definition: prob_distribution.h:82
friend U sample(const Categorical_distribution< U > &dist)
This class implements matrices, in the linear-algebra sense, with real-valued elements.
Definition: m_matrix.h:94
const Vector & get_mean() const
Gets the mean of this distribution.
Definition: prob_distribution.h:681
boost::math::uniform Uniform_distribution
Definition: prob_distribution.h:70
for m
Definition: APPgetLargeConnectedEdges.m:64
D
Definition: APPgetLargeConnectedEdges.m:106
double log_sum(double n1, double n2)
Definition: prob_util.h:66
Support for error handling exception classes in libKJB.
Definition: prob_distribution.h:89
double alpha
Definition: prob_distribution.h:96
Categorical_distribution()
Construct an empty distribution.
Definition: prob_distribution.h:139
void set_mean(const Vector &m)
Gets the mean of this distribution.
Definition: prob_distribution.h:697
boost::math::gamma_distribution Gamma_distribution
Definition: prob_distribution.h:65
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...
Vector type
Definition: prob_distribution.h:821
friend double pdf(const Categorical_distribution< U > &dist, const U &x)
MV_gaussian_distribution(int d)
Constructs a d-dimensinoal multivariate Gaussian with a mean of zero and a covariance matrix of ident...
Definition: prob_distribution.h:629
MV_gaussian_distribution(const Vector &mu, const Vector &sigma_diag)
Constructs a multivariate Gaussian with a mean of mu and a covariance matrix diag(sigma_diag).
Definition: prob_distribution.h:666
Definition: prob_distribution.h:1016
Chinese_restaurant_process(double concentration, size_t nc)
Definition: prob_distribution.h:1022
Categorical_distribution(const Categorical_distribution< T > &cd)
Copy-ctor: needed to make sure init_cdf_ gets called.
Definition: prob_distribution.h:247