LearningAlgorithm.h

00001 #ifndef LearningAlgorithm_H
00002 #define LearningAlgorithm_H
00003 
00004 
00005 #include  <math.h>
00006 #include <iostream>
00007 #include "TopologyImp.h"
00008 #include "NetParams.h"
00009 #include "TopologyFactory.h"
00010 //#include "qobject.h"
00011 
00012 #include "defs.h"
00013 
00022 //class LearningAlgorithm : public QObject {
00023 
00024 
00025 class LearningAlgorithm {
00026 public: 
00028         virtual int Learning( NetParams& net) = 0;
00029 
00031         TopologyImp * getTopology();
00032 
00034         Value_Type alpha( Value_Type init, Value_Type ite, int t  );    
00035 
00037         Value_Type radius( Value_Type init, Value_Type ite, int t  );   
00038 
00040         TBMU * getBMU();
00041 
00043         TBMU * MakeBMU( const SOMData * data, const Mapcode * mapcode );
00044 
00046         BMUnode * winner( const SOMData* data, const Mapcode* mapcode, const int& pos );
00047 
00049         ~LearningAlgorithm();
00050 
00052         int getActualIteraction();
00053 
00054 
00055         int EECNI( NetParams& net, int fi );
00056 
00057         
00058 protected:
00060     LearningAlgorithm(const TopolParams& par);
00061 
00063         int setActualIteraction( int ite );
00064 
00065 
00066 private:
00067         TopologyImp * _topology;
00068         TBMU            * _bmu; 
00069         BMUnode    * _bestunit;
00070         int          _actualiteraction;
00071 };
00072 
00073 int 
00074 LearningAlgorithm::EECNI( NetParams& net, int fi ) 
00075 {       
00076         TLabel mapLabel = net.getMapcode()->getLabel();
00077         TMatrix delta   = net.getDelta();
00078         int m                   = net.getMapcode()->getMapSize();
00079         int d                   = net.getMapcode()->getNumVar();
00080         Value_Type diff, min_dist;
00081         int neighbor, ind_min;
00082         bool found;
00083 
00084         if (!mapLabel.empty()) {
00085                 TMatrix tmp_codebook = net.getMapcode()->getCodebook();
00086                 TMatrix codebook         = net.getMapcode()->getCodebook();
00087                 for (int i = 1; i <= mapLabel.size(); i++ ) {
00088                         found = false;
00089                         if ( mapLabel[i].size() <= fi ) {                               
00090                                 neighbor  =  1;                         
00091                                 while (neighbor <= m ) {
00092                                         min_dist = 9999999;
00093                                         for (int j = 1; j <= m; j++ ) {
00094                                                 if (( j != i ) && (mapLabel[j].size() > fi) && (delta[i][j]<= neighbor) && (delta[i][j] > (neighbor - 1)) ) {
00095                                                         diff = dist( codebook[i], codebook[j], d );
00096                                                         if ( diff < min_dist ) {
00097                                                                 ind_min = j;
00098                                                                 found = true;
00099                                                         }
00100                                                 }
00101                                         }
00102                                         if (found) {
00103                                                 for (int k=1; k<=d; k++) tmp_codebook[i][k] = codebook[ind_min][k];
00104                                                 break;
00105                                         }
00106                                         else
00107                                                 neighbor++;
00108                                 };                                                              
00109                         }
00110                 }
00111                 net.getMapcode()->setCodebook( tmp_codebook );
00112                 return 1;
00113         }
00114         return 0;
00115 };
00116 
00117 
00118 int 
00119 LearningAlgorithm::getActualIteraction() 
00120 {
00121         return _actualiteraction;
00122 };
00123 
00124 inline int 
00125 LearningAlgorithm::setActualIteraction( int ite ) 
00126 {
00127         _actualiteraction = ite;
00128         return _actualiteraction;
00129 };
00130 
00131 TBMU *
00132 LearningAlgorithm::getBMU() 
00133 {
00134         return _bmu;
00135 };
00136 
00137 
00138 BMUnode *
00139 LearningAlgorithm::winner( const SOMData* data, const Mapcode* mapcode,const int& pos )
00140 {
00141         int i,j, k, j_min, j_min2;   
00142         Value_Type dist, diff,dist_min, dist_min2;      
00143         int             d                       = data->getDimension();
00144         int             m                       = mapcode->getMapSize();
00145         TMatrix entries         = data->getEntries();
00146         TMatrix codebook        = mapcode->getCodebook();
00147 
00148         i = pos;
00149 
00150         j_min = 0;  j_min2 = 0;
00151         dist_min = 9999999; dist_min2 = 9999999;
00152 
00153         for (j = 1; j <= m; j++) {
00154                 dist = 0;    
00155                 for (k=1; k<= d; k++) {
00156                         diff = entries[i][k] - codebook[j][k]; 
00157                         dist += diff*diff;
00158                 }
00159                 if ( dist < dist_min ) {
00160                         j_min2 = j_min;
00161                         dist_min2 = dist_min;
00162                         j_min = j;
00163                         dist_min = dist;                        
00164                 } else if ((j_min2 == 0)&&( dist < dist_min2)) {
00165                         j_min2 = j;
00166                         dist_min2 = dist;
00167                 }               
00168         }               
00169         _bestunit = new BMUnode( j_min, sqrt(dist_min) );
00170 
00171 
00172         return _bestunit;
00173 };
00174 
00175 
00176 
00177 
00178 
00179 inline TBMU *
00180 LearningAlgorithm::MakeBMU( const SOMData* data, const Mapcode* mapcode ) 
00181 {       
00182         int i, j, k, j_min, j_min2;   
00183         Value_Type dist, diff,dist_min,dist_min2;       
00184         int             d                       = data->getDimension();
00185         int             n                       = data->getDataSize();
00186         int             m                       = mapcode->getMapSize();
00187         TMatrix entries         = data->getEntries();
00188         TMatrix codebook        = mapcode->getCodebook();
00189         TVecBMU vec;
00190 
00191         _bmu->clear();
00192 
00193         for (i=1; i<= n; i++) {
00194                 j_min = 0;  j_min2 = 0;
00195                 dist_min = 9999999; dist_min2 = 9999999;
00196                 for (j=1; j<= m; j++) {
00197                         dist = 0;    
00198                         for (k=1; k<= d; k++) {
00199                                 diff = entries[i][k] - codebook[j][k]; 
00200                                 dist += diff*diff;
00201                         }
00202                         if ( dist < dist_min ) {
00203                                 j_min2 = j_min;
00204                                 dist_min2 = dist_min;
00205                                 j_min = j;
00206                                 dist_min = dist;                        
00207                         } else if ((j_min2 == 0)&&( dist < dist_min2)) {
00208                                 j_min2 = j;
00209                                 dist_min2 = dist;
00210                         }
00211 
00212                         //vec.push_back( BMUnode( j, sqrt(dist) )  );                                           
00213                 }               
00214                 vec.push_back( BMUnode( j_min, sqrt(dist_min) )  );
00215                 vec.push_back( BMUnode( j_min2, sqrt(dist_min2) )  );
00216                 //sort( vec.begin(), vec.end() );
00217                 _bmu->push_back( vec );         
00218                 vec.clear();
00219         }       
00220         return _bmu;
00221 };
00222 
00223 
00224 inline TopologyImp * 
00225 LearningAlgorithm::getTopology() 
00226 {
00227         return _topology;
00228 };
00229 
00230 Value_Type 
00231 LearningAlgorithm::alpha( Value_Type init, Value_Type ite, int t  ) 
00232 {
00233         return (init * exp( - (Value_Type)t/ (Value_Type)ite ));
00234 };      
00235 
00236 inline Value_Type 
00237 LearningAlgorithm::radius( Value_Type init, Value_Type ite, int t  ) 
00238 {
00239         return (1.0 + (init - 1.0) * (Value_Type)(ite - t)/ (Value_Type) ite);
00240 };
00241         
00242 
00243 LearningAlgorithm::~LearningAlgorithm() 
00244 {
00245         free( _topology );
00246         free( _bmu );
00247 };
00248 
00249 
00250 LearningAlgorithm::LearningAlgorithm(const TopolParams& par) {
00251 
00252         _topology = TopologyFactory::make(par.dimension, par );
00253         _bmu = new TBMU;
00254 
00255 };
00256 
00257 
00258 #endif

Generated on Tue Aug 7 16:03:33 2007 for SOMCode by  doxygen 1.5.3