STK++ 0.9.13
STK_Gamma_a_bjk.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright (C) 2004-2016 Serge Iovleff, Université Lille 1, Inria
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program; if not, write to the
16 Free Software Foundation, Inc.,
17 59 Temple Place,
18 Suite 330,
19 Boston, MA 02111-1307
20 USA
21
22 Contact : S..._DOT_I..._AT_stkpp.org (see copyright for ...)
23*/
24
25/*
26 * Project: stkpp::Clustering
27 * created on: 5 sept. 2013
28 * Author: iovleff, serge.iovleff@stkpp.org
29 **/
30
35#ifndef STK_GAMMA_A_BJK_H
36#define STK_GAMMA_A_BJK_H
37
39#include "STK_GammaBase.h"
40
41namespace STK
42{
43template<class Array>class Gamma_a_bjk;
44
45namespace hidden
46{
50template<class Array_>
57
58} // namespace hidden
59
69template<class Array>
70class Gamma_a_bjk: public GammaBase< Gamma_a_bjk<Array> >
71{
72 public:
74 using Base::param_;
75 using Base::p_data;
76 using Base::meanjk;
77 using Base::variancejk;
78
94 void randomInit( CArrayXX const* const& p_tik, CPointX const* const& p_tk) ;
96 bool run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) ;
98 inline int computeNbFreeParameters() const
99 { return this->nbCluster()*p_data()->sizeCols() + 1;}
100};
101
102template<class Array>
103void Gamma_a_bjk<Array>::randomInit( CArrayXX const* const& p_tik, CPointX const* const& p_tk)
104{
105 // compute moments
106 this->moments(p_tik);
107 // generate scales
108 Real value = 0.0;
109 for (int j=p_data()->beginCols(); j<p_data()->endCols(); ++j)
110 {
111 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
112 {
113 Real mean = meanjk(j,k), variance = variancejk(j,k);
114 param_.scale_[k][j] = Law::Exponential::rand((variance/mean));
115 value += p_tk->elt(k) * (mean*mean/variance);
116 }
117 }
118 param_.shape_ = Law::Exponential::rand(value/(this->nbSample()*p_data()->sizeCols()));
119#ifdef STK_MIXTURE_VERY_VERBOSE
120 stk_cout << _T(" Gamma_a_bjk<Array>::randomInit( CArrayXX const* const& p_tik, CPointX const* const& p_tk) done\n");
121#endif
122}
123
124/* Compute the weighted mean and the common variance. */
125template<class Array>
126bool Gamma_a_bjk<Array>::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk)
127{
128 bool flag = true;
129 if (!this->moments(p_tik)) { flag = false;}
130 // estimate a
131 Real y =0.0, x0 = 0.0, x1 = param_.shape_;
132 for (int j=p_data()->beginCols(); j < p_data()->endCols(); ++j)
133 {
134 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
135 {
136 Real mean = meanjk(j,k);
137 y += p_tk->elt(k) * (param_.meanLog_[k][j]-std::log(mean));
138 x0 += p_tk->elt(k) * (mean*mean/variancejk(j,k));
139 }
140 }
141 y /= (this->nbSample()*p_data()->sizeCols());
142 x0 /= (this->nbSample()*p_data()->sizeCols());
143 // moment estimate and oldest value
144 if ((x0 <=0.) || (isNA(x0)))
145 { x0 = 1; flag = false;}
146
147 // get shape
149 Real a = x0; // use moment estimate
150 try
151 {
152 a = Algo::findZero(f, x0, x1, 1e-08);
153 }
154 catch (...)
155 {
156#ifdef STK_MIXTURE_DEBUG
157 stk_cout << "ML estimation failed in Gamma_a_bjk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) \n";
158 stk_cout << "x0 =" << x0 << _T("\n";);
159 stk_cout << "f(x0) =" << f(x0) << _T("\n";);
160 stk_cout << "x1 =" << x1 << _T("\n";);
161 stk_cout << "f(x1) =" << f(x1) << _T("\n";);
162#endif
163 a = x0; // use moment estimate
164 flag = false;
165 }
167 {
168#ifdef STK_MIXTURE_DEBUG
169 stk_cout << "ML estimation failed in Gamma_a_bjk::run( CArrayXX const* const& p_tik, CPointX const* const& p_tk) \n";
170 stk_cout << "x0 =" << x0 << _T("\n";);
171 stk_cout << "f(x0) =" << f(x0) << _T("\n";);
172 stk_cout << "x1 =" << x1 << _T("\n";);
173 stk_cout << "f(x1) =" << f(x1) << _T("\n";);
174#endif
175 a = 1.; // use default value
176 flag = false;
177 }
178 // set values
179 param_.shape_ = a;
180 // estimate bjk
181 for (int j=p_data()->beginCols(); j < p_data()->endCols(); ++j)
182 {
183 for (int k= p_tik->beginCols(); k < p_tik->endCols(); ++k)
184 { param_.scale_[k][j] = param_.mean_[k][j]/a;}
185 }
186 return flag;
187}
188
189} // namespace STK
190
191#endif /* STK_Gamma_A_BJK_H */
In this file we implement the base class for the gamma models.
In this file we implement the exponential law.
#define stk_cout
Standard stk output stream.
#define _T(x)
Let x unmodified.
Base class for the gamma models.
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.
Real variancejk(int j, int k)
get the weighted variance of the jth variable of the kth cluster.
Gamma_a_bjk is a mixture model of the following form.
~Gamma_a_bjk()
destructor
Gamma_a_bjk(int nbCluster)
default constructor
void randomInit(CArrayXX const *const &p_tik, CPointX const *const &p_tk)
Initialize randomly the parameters of the Gamma mixture.
int computeNbFreeParameters() const
Gamma_a_bjk(Gamma_a_bjk const &model)
copy constructor
GammaBase< Gamma_a_bjk< Array > > Base
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) .
virtual Real rand() const
Generate a pseudo Exponential random variate.
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
Functor computing the derivative of the lnLikelihood of a gamma_ajk_bjk model.
Real findZero(IFunction< Function > const &f, Real const &x0, Real const &x1, Real tol)
find the zero of a function.
bool isNA(Type const &x)
utility method allowing to know if a value is a NA (Not Available) value
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...
The namespace STK is the main domain space of the Statistical ToolKit project.
Arithmetic properties of STK fundamental types.
ModelParameters< Clust::Gamma_a_bjk_ > Parameters
Type of the structure storing the parameters of a Gamma_aj_bjk model.
Main class for the mixtures traits policy.