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
00022
00023
00024
00025
00026
00027 public:
00029 BatchLearning(const TopolParams& s):LearningAlgorithm(s) {};
00030
00032 int Learning ( NetParams& net );
00033
00034 const char* className();
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 );
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
00070
00071 tmp_bmu = MakeBMU( data, mapcode );
00072
00073
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
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