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
00011
00012 #include "defs.h"
00013
00022
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
00213 }
00214 vec.push_back( BMUnode( j_min, sqrt(dist_min) ) );
00215 vec.push_back( BMUnode( j_min2, sqrt(dist_min2) ) );
00216
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