BatchLearning.h

00001 
00002 #ifndef BatchLearning_H
00003 #define BatchLearning_H
00004 
00005 
00006 #include "LearningAlgorithm.h"
00007 #include "util.h"
00008 #include "TopolParams.h"
00009 
00010 
00018 class BatchLearning : public LearningAlgorithm {
00019 
00020 /*
00021 Q_OBJECT
00022 
00023 signals:
00024         void valueChanged(int);
00025 */
00026 
00027 public:
00029     BatchLearning(const TopolParams& s):LearningAlgorithm(s) {};
00030 
00032         int Learning ( NetParams& net );
00033         
00034         const char* className(); //dev-cpp implementation
00035 
00036 };
00037 
00038 
00039 int 
00040 BatchLearning::Learning ( NetParams& net ) {
00041 
00042         int i, k, j, i1, i2, bmu, t;
00043         Value_Type h, r, htot;  
00044         Value_Type      d                       = net.getData()->getDimension(); 
00045         int             m                               = net.getMapcode()->getMapSize();
00046         int             n                               = net.getData()->getDataSize(); 
00047         int             dimension               = net.getMapcode()->getDimension();
00048         int             lattice                 = net.getMapcode()->getLattice();
00049         int*    dimensions              = net.getMapcode()->getDimensions();
00050         int             num_iterations  = net.getNumIterations();
00051         int             neighboor               = net.getMapcode()->getNeighborType();
00052         TMatrix entries                 = net.getData()->getEntries();
00053         SOMData * data                  = net.getData();
00054         TMatrix delta                   = net.getDelta();
00055 
00056         TMatrix codebook                = net.getMapcode()->getCodebook();
00057         TVector vn                              = create_vector(1, m);
00058         TMatrix S                               = create_matrix( 1, m, 1, (int)d ); //warning           
00059         Mapcode * mapcode               = net.getMapcode();
00060         
00061         TBMU  * tmp_bmu = new TBMU;                     
00062         
00063         
00064 
00065         r = net.getInitNeighbor();      
00066         
00067         for (t=1; t<= num_iterations; t++ ) {
00068                 setActualIteraction( t );
00069                 //emit valueChanged( t );
00070                 
00071                 tmp_bmu = MakeBMU( data, mapcode );
00072                                 
00073                 // initiate the voronoi vector and the SumData variables
00074                 for (i=1; i<= m; i++) { vn[i] = 0; for (k=1; k<=d; k++) S[i][k] = 0.0;}
00075                 
00076                 for (j=1; j<= n; j++ ) {        
00077                         bmu = tmp_bmu[0][j-1][0].i;                             
00078                         vn[bmu]++;      
00079                         for (k=1; k<=d; k++) S[bmu][k] += entries[j][k]; 
00080                 };
00081                                 
00082                 // fill mapcode with zeros
00083                 for (i=1; i<=m; i++) for (k=1; k<=d; k++) codebook[i][k] = 0.0;
00084 
00085                 
00086                 for (i1=1; i1<=m; i1++) {
00087                         htot = 0;       
00088                         for (i2=1; i2 <= m; i2++ ) {                                                            
00089                                 h = getTopology()->H( delta[i1][i2], r, neighboor ); 
00090                                 for ( k=1; k<=d; k++) codebook[i1][k] += h*S[i2][k]; 
00091                                 htot += h*vn[i2];       
00092                         }       
00093                         for (k=1; k<= d; k++) 
00094                                 if (htot != 0 ) codebook[i1][k] /= htot; 
00095                 }               
00096                 mapcode->setCodebook( codebook );
00097                 r = radius( r, num_iterations, t);                              
00098         }
00099         net.getMapcode()->setCodebook( codebook );
00100 
00101         free_vector( vn, 1, m );
00102         free_matrix( S, 1, m, 1, (int)d );
00103         return 0;
00104         
00105 };
00106 
00107 #endif

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