STK++ 0.9.13
STK::Gamma_aj_bk< Array > Class Template Reference

Gamma_aj_bk is a mixture model of the following form. More...

#include <STK_Gamma_aj_bk.h>

Inheritance diagram for STK::Gamma_aj_bk< Array >:
Inheritance graph

Public Types

typedef GammaBase< Gamma_aj_bk< Array > > Base
 
- Public Types inherited from STK::GammaBase< Gamma_aj_bk< Array > >
typedef IMixtureDensity< Gamma_aj_bk< Array > > Base
 
- Public Types inherited from STK::IMixtureDensity< Derived >
typedef hidden::MixtureTraits< Derived >::Array Array
 
typedef hidden::MixtureTraits< Derived >::Parameters Parameters
 
typedef hidden::Traits< Array >::Type Type
 

Public Member Functions

 Gamma_aj_bk (int nbCluster)
 default constructor
 
 Gamma_aj_bk (Gamma_aj_bk const &model)
 copy constructor
 
 ~Gamma_aj_bk ()
 destructor
 
void randomInit (CArrayXX const *const &p_tik, CPointX const *const &p_tk)
 Initialize randomly the parameters of the Gamma mixture.
 
bool run (CArrayXX const *const &p_tik, CPointX const *const &p_tk)
 Compute the run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) .
 
int computeNbFreeParameters () const
 
- Public Member Functions inherited from STK::GammaBase< Gamma_aj_bk< Array > >
Real shape (int k, int j) const
 
Real scale (int k, int j) const
 
void initializeModelImpl ()
 Initialize the parameters of the model.
 
Real lnComponentProbability (int i, int k) const
 
Real impute (int i, int j, Weights const &pk) const
 
Real rand (int i, int j, int k) const
 
void getParameters (Array &params) const
 This function is used in order to get the current values of the parameters in an array of size (2*nbCluster, nbVariable).
 
void writeParameters (CArrayXX const *p_tik, ostream &os) const
 This function can be used to write summary of parameters to the output stream.
 
Array const *constp_data () const
 
- Public Member Functions inherited from STK::IMixtureDensity< Derived >
 ~IMixtureDensity ()
 destructor
 
int nbCluster () const
 
int nbSample () const
 
Real lnNbSample () const
 
Array const *constp_data () const
 
Parameters constparam () const
 
void setData (Array const &data)
 Set the data set.
 
void setData (Array const &data, int nbRow, int nbCol, bool byRow=true)
 Set the data set and give dimensions.
 
bool initializeStep ()
 This function will be called at the beginning of the estimation process once the model is created and data is set.
 
void setParametersStep ()
 set the parameters obtained with the intermediate results and release the intermediate results.
 
void finalizeStep ()
 This function will be called once the model is estimated.
 
template<class Weights >
Type sample (int i, int j, Weights const &tk) const
 
- Public Member Functions inherited from STK::IRecursiveTemplate< Derived >
Derived & asDerived ()
 static cast : return a reference of this with a cast to the derived class.
 
Derived constasDerived () const
 static cast : return a const reference of this with a cast to the derived class.
 
Derived * asPtrDerived ()
 static cast : return a ptr on a Derived of this with a cast to the derived class.
 
Derived constasPtrDerived () const
 static cast : return a ptr on a constant Derived of this with a cast to the derived class.
 
Derived * clone () const
 create a leaf using the copy constructor of the Derived class.
 
Derived * clone (bool isRef) const
 create a leaf using the copy constructor of the Derived class and a flag determining if the clone is a reference or not.
 

Additional Inherited Members

- Public Attributes inherited from STK::GammaBase< Gamma_aj_bk< Array > >
Parameters param_
 parameters of the derived mixture model.
 
- Protected Member Functions inherited from STK::GammaBase< Gamma_aj_bk< Array > >
 GammaBase (int nbCluster)
 default constructor
 
 GammaBase (GammaBase const &model)
 copy constructor
 
 ~GammaBase ()
 destructor
 
Real qValue (CArrayXX const *p_tik, CPointX const *p_tk) const
 compute the Q(theta) value.
 
bool moments (CArrayXX const *p_tik)
 compute the weighted moments of a gamma mixture.
 
Real meanjk (int j, int k)
 get the weighted mean of the jth variable of the kth cluster.
 
Real variancejk (int j, int k)
 get the weighted variance of the jth variable of the kth cluster.
 
Real meank (int k)
 get the mean of the weighted means of the kth cluster.
 
Real variancek (int k)
 get the mean of the weighted variances of the kth cluster.
 
- Protected Member Functions inherited from STK::IMixtureDensity< Derived >
 IMixtureDensity (int nbCluster)
 Default constructor.
 
 IMixtureDensity (IMixtureDensity const &model)
 copy constructor.
 
void initializeModel ()
 Initialize the model before its first use.
 
bool initializeStepImpl ()
 default implementation of initializeStepImpl (do nothing and return true)
 
void finalizeStepImpl ()
 default implementation of finalizeStepImpl (do nothing)
 
void setNbSample (int nbSample)
 Set the number of sample of the model (needed by kernel models)
 
- Protected Member Functions inherited from STK::IRecursiveTemplate< Derived >
 IRecursiveTemplate ()
 constructor.
 
 ~IRecursiveTemplate ()
 destructor.
 
- Protected Attributes inherited from STK::IMixtureDensity< Derived >
Parameters param_
 parameters of the derived mixture model.
 

Detailed Description

template<class Array>
class STK::Gamma_aj_bk< Array >

Gamma_aj_bk is a mixture model of the following form.

\[
    f(\mathbf{x}_i|\theta) = \sum_{k=1}^K p_k
    \prod_{j=1}^p\left(\frac{x_i^j}{b_{k}}\right)^{a_{j}-1}
                  \frac{e^{-x_i^j/b_{k}}}{b_{k} \, \Gamma(a_{j})},
     \quad x_i^j>0, \quad i=1,\ldots,n.
\]

Definition at line 73 of file STK_Gamma_aj_bk.h.

Member Typedef Documentation

◆ Base

Definition at line 76 of file STK_Gamma_aj_bk.h.

Constructor & Destructor Documentation

◆ Gamma_aj_bk() [1/2]

template<class Array >
STK::Gamma_aj_bk< Array >::Gamma_aj_bk ( int  nbCluster)
inline

default constructor

Parameters
nbClusternumber of cluster in the model

Definition at line 86 of file STK_Gamma_aj_bk.h.

86: Base(nbCluster) {}
GammaBase< Gamma_aj_bk< Array > > Base

◆ Gamma_aj_bk() [2/2]

template<class Array >
STK::Gamma_aj_bk< Array >::Gamma_aj_bk ( Gamma_aj_bk< Array > const model)
inline

copy constructor

Parameters
modelThe model to copy

Definition at line 90 of file STK_Gamma_aj_bk.h.

90: Base(model) {}

◆ ~Gamma_aj_bk()

template<class Array >
STK::Gamma_aj_bk< Array >::~Gamma_aj_bk ( )
inline

destructor

Definition at line 92 of file STK_Gamma_aj_bk.h.

92{}

Member Function Documentation

◆ computeNbFreeParameters()

template<class Array >
int STK::Gamma_aj_bk< Array >::computeNbFreeParameters ( ) const
inline
Returns
the number of free parameters of the model

Definition at line 102 of file STK_Gamma_aj_bk.h.

103 { return(this->nbCluster()+p_data()->sizeCols());}

References STK::IMixtureDensity< Derived >::nbCluster(), and STK::GammaBase< Gamma_aj_bk< Array > >::p_data().

◆ randomInit()

template<class Array >
void STK::Gamma_aj_bk< Array >::randomInit ( CArrayXX const *const p_tik,
CPointX const *const p_tk 
)

Initialize randomly the parameters of the Gamma mixture.

The shape will be selected randomly using an exponential of parameter mean^2/variance and the scale will be selected randomly using an exponential of parameter variance/mean.

Definition at line 111 of file STK_Gamma_aj_bk.h.

112{
113 // compute moments
114 this->moments(p_tik);
115 // simulate aj
116 for (int j=p_data()->beginCols(); j < p_data()->endCols(); ++j)
117 {
118 Real value= 0.;
119 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
120 {
121 Real mean = meanjk(j,k), variance = variancejk(j,k);
122 value += p_tk->elt(k) * mean*mean/variance;
123 }
124 param_.shape_[j] = Law::Exponential::rand(value/(this->nbSample()));
125 }
126 // simulates bk
127 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
128 { param_.scale_[k] = Law::Exponential::rand((this->variancek(k)/this->meank(k)));}
129#ifdef STK_MIXTURE_VERY_VERBOSE
130 stk_cout << _T(" Gamma_aj_bk<Array>::randomInit done\n");
131#endif
132}
#define stk_cout
Standard stk output stream.
#define _T(x)
Let x unmodified.
Real meank(int k)
get the mean of the weighted means of the kth cluster.
Real variancek(int k)
get the mean of the weighted variances of the kth cluster.
Parameters param_
parameters of the derived mixture model.
Real meanjk(int j, int k)
get the weighted mean of the jth variable of the kth cluster.
bool moments(CArrayXX const *p_tik)
compute the weighted moments of a gamma mixture.
Real variancejk(int j, int k)
get the weighted variance of the jth variable of the kth cluster.
virtual Real rand() const
Generate a pseudo Exponential random variate.
double Real
STK fundamental type of Real values.
hidden::SliceVisitorSelector< Derived, hidden::MeanVisitor, Arrays::by_col_ >::type_result mean(Derived const &A)
If A is a row-vector or a column-vector then the function will return the usual mean value of the vec...
hidden::FunctorTraits< Derived, VarianceOp >::Row variance(Derived const &A, bool unbiased=false)
Compute the variance(s) value(s) of A.

References _T, STK::mean(), STK::Law::Exponential::rand(), and stk_cout.

◆ run()

template<class Array >
bool STK::Gamma_aj_bk< Array >::run ( CArrayXX const *const p_tik,
CPointX const *const p_tk 
)

Compute the run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) .

Definition at line 136 of file STK_Gamma_aj_bk.h.

137{
138 bool flag = true;
139 if (!this->moments(p_tik)) { flag = false;}
140 // start estimations of the ajk and bj
141 Real qvalue = this->qValue(p_tik, p_tk);
142 // enter iterative algorithm
143 int iter;
144 for(iter = 0; iter<MAXITER; ++iter)
145 {
146 // compute aj
147 for (int j=p_data()->beginCols(); j<p_data()->endCols(); ++j)
148 {
149 // moment estimate and oldest value
150 Real y = 0, x0 = 0;
151 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
152 {
153 Real mean = meanjk(j,k), variance = variancejk(j,k);
154 y += p_tk->elt(k) * (param_.meanLog_[k][j] - std::log(param_.scale_[k]));
155 x0 += p_tk->elt(k) * mean*mean/variance;
156 }
157 y /= this->nbSample();
158 x0/= this->nbSample();
159 Real x1 = param_.shape_[j];
160 if ((x0 <=0.) || !Arithmetic<Real>::isFinite(x0))
161 { x0 = 1; flag = false;}
162 // compute shape
163 hidden::invPsi f(y);
164 Real a = x0; // use moment estimate
165 try
166 {
167 a = Algo::findZero(f, x0, x1, 1e-08);
168 }
169 catch (...)
170 {
171 #ifdef STK_MIXTURE_DEBUG
172 stk_cout << "ML estimation failed in Gamma_aj_bk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) \n";
173 stk_cout << "x0 =" << x0 << _T("\n";);
174 stk_cout << "f(x0) =" << f(x0) << _T("\n";);
175 stk_cout << "x1 =" << x1 << _T("\n";);
176 stk_cout << "f(x1) =" << f(x1) << _T("\n";);
177 #endif
178 a = x0; // use moment estimate
179 flag = false;
180 }
182 {
183#ifdef STK_MIXTURE_DEBUG
184 stk_cout << _T("ML estimation failed in Gamma_aj_bk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) \n");
185 stk_cout << "x0 =" << x0 << _T("\n";);
186 stk_cout << "f(x0) =" << f(x0) << _T("\n";);
187 stk_cout << "x1 =" << x1 << _T("\n";);
188 stk_cout << "f(x1) =" << f(x1) << _T("\n";);
189#endif
190 a = 1.;
191 flag = false;
192 }
193 param_.shape_[j] = a;
194 // compute bk
195 Real sum = param_.shape_.sum();
196 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
197 { // update bk
198 param_.scale_[k] = param_.mean_[k].sum()/sum;
199 }
200 }
201 // check convergence
202 Real value = this->qValue(p_tik, p_tk);
203#ifdef STK_MIXTURE_VERBOSE
204 if (value < qvalue)
205 {
206 stk_cout << _T("In Gamma_aj_bk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) : run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) diverge\n");
207 stk_cout << _T("New value =") << value << _T(", qvalue =") << qvalue << _T("\n");
208 }
209#endif
210 if ((value - qvalue) < TOL) break;
211 qvalue = value;
212 }
213#ifdef STK_MIXTURE_VERBOSE
214 if (iter == MAXITER)
215 {
216 stk_cout << _T("In Gamma_aj_bk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) : run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) did not converge\n");
217 stk_cout << _T("qvalue =") << qvalue << _T("\n");
218 }
219#endif
220 return flag;
221}
#define TOL
#define MAXITER
Real qValue(CArrayXX const *p_tik, CPointX const *p_tk) const
compute the Q(theta) value.
Real findZero(IFunction< Function > const &f, Real const &x0, Real const &x1, Real tol)
find the zero of a function.
Arrays::SumOp< Lhs, Rhs >::result_type sum(Lhs const &lhs, Rhs const &rhs)
convenience function for summing two arrays
static bool isFinite(Type const &x)

References _T, STK::Algo::findZero(), MAXITER, STK::mean(), stk_cout, STK::sum(), and TOL.


The documentation for this class was generated from the following file: