main_segmentacao.cpp

00001 
00002 /*
00003 
00004         Este programa tem como objetivo, a partir de um mapa de uma rede salvo, segmentar a rede e imprimir os resultados.
00005 
00006         Este programa tem como entrada:
00007                 - o caminho para o arquivo de dados;
00008                 - o caminho para o arquivo do mapa da rede;
00009 
00010         Exemplo de chamada do programa: ./somcode ./data/IrinInputTrain.txt ./mapa10x15.txt
00011 
00012 */
00013 
00014 #pragma warning(disable: 4786)
00015 
00016 #include <cstdlib>
00017 #include <iostream>
00018 #include <vector>
00019 #include <string>
00020 
00021 //inclusao das bibliotecas do somcode necessarias para a execucao do programa
00022 
00023 #include "RepositorySOMDataXML.h"
00024 #include "RepositoryMapcodeXML.h"
00025 #include "RepositorySOMDataFile.h"
00026 #include "RepositoryMapcodeFile.h"
00027 
00028 
00029 
00030 #include "Som.h"
00031 #include "SOMDataCadastre.h"
00032 #include "MapcodeCadastre.h"
00033 
00034 #include "GraphSegmentation.h"
00035 #include "util.h"
00036 #include "CDbw.h"
00037 #include "DaviesBouldin.h"
00038 
00039 #include "BatchFactory.h"
00040 #include "TwoDFactory.h"
00041 #include "OnlineFactory.h"
00042 
00043 
00044 using std::cout;
00045 
00046 
00047 //criacao dos objetos construtores do padrao abstract factory
00048 
00049 static OnlineFactory fact_online("Online");
00050 static BatchFactory fact_batch("Batch");
00051 static TwoDFactory fact_twoD("Two");
00052 
00053 std::map<string, int>  makeTblEntry_Cluster(SOM* som,int* clusters,int dimL,int dimC);
00054 
00055 int main(int argc, char *argv[]) {  
00056 
00057   try {
00058       
00059           clock_t c0 = clock();
00060 
00061           //classe abstrata que serve como interface para os diferentes tipos de forma de acesso a dados para treinamento.      
00062           ISOMDataRepository *repD; 
00063 
00064           //classe concreta usada para isolar os dados dos detalhes de armazenamento 
00065           SOMDataCadastre *cadD;
00066         
00067         //atribuicao do parametro que contem o nome do arquivo a ser lido.
00068           std::vector<std::string> params;
00069           params.push_back(argv[1]);    
00070           
00071           //criacao do objeto da classe concreta que implementa o tipo de acesso a dados atraves de sistema de arquivos
00072           repD = new RepositorySOMDataFile();
00073           repD->load(params,0);
00074 
00075           //instanciacao do objeto da classe concreta SOMDataCadastre, que serve para isolar os dados dos detalhes de armazenamento
00076           cadD = new SOMDataCadastre(*repD);
00077 
00078         cout << "Iniciando o SOMCode-1.0 ...\n\n";
00079  
00080           //leitura do arquivo atraves da classe concreta SOMDataCadastre
00081           SOMData* data = cadD->load( std::vector<std::string>() );
00082             
00083            
00084 
00085           //classe abstrata que serve como interface para os diferentes tipos de forma de acesso a dados relativos ao Mapa de uma rede
00086           IMapcodeRepository *repM;
00087 
00088           //classe concreta usada para isolar os dados dos detalhes de armazenamento 
00089           MapcodeCadastre *cadM;
00090           
00091           //criacao do objeto da classe concreta que implementa o tipo de acesso a dados atraves de sistema de arquivos
00092           repM = new RepositoryMapcodeFile();
00093           repM->load(argv[2]);
00094 
00095           //instanciacao do objeto da classe concreta MapcodeCadastre, que serve para isolar os dados do Mapa dos detalhes de armazenamento
00096           cadM = new MapcodeCadastre(*repM);
00097 
00098           //leitura do arquivo atraves da classe concreta MapcodeCadastre
00099           Mapcode *map = cadM->load(argv[2]);
00100                  
00101           clock_t c1 = clock();
00102   
00103           
00104 
00105           clock_t c2 = clock();
00106             
00107 
00108             
00109           
00110 
00111           // Instanciacao do objeto net, do tipo NetParams, que representa a rede.
00112           NetParams* net = new NetParams();
00113            
00114 
00129           net->setData(data);
00130           net->setNumIterations( 2000 );
00131           
00132           net->setInitType(10);                         
00133           //eh atribuido o valor 10 que nao corresponde a um tipo de inicializacao existente
00134           //isso eh feito para que o mapa nao seja inicializado, de forma que os dados lidos 
00135           //do arquivo nao sejam modificados
00136           
00137           net->setInitLearningRate( 0.5 );
00138           net->setInitNeighbor( 15 );
00139           net->setLearningType( BATCH );
00140           net->setLearnType( "Batch" );
00141           net->setMapcode(map);
00142   
00143              
00144           //Instanciacao do objeto mysom, do tipo SOM, que representa a rede neural SOM
00145           SOM* mysom = new SOM(net,map);  
00146           
00147 
00148           cout << "\nNumero de neuronios = " << mysom->getMapcode()->getMapSize();
00149           cout << "\nDimensao dos vetores = " <<  data->getDimension();
00150          
00158           mysom->InitMapcode(); 
00159           //o metodo de inicializacao eh chamado, mas a inicializacao do mapa nao eh feita jah que o tipo de inicializacao nao existe 
00160           //nesse exemplo nesse metodo eh chamado apenas para a criacao da matriz de distancias.
00161           
00162           mysom->getLearningAlgorithm()->MakeBMU(data,map);
00163           //o metodo para criacao da matriz de BMUs por padrao eh chamado dentro do metodo de treinamento Learning()
00164           //como o metodo de treinamento da rede nao eh executado, eh necessario chamar diretamente o metodo MakeBMU
00165                 
00166 
00167           mysom->Labeling(); 
00168        
00169           clock_t c3 = clock();
00170            
00171            
00172           //Instanciacao da classe para segmentacao usando o algoritmo costa neto
00173           GraphSegmentation *cluster = new GraphSegmentation();
00174 
00175           //criacao do vetor para armazenamento dos clusters da segmentacao
00176           TIntVector clusters = create_intvector(1, mysom->getMapcode()->getMapSize());
00177 
00178 
00179         //segmenta a rede. Tem como parametros a rede a ser segmentada e o numero minimo de neuronios que cada grupo deve ter
00180           clusters = cluster->Segment( mysom, 3 );
00181           
00182 
00183           cout << "\n\n\nMapa segmentado: \n\n";
00184           printClusters(clusters,mysom->getMapcode()->getDimensions(0),mysom->getMapcode()->getDimensions(1));
00185           
00186 
00187           //calculo do Indice CDbw
00188           CDbw *cdbw = new CDbw(mysom, clusters, cluster->getNumClusters());
00189           cout << "\nCDbw = " << cdbw->Index();
00190 
00191 
00192           //calculo do indice Davies Bouldin
00193           DaviesBouldin *db = new DaviesBouldin(mysom, clusters, cluster->getNumClusters());
00194           cout << "\nDavies Bouldin = " << db->Index(1,2) << "\n";
00195 
00196          
00197 
00198           /*
00199             A tabela relacionando cada vetor de entrada ao seu grupo pode ser muito grande a depender da quantidade de vetores de entrada, portanto o codigo para criacao e impressao dessa tabela fica comentado para uso de acordo com a necessidade do usuario.
00200           */
00201 
00202 
00203           /* //inicio do codigo para a criaca da tabela
00204 
00205           //metodo para criacao da tabela relacionando cada vetor de entrada ao seu grupo
00206           std::map<string, int> tbl = makeTblEntry_Cluster(mysom,clusters,mysom->getMapcode()->getDimensions(0),mysom->getMapcode()->getDimensions(1));
00207 
00208           //vetor com os rotulos dos vetores de entrada
00209           TvecLabel entryLabel = mysom->getData()->getId();
00210 
00211           cout << "\n\n\nTabela relacionando cada vetor de entrada ao seu grupo...\n\n";
00212           for(int i = 0; i < entryLabel.size(); i++)
00213           cout << "Entrada = " << i+1 << "\tGrupo = " << tbl[ entryLabel[i] ] << "\n";
00214 
00215           //Fim do codigo para criacao da tabela */
00216 
00217       delete cdbw;
00218       delete data;
00219       delete mysom;
00220 
00221   } catch(std::exception& ex) {
00222     cout << ex.what() << std::endl;
00223   }
00224       
00225   return EXIT_SUCCESS;
00226   
00227 };
00228 
00229 
00230 
00231 //implementacao do metodo usado para criar a tabela relacionando cada entrada ao seu grupo
00232 std::map<string, int>  makeTblEntry_Cluster(SOM* som,int* clusters,int dimL,int dimC){          
00233           TLabel label = som->getMapcode()->getLabel();
00234           
00235           std::map<string, int> tbl;
00236           
00237           for(int i = 0; i < dimL*dimC; i++){
00238             for(int j = 0; j < label[i].size(); j++){
00239               string value = inttostr( clusters[i+1] );
00240               string id = label[i][j];
00241               tbl[ label[i][j] ] = clusters[i+1];
00242             }
00243           }  
00244 
00245           return tbl;
00246 }

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