Xmipp  v3.23.11-Nereus
kerdensom.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: Alberto Pascual Montano (pascual@cnb.csic.es)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 //-----------------------------------------------------------------------------
27 // KerDenSOM.hh
28 // Implements Smoothly Distributed Kernel Probability Density Estimator Self-Organizing Map
29 // This is an abstract base class for different variants of the KerDenSOM algorithm
30 //-----------------------------------------------------------------------------
31 
32 #ifndef XMIPPKERDENSOM_H
33 #define XMIPPKERDENSOM_H
34 
35 #include "base_algorithm.h"
36 #include "map.h"
37 
44 class KerDenSOM : public ClassificationAlgorithm<FuzzyMap>
45 {
46 public:
47 
56  KerDenSOM(double _reg0, double _reg1, unsigned long _annSteps,
57  double _epsilon, unsigned long _nSteps)
58  : ClassificationAlgorithm<FuzzyMap>(), annSteps(_annSteps), reg0(_reg0), reg1(_reg1),
59  epsilon(_epsilon), somNSteps(_nSteps)
60  {};
61 
65  virtual ~KerDenSOM()
66  {};
67 
72  void nSteps(const unsigned long& _nSteps);
73 
74 #ifdef UNUSED // detected as unused 29.6.2018
75 
78  virtual double getSigma();
79 #endif
80 
85  void setAnnSteps(const unsigned long& _annSteps);
86 
87 
95  virtual void train(FuzzyMap& _som, TS& _examples, FileName& _fn_vectors,
96  bool _update = false, double _sigma = 0, bool _saveIntermediate=false) = 0;
97 
103  virtual double test(const FuzzyMap& _som, const TS& _examples) const;
104 
105 
110  virtual double functional(const TS* _examples, const FuzzyMap* _som, double _sigma, double _reg, double& _likelihood, double& _penalty) = 0;
111 
112 #ifdef UNUSED // detected as unused 29.6.2018
113 
118  virtual double randApproxGVC(const TS* _examples, const FuzzyMap* _som, double _dataSD, double _reg);
119 #endif
120 
121 protected:
122 
123  double sigma; // Optimum Kernel Width
124  size_t annSteps; // number of deterministic annealing steps
125  double reg0;
126  double reg1; // Regularization factors
127  double epsilon; // Stopping criterion Error < epsilon
128  size_t somNSteps; // number of steps
129 
130 
131  // Internal Scratch
132 
133  size_t numNeurons;
134  size_t numVectors;
135  size_t dim;
136  std::vector < std::vector<double> > tmpMap;
137  std::vector<double> tmpD;
138  std::vector<double> tmpD1;
139  std::vector<double> tmpDens;
140  std::vector<double> tmpV;
141 
142 
144  virtual void train(FuzzyMap& _som, const TS& _examples) const
145  {};
146 
147  /* Declaration of abstract methods */
148 
149  // Update Us
150  virtual double updateU(FuzzyMap* _som, const TS* _examples, const double& _sigma, double& _alpha) = 0;
151 
152  // Estimate Sigma II
153  virtual double updateSigmaII(FuzzyMap* _som, const TS* _examples, const double& _reg, const double& _alpha) = 0;
154 
155  // Estimate the PD (Method 1: Using the code vectors)
156  virtual double codeDens(const FuzzyMap* _som, const FeatureVector* _example, double _sigma) const = 0;
157 
158 #ifdef UNUSED // detected as unused 29.6.2018
159  // Estimate the PD (Method 2: Using the data)
160  virtual double dataDens(const TS* _examples, const FeatureVector* _example, double _sigma) const = 0;
161 #endif
162 
163  /* Some other common methods */
164 
165  // Update Code vectors
166  virtual void updateV(FuzzyMap* _som, const TS* _examples, const double& _sigma);
167 
168  // Main iterations
169  virtual double mainIterations(FuzzyMap* _som, const TS* _examples, double& _sigma, const double& _reg);
170 
171  // Special Initialization of the Us
172  virtual void initU(FuzzyMap* _som);
173 
174  // Special initialization of Code vectors
175  virtual void updateV1(FuzzyMap* _som, const TS* _examples);
176 
177  // Special initialization of Membership Matrix
178  virtual void updateU1(FuzzyMap* _som, const TS* _examples);
179 
180  // Estimate Sigma I
181  virtual double updateSigmaI(FuzzyMap* _som, const TS* _examples);
182 
183  // Some printing methods.
184  void showX(const TS* _ts);
185  void showV(FuzzyMap* _som);
186  void showU(FuzzyMap* _som, const TS* _ts);
187 #ifdef UNUSED // detected as unused 29.6.2018
188  void printV(FuzzyMap* _som, const TS* _ts, FileName& _fname);
189 #endif
190 
191 };
192 
194 #endif
void showU(FuzzyMap *_som, const TS *_ts)
Definition: kerdensom.cpp:462
std::vector< double > tmpD
Definition: kerdensom.h:137
Definition: map.h:308
virtual double functional(const TS *_examples, const FuzzyMap *_som, double _sigma, double _reg, double &_likelihood, double &_penalty)=0
size_t dim
Definition: kerdensom.h:135
double reg0
Definition: kerdensom.h:125
virtual double updateSigmaII(FuzzyMap *_som, const TS *_examples, const double &_reg, const double &_alpha)=0
size_t somNSteps
Definition: kerdensom.h:128
double epsilon
Definition: kerdensom.h:127
size_t annSteps
Definition: kerdensom.h:124
std::vector< double > tmpD1
Definition: kerdensom.h:138
virtual double codeDens(const FuzzyMap *_som, const FeatureVector *_example, double _sigma) const =0
virtual double test(const FuzzyMap &_som, const TS &_examples) const
Definition: kerdensom.cpp:74
size_t numNeurons
Definition: kerdensom.h:133
virtual void updateV1(FuzzyMap *_som, const TS *_examples)
Definition: kerdensom.cpp:246
virtual void train(FuzzyMap &_som, TS &_examples, FileName &_fn_vectors, bool _update=false, double _sigma=0, bool _saveIntermediate=false)=0
double reg1
Definition: kerdensom.h:126
virtual double updateU(FuzzyMap *_som, const TS *_examples, const double &_sigma, double &_alpha)=0
KerDenSOM(double _reg0, double _reg1, unsigned long _annSteps, double _epsilon, unsigned long _nSteps)
Definition: kerdensom.h:56
void showV(FuzzyMap *_som)
Definition: kerdensom.cpp:445
std::vector< std::vector< double > > tmpMap
Definition: kerdensom.h:136
virtual void initU(FuzzyMap *_som)
Definition: kerdensom.cpp:334
virtual void train(FuzzyMap &_som, const TS &_examples) const
Definition: kerdensom.h:144
void setAnnSteps(const unsigned long &_annSteps)
Definition: kerdensom.cpp:61
double sigma
Definition: kerdensom.h:123
virtual double mainIterations(FuzzyMap *_som, const TS *_examples, double &_sigma, const double &_reg)
Definition: kerdensom.cpp:173
virtual void updateV(FuzzyMap *_som, const TS *_examples, const double &_sigma)
Definition: kerdensom.cpp:116
virtual ~KerDenSOM()
Definition: kerdensom.h:65
virtual double updateSigmaI(FuzzyMap *_som, const TS *_examples)
Definition: kerdensom.cpp:211
void showX(const TS *_ts)
Definition: kerdensom.cpp:427
std::vector< double > tmpDens
Definition: kerdensom.h:139
std::vector< double > tmpV
Definition: kerdensom.h:140
virtual void updateU1(FuzzyMap *_som, const TS *_examples)
Definition: kerdensom.cpp:287
size_t numVectors
Definition: kerdensom.h:134
std::vector< floatFeature > FeatureVector
Definition: data_types.h:86
void nSteps(const unsigned long &_nSteps)
Definition: kerdensom.cpp:40