void FacadeGeography::ShowFeature() {
	std::vector<double> width, height;
	for (int i = 0; i < width_; ++i)
	{
		width.push_back(i);
	}
	for (int j = 0; j < height_; ++j)
	{
		height.push_back(j);
	}
	assert(horizonal_feature.size() == width_);
	assert(vertical_feature.size() == height_);
	std::shared_ptr<pcl::visualization::PCLPlotter> plotter(new pcl::visualization::PCLPlotter);
	std::shared_ptr<pcl::visualization::PCLPlotter> plotter2(new pcl::visualization::PCLPlotter);
	plotter->addPlotData(width, horizonal_feature, "Horizontal Feature", vtkChart::LINE);
	plotter2->addPlotData(vertical_feature, height, "Vertical Feature", vtkChart::LINE);

	/*
	std::vector<double> XX, YY;
	XX.push_back(horizontal_wall_parameters[0]);
	XX.push_back(horizontal_wall_parameters[0]);
	YY.push_back(0.0);
	YY.push_back(1.0);
	plotter->addPlotData(XX, YY);

	for (int i = 1; i < horizontal_wall_parameters.size(); ++i)
	{
	int lastx = XX[0];
	XX.clear();
	YY.clear();
	XX.push_back(lastx + horizontal_wall_parameters[i]);
	XX.push_back(lastx + horizontal_wall_parameters[i]);
	YY.push_back(0.0);
	YY.push_back(1.0);

	plotter->addPlotData(XX, YY);
	}
	*/
	plotter->plot();
	plotter2->plot();
}
예제 #2
0
int main (int argc, char *argv[]) {
	//inicializacion de semilla
	srand( (unsigned) std::time(NULL)); 
	
	//Leemos los valores de configuracion
    //Parametros de los patrones de entrenamiento y prueba
	std::string     archivo_problema               = config.getValue("archivo_problema"); //Archivo a leer patrones ej xor.csv
	unsigned int    porcentaje_entrenamiento       = utils::strToInt(config.getValue("porcentaje_entrenamiento"));
	unsigned int    porcentaje_prueba              = utils::strToInt(config.getValue("porcentaje_prueba"));
	unsigned int    cantidad_casos                 = utils::strToInt(config.getValue("cantidad_casos"));
    //Parametros de la red SOM
    unsigned int    alto                           = utils::strToInt(config.getValue("alto"));
    unsigned int    ancho                          = utils::strToInt(config.getValue("ancho"));
    unsigned int    cantidad_entradas              = utils::strToInt(config.getValue("cantidad_entradas"));
    unsigned int    cantidad_salidas               = utils::strToInt(config.getValue("cantidad_salidas"));
    unsigned int    cantidad_clases                = utils::strToInt(config.getValue("cantidad_clases"));
	float           eta0                           = utils::strToFloat(config.getValue("eta0"));
	float           sigma0                         = utils::strToFloat(config.getValue("sigma0"));
	float           tau2                           = utils::strToFloat(config.getValue("tau2"));
	//Parametros para el entrenamiento
    unsigned int    epocas_fase_ordenamiento       = utils::strToInt(config.getValue("epocas_fase_ordenamiento"));
    unsigned int    epocas_fase_convergencia       = utils::strToInt(config.getValue("epocas_fase_convergencia"));
    unsigned int    intervalo_dibujo               = utils::strToInt(config.getValue("intervalo_dibujo"));
    

    //Impresion de los datos de ejecucion
    std::cout<<"Bienvenidos al Ejercicio 2 \n";
    std::cout<<"Problema: "<<archivo_problema<<'\n';
    std::cout<<"Porcentaje para entrenamiento = "<<porcentaje_entrenamiento<<"\%\n";
    std::cout<<"Porcentaje para validacion = "<<100-porcentaje_entrenamiento-porcentaje_prueba<<"\%\n";
    std::cout<<"Porcentaje para prueba = "<<porcentaje_prueba<<"\%\n";

    GNUPlot plotter2;	
	plotter2("set pointsize 1");
	plotter2("set grid back");	
	plotter2("set xzeroaxis lt -1");
	plotter2("set yzeroaxis lt -1");	
	plotter2("set xrange [-1.1:1.1]");
	plotter2("set yrange [-1.1:1.1]");
    plotter2("set xlabel \"X\"");
    plotter2("set ylabel \"Y\"");
    plotter2("set title \"Puntos del entrenamiento\"");
    plotter2("set multiplot");

    //Vectores temporales para trabajar
	std::vector<std::vector<float > > patron, entrenamiento, prueba, validacion;
	
    //Leo el problema en patron
    if ( archivo_problema.compare("cuadrado") == 0)
        utils::generarCuadrado(cantidad_casos, std::make_pair<float,float>(-1.0,-1.0), std::make_pair<float,float>(1.0,1.0), patron);
    else if ( archivo_problema.compare("circulo") == 0)
        utils::generarCirculo(cantidad_casos, 1.0, patron);
    else if ( archivo_problema.compare("formaT") == 0)
        utils::generarT(cantidad_casos, patron);
    else
        utils::parseCSV(archivo_problema, patron);

    random_shuffle(patron.begin() , patron.end());

    
    //Genera las particiones de entrenamiento y prueba
    utils::genParticiones(patron, entrenamiento, validacion, prueba, porcentaje_entrenamiento, 
            porcentaje_prueba, 0);
    
    
    unsigned int maxit = epocas_fase_ordenamiento + epocas_fase_convergencia;

    //Instancio la red
    RedSOM redSOM(cantidad_entradas, cantidad_clases, alto, ancho, sigma0, eta0, tau2, maxit);


    //Divido en X y Yd los casos de entrenamiento
    std::vector<std::vector<float> > X, Yd;
    
    utils::splitVector(entrenamiento, X, Yd, cantidad_salidas);
    

    std::vector<std::vector<float> > puntosSOM;
    
    redSOM.getPuntos(puntosSOM);
    plotter2("clear\n");
    utils::drawPoints(puntosSOM, plotter2);

    std::vector<std::vector<float> > Ycalculados;

    std::cout<<"Fase de ordenamiento\n";
    for (unsigned int i = 0; i < epocas_fase_ordenamiento; i++) {
        //Entrena
        redSOM.train(X, Yd, Ycalculados, true, true);
        
        if (i % intervalo_dibujo == 0) {
            std::cout<<"ordenamiento iteracion "<<i<<'\n';
            std::vector<std::vector<float> > puntosSOM;
            redSOM.getPuntos(puntosSOM);
            plotter2("clear\n");
            utils::drawPoints(puntosSOM, plotter2);
        }
    }

    std::cout<<"Fin Fase de ordenamiento \n";
    std::cout<<"Fase de convergencia\n";
    //Para convergencia, uso la cantidad de neuronas por el valor en epocas_fase_convergencia
    // epocas_fase_convergencia *= redSOM.getCantidadNeuronas();
    redSOM.setCteAprendizaje(0.01);
    redSOM.setSigma(1);

    redSOM.getPuntos(puntosSOM);
    plotter2("clear\n");
    utils::drawPoints(puntosSOM, plotter2);

    for (unsigned int i = 0; i < epocas_fase_convergencia; i++) {
        //Entrena
        redSOM.train(X, Yd, Ycalculados, true, false);

        //Dibuja si corresponde
        if (i % intervalo_dibujo == 0) {
            std::cout<<"convergencia iteracion "<<i<<'\n';
            std::vector<std::vector<float> > puntosSOM;
            redSOM.getPuntos(puntosSOM);
            plotter2("clear\n");
            utils::drawPoints(puntosSOM, plotter2);
        }
    }

    std::cout<<"Fin Fase de convergencia \n";
    
    redSOM.getPuntos(puntosSOM);
    plotter2("clear\n");
    utils::drawPoints(puntosSOM, plotter2);
  
    std::cout<<"El SOM esta entrenado.\n";

   return 0;
}