KrisLibrary  1.0.0
GaussianMixtureModel.h
1 #ifndef STATISTICS_GMM_H
2 #define STATISTICS_GMM_H
3 
4 #include <KrisLibrary/math/gaussian.h>
5 #include <KrisLibrary/math/vector.h>
6 #include <KrisLibrary/math/matrix.h>
7 #include <vector>
8 
9 namespace Statistics {
10  using namespace Math;
11 
16 {
17 public:
19  GaussianMixtureModel(int k,int d);
21 
22  int NumDims() const;
23  void Resize(int k,int d);
24  void SetLinearTransform(const GaussianMixtureModel& gmm,const Matrix& A,const Vector& b);
25 
33  bool TrainEM(const std::vector<Vector>& examples,Real& tol,int maxIters,int verbose=0);
34  bool TrainDiagonalEM(const std::vector<Vector>& examples,Real& tol,int maxIters,int verbose=0);
35 
37  Real LogLikelihood(const std::vector<Vector>& data);
38 
39  int PickGaussian() const;
40  Real Probability(const Vector& x) const;
41  void Generate(Vector& x) const;
42  void GetMean(Vector& x) const;
43  void GetMode(Vector& x) const;
44  void GetCovariance(Matrix& cov) const;
45  void GetVariance(Vector& var) const;
46 
47  //Sets this GMM to exactly k sampled components, with each component
48  //sampled with probability proportional to phi[i]. Stratified sampling
49  //is used if k > phi.size(). Otherwise, they are picked using weighted
50  //sampling without replacement.
51  void Resample(int k);
52  //Resamples and refits the GMM to exactly k sampled components. Fitting
53  //is done by selecting the original component that minimizes KL divergence
54  //to the resampled component
55  void Cluster(const GaussianMixtureModel& gmm,int k);
56 
57  std::vector<Gaussian<Real> > gaussians;
58  std::vector<Real> phi;
59 };
60 
61 std::ostream& operator << (std::ostream& out,const GaussianMixtureModel& gmm);
62 std::istream& operator >> (std::istream& in,GaussianMixtureModel& gmm);
63 
69 {
70 public:
72  GaussianMixtureModelRaw(int k,int d);
75 
76  void Set(const GaussianMixtureModel& gmm);
77  bool Get(GaussianMixtureModel& gmm) const;
78  int NumDims() const;
79  void Resize(int k,int d);
80  void SetLinearTransform(const GaussianMixtureModelRaw& gmm,const Matrix& A,const Vector& b);
81  void SetSubset(const GaussianMixtureModelRaw& gmm,const std::vector<int>& keptIndices);
82  void SetMarginalized(const GaussianMixtureModelRaw& gmm,const std::vector<int>& dropIndices);
83  void SetCombination(const std::vector<GaussianMixtureModelRaw>& gmms,const std::vector<Real>& weights);
84  int PickGaussian() const;
85  void GetMean(Vector& x) const;
86  void GetMode(Vector& x) const;
87  void GetCovariance(Matrix& cov) const;
88  void GetVariance(Vector& var) const;
89 
90  //Sets this GMM to exactly k sampled components, with each component
91  //sampled with probability proportional to phi[i]. Stratified sampling
92  //is used if k > phi.size(). Otherwise, they are picked using weighted
93  //sampling without replacement.
94  void Resample(int k);
95  //Resamples and refits the GMM to exactly k sampled components. Fitting
96  //is done by selecting the original component that minimizes KL divergence
97  //to the resampled component
98  void Cluster(const GaussianMixtureModel& gmm,int k);
99 
100  std::vector<Vector> means;
101  std::vector<Matrix> covariances;
102  std::vector<Real> phi;
103 };
104 
105 std::ostream& operator << (std::ostream& out,const GaussianMixtureModelRaw& gmm);
106 std::istream& operator >> (std::istream& in,GaussianMixtureModelRaw& gmm);
107 
109 {
110  public:
111  void Set(const Gaussian<Real>& g,const std::vector<int>& xindices,const std::vector<int>& yindices);
112  void Set(const Vector& mean,const Matrix& cov,const std::vector<int>& xindices,const std::vector<int>& yindices);
113  void GetY(const Vector& x,Vector& ymean,Matrix& ycov) const;
114  void GetY(const Vector& x,Gaussian<Real>& y) const;
115  void GetY(const Vector& xmean,const Matrix& xcov,Vector& ymean,Matrix& ycov) const;
116  void GetJoint(const Vector& xmean,const Matrix& xcov,Vector& xymean,Matrix& xycov) const;
117  void GetLinearEquation(Matrix& A,Vector& b) const;
118  void GetNoiseCovariance(Matrix& sigma) const;
119 
120  Vector xmean,ymean,b;
121  Matrix ycov,yxcov,xcovinv;
122  Matrix A;
123 };
124 
126 {
127  public:
131  void SetXIndices(const std::vector<int>& xindices);
132  Real ProbabilityX(const Vector& x) const;
133  void GetY(const Vector& x,GaussianMixtureModelRaw& ygmm) const;
134  void GetY(const Vector& x,GaussianMixtureModel& ygmm) const;
135  void GetY(const Vector& xmean,const Matrix& xcov,GaussianMixtureModelRaw& ygmm) const;
136  void GetJoint(const Vector& xmean,const Matrix& xcov,GaussianMixtureModelRaw& xygmm) const;
137 
138  GaussianMixtureModel joint;
139  std::vector<int> xindices,yindices;
141  std::vector<GaussianRegression> regressions;
142 };
143 
144 } //namespace Statistics
145 
146 #endif
std::vector< Real > phi
phi[i] gives probability of choosing gaussian[i]
Definition: GaussianMixtureModel.h:58
std::vector< Real > phi
phi[i] gives probability of choosing gaussian[i]
Definition: GaussianMixtureModel.h:102
Contains all definitions in the statistics directory.
Definition: BernoulliDistribution.h:6
A more ``raw&#39;&#39; model of a GMM that does not perform a cholesky decomposiition.
Definition: GaussianMixtureModel.h:68
Definition: GaussianMixtureModel.h:125
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
A model of a probability distribution consisting of k gaussians.
Definition: GaussianMixtureModel.h:15
Definition: GaussianMixtureModel.h:108