domingo, 26 de julio de 2015

RNA - Aprender un numero digital

RNA - Aprender un numero digital

Con la plantilla utilizada para construir una red neuronal de la entrada anterior, la modificaremos  para el siguiente modelo:
Ahora la capa "K" tiene 4 nodos(neuronas) con 5 entradas más una entrada del Bias(entrada de otra neurona como parte de una red) , así tendría 6 entradas para cada nodo "K". Para la capa "J" tenemos 5 nodos con 7 entradas más una entrada como "bias" , lo que suma 8 entradas para cada nodo de la capa "J".

                   Numero        Representación digital          Representación Binaria
                      0                      1  1  1  0  1  1  1                        0  0  0  0  0
                      1                      1  0  0  0  0  0  1                        0  0  0  0  1
                      2                      1  1  0  1  1  1  0                        0  0  0  1  0
                      3                      1  1  0  1  0  1  1                        0  0  0  1  1
                      4                      1  0  1  1  0  0  1                        0  0  1  0  0
                      5                      0  1  1  1  0  1  1                        0  0  1  0  1
                      6                      0  1  1  1  1  1  1                        0  0  1  1  0
                      7                      1  1  0  0  0  0  1                        0  0  1  1  1
                      8                      1  1  1  1  1  1  1                        1  0  0  0  0
                      9                      1  1  1  1  0  1  1                        1  0  0  0  1

La representación digital serán la entradas junto a un balance del "bias"(en este caso -1) y la representación binaria es lo que la red debe aprender



public class TestNumero {                            //NK NJ EK EJ
    static RedNeuronal1 redNeuronal = new RedNeuronal1( 4, 5, 6, 8);
    static double balance = -1;                      
    static double[][] capaI = {{1,1,1,0,1,1,1,balance},  //0
                 {1,0,0,0,0,0,1,balance},  //1
                               {1,1,0,1,1,1,0,balance},  //2
                               {1,1,0,1,0,1,1,balance},  //3
       /*rep. digital*/        {1,0,1,1,0,0,1,balance},  //4
                               {0,1,1,1,0,1,1,balance},  //5
                               {0,1,1,1,1,1,1,balance},  //6
                               {1,1,0,0,0,0,1,balance},  //7
                               {1,1,1,1,1,1,1,balance},  //8
                               {1,1,1,1,0,1,1,balance}}; //9
    static double[][]  aprender =  {{0,0,0,0,0,0,0,0,1,1},
        {0,0,0,0,1,1,1,1,0,0},
                                    {0,0,1,1,0,0,1,1,0,0},
                                    {0,1,0,1,0,1,0,1,0,1}}; 
                                  //0  1 2 3 4 5 6 7 8 9    rep. binaria



Descargar archivo con frame para aprender un numero digital.
Descargar plantilla RNA
RNA - Aprender si un cuadrado es par

Definiremos los cuadrados impares, y definiremos a la cantidad impar con el valor de " 0 ".
Solo será par cuando dos casillas estén pintadas y tendrá el valor de " 1 ". No estarán definidas el cuadro sin pintar ni el cuadro con todas las casillas pintadas.


Cada nodo posee un vector de entradas(en este caso son 5 para la capa J y 3 para la capa K), y cada entrada tiene un peso("inicialmente aleatorios") y un función de activación(en este ejemplo sera la funcion sigmoidal).

También para cada nodo tendremos un error , utilizaremos el entrenamiento Backpropagation .






Construimos la clase nodo("neuron1")

package parimparrn;

public class Neuron1 {
    private double activacionu;
 double [] entradas;
 double [] pesos;
 double errorNodo;
 static Sigmoide sigmoide;
        public Neuron1(int nentradas)
 {
  pesos = new double[nentradas];
  entradas = new double[nentradas];
  sigmoide = new Sigmoide();
  errorNodo = 0;
 }
 public void activacion()
 {
  double suma = 0;
  for(int i=0;i<entradas.length;i++)
  {
   suma =suma + entradas[i]*pesos[i];
  }
  activacionu = sigmoide.funcion(suma);
 }

    public double[] getEntradas() {
        return entradas;
    }

    public void setEntradas(double[] entradas) {
        this.entradas = entradas;
    }

    public double[] getPesos() {
        return pesos;
    }

    public void setPesos(double[] pesos) {
        this.pesos = pesos;
    }
 public void verEntradas()
 {
  System.out.print(" entradas  ");
  for(int i=0;i<entradas.length;i++)
  {
   System.out.println(entradas[i]);
  }
 }
 public void verPesos()
 {
  System.out.println(" *** pesos ** ");
  for(int i=0;i<pesos.length;i++)
  {
   System.out.println(""+pesos[i]);
  }
 }
 public double getActivacion()
 {
  return activacionu;
 }
 public void verActivacion()
 {
  System.out.println("activacion");
  System.out.println(""+activacionu);
 }
 public double getError()
 {
  return errorNodo;
 }
 public void setError(double error)
 {
  errorNodo=error;
 }
        
}
Adjunto el proyecto , el archivo con frame , utiliza los pesos aprendidos tras ejecutar el método run de la clase TestRN.En  el proyecto sin frame se ejecuta el método y se encuentra los pesos para la red.
Descargar Proyecto completo con frame
Descargar Proyecto completo sin frame
Descargar  plantillas de RNA

jueves, 2 de julio de 2015

Ecuación de Lorenz


El siguiente sistema , modela el comportamiento de una atmósfera simple.
Para rho<24.75 el sistema es estable,pero para rho>24.75 es impredecible analíticamente.
File en lenguaje Matlab.

1
2
3
4
5
6
7
8
function dx=lorenzatt(T,X)
 rho = 28; sigma = 10;  beta = 8/3;
 dx = zeros(3,1);
 dx(1) = sigma*(X(2) - X(1));
 dx(2) = X(1)*(rho - X(3))-X(2);
 dx(3) = X(1)*X(2) - beta*X(3);
 return
end

Listas palindromas

20.11 Escriba un programa que utilice un objeto pila para determinar si una cadena es una palíndroma (es decir, que la cadena se deletree en forma idéntica, tanto al revés como al derecho). El programa debe ignorar espacios y puntuación.

#include <iostream>
using namespace std;
struct nodo
{
 char dato;
 struct nodo *sig;
};

void inicializar(nodo **cab)
{
 *cab = NULL;
}

void push(nodo **cab , char nuv)
{
 nodo *q;
 q = new nodo;
 q->dato = nuv;
 if(*cab == NULL)
 {
  q->sig = *cab;
  *cab = q;
 }
 else
 {
  q->sig = *cab;
  *cab = q;
 }
}

char pop(nodo **cab)
{
 nodo *aux;
 char num;
 aux = *cab;
 if(aux)
 {
  num = aux->dato;
  *cab = (*cab)->sig;
  delete aux;
  return num;
 }
 else
 {
  return 0;
 }
}

int comparar(nodo *cab, nodo *cab2 , int n)
{
     int b = 1; 
     for(int i=0;i<n;i++)
     {
         if(cab->dato == cab2->dato)
         {
             cab = cab->sig;
             cab2 = cab2->sig;
         }
         else
             b = 0;
     }
     return b;
}

void mostrar(nodo *cab)
{
 while(cab)
 {
  cout<<cab->dato;
  cab = cab->sig;
 }
 cout<<"\n\n\n";
}

int main()
{
 nodo *cab , *cab2;
 inicializar(&cab);
 inicializar(&cab2);
    string palabra ="anita lava la.. tina";
 //cout<<" ingresa palabra:  ";
 //cin>>palabra;
 int cont=0;
 for(int i=(palabra.length()-1);i>=0;i--)
 {
            if(palabra[i] != ' ')
            {     if(palabra[i] != '.')
                    push(&cab , palabra[i]);
                  else
                      cont++;  }
            else
                cont++;
    }
    for(int i=0;i<palabra.length();i++)
 {
            if(palabra[i] != ' ')
            {     if(palabra[i] != '.')
                    push(&cab2 , palabra[i]);
                  else
                      cont++;  }
            else
                cont++;
    }
 cout<<comparar(cab , cab2, palabra.length()-cont)<<" '1 iguales , 0 diferentes'  \n";
    mostrar(cab2);
 mostrar(cab);
 
 system("pause");
 return 0;
}


Invertir lista de caracteres

20.9 Escriba un programa para crear un objeto lista enlazada de 10 caracteres, y que luego cree un segundo objeto lista que contenga una copia de la primera lista, pero en orden inverso.

#include <iostream>
using namespace std;

struct nodo
{
       char info;
       struct nodo *sig;
};

void generarLista(nodo **inicio)
{
     nodo *q , *fin;
     for(int i=0;i<5;i++)
     {
             q = new nodo;
             q->info = (char)(rand()%10+70);
             
             if(*inicio == NULL)
             {
                  q->sig = *inicio;
                  *inicio = q;
                  fin = q;
             }
             else
             {
                 q->sig = fin->sig;
                 fin->sig = q;
                 fin = q;
             }
     }
}
nodo *obtenerFin( nodo *inicio)
{
     while( inicio->sig != NULL )
         inicio=inicio->sig;
     
     return inicio;
}


nodo *EliminarFin( nodo *inicio )
{
     nodo *fin , *aux;
     fin = obtenerFin(inicio);
     aux=inicio;
     
     while( aux->sig != fin )
         aux=aux->sig;
     
     aux->sig= fin->sig;
     
     
     delete fin;
     
     return inicio;
}  

nodo *InsertarFinal( nodo *inicio ,nodo *fin, char nom)
{
     nodo *q ;
     q = new nodo;
     q->info = nom;
     
     
     if(fin==NULL)
     {
         q->sig = inicio;
         inicio  = q;
         fin     = q;        
     }
     else
     {
         q->sig   = fin->sig;
         fin->sig = q;
         fin       = q;
     }
     return inicio;
}    

void mostrar(nodo *inicio)
{
     while(inicio)
     {
          cout<<inicio->info<<"  ";
          inicio = inicio->sig;
     }
     cout<<"\n\n\n";
}

int main()
{
    nodo *inicio , *inicio2 , *fin2;
    inicio  = NULL;
    inicio2 = NULL;
    fin2 = NULL;
    generarLista(&inicio);
    mostrar(inicio);
    
    inicio2 = InsertarFinal(inicio2 ,fin2 , obtenerFin(inicio)->info);
    inicio  = EliminarFin(inicio);
    inicio2 = InsertarFinal(inicio2 ,obtenerFin(inicio2) , obtenerFin(inicio)->info);
    inicio  = EliminarFin(inicio);
    inicio2 = InsertarFinal(inicio2 ,obtenerFin(inicio2) , obtenerFin(inicio)->info);
    inicio  = EliminarFin(inicio);
    inicio2 = InsertarFinal(inicio2 ,obtenerFin(inicio2) , obtenerFin(inicio)->info);
    inicio  = EliminarFin(inicio);
    inicio2 = InsertarFinal(inicio2 ,obtenerFin(inicio2) , obtenerFin(inicio)->info);
    
    mostrar(inicio2);
    
    system("pause");
    return 0;
}


Suma y promedio de una lista

20.8 Escriba un programa para insertar 25 enteros aleatorios de 0 a 100 en orden, en un objeto lista enlazada. El programa deberá calcular la suma de los elementos y el promedio de punto f lotante de los elementos.
 

/*
* C++ Suma y promedio de una lista simple
*
*/
 
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
struct nodo{
       int nro;        // en este caso es un numero entero
       struct nodo *sgte;
};
 
typedef struct nodo *Tlista,*Tlista2;
 
Tlista inicio, fin;
Tlista2 inicio2,fin2;
 
void generarLista( Tlista &inicio, Tlista &fin, int n ) 
{
     Tlista q, t;
     Tlista r, s;
     
     for(int i=0; i<n; i++)
     {
         q = new(struct nodo);
         q->nro = rand()%100;
         
         r = new(struct nodo);
         r->nro = q->nro;
         
         if(inicio==NULL)
         {
              q->sgte = inicio;
              inicio  = q;
              fin     = q; 
         }
         else
         {
              q->sgte   = fin->sgte;
              fin->sgte = q;
              fin       = q;
         }
     }
     
     cout<<"\n\n\tLista de numeros generados... "<<endl;
}
  
 
void reportarLista(Tlista inicio)
{
     
     while(inicio != NULL)
     {
          cout << inicio->nro<<"  " ;
          inicio = inicio->sgte;
     }
 
}
 
void ordenarLista(Tlista lista)
{
     Tlista actual , siguiente;
     int t;
     
     actual = lista;
     while(actual->sgte != NULL)
     {
          siguiente = actual->sgte;
          
          while(siguiente!=NULL)
          {
               if(actual->nro > siguiente->nro)
               {
                    t = siguiente->nro;
                    siguiente->nro = actual->nro;
                    actual->nro = t;          
               }
               siguiente = siguiente->sgte;                    
          }    
          actual = actual->sgte;
          siguiente = actual->sgte;
           
     }
}
 
int suma( Tlista inicio )
{
    int suma = 0;
    while( inicio )
    {
        suma = suma + inicio->nro;
        inicio = inicio->sgte;
    }
    return suma;
}

/*                        Funcion Principal
------------------------------------------------------------------*/
 
int main()
{
    inicio = NULL;
    fin    = NULL;
    float sumar;
 
    system("color 0b");
    
    generarLista( inicio, fin, 25 );
    ordenarLista( inicio );
    cout<<"\n\n LISTA:\n\n";
    reportarLista( inicio );  
    sumar = suma( inicio ); 
    cout<<"\n\nsuma= "<<sumar<<"  promedio= "<<sumar/25<<"\n\n\n";      
    
 
   system("pause");
   
   return 0;
}

Ordenar y combinar listas


20.7.Escriba un programa para combinar dos objetos de lista ordenada de enteros en un solo objeto de lista ordenada de enteros. La función combinar debe recibir referencias a cada uno de los objetos lista que se van a combinar, y debe devolver una referencia a objeto lista en el que se colocarán los elementos combinados.

/*
* C++ - Ordenar y combinar numeros en una lista enlazada simple
*dev c++ ver 4.9.2 , usar cstdlib para versiones mayores
*/
 
#include <iostream>
 
using namespace std;
 
struct nodo{
       int nro;        // en este caso es un numero entero
       struct nodo *sgte;
};
 
typedef struct nodo *Tlista,*Tlista2;
 
Tlista inicio, fin;
Tlista2 inicio2,fin2;
 
void generarLista( Tlista &inicio, Tlista &fin, int n ) 
{
     Tlista q;
     
     for(int i=0; i<n; i++)
     {
         q = new(struct nodo);
         q->nro = rand()%30;
         if(inicio==NULL)
         {
              q->sgte = inicio;
              inicio  = q;
              fin     = q; 
         }
         else
         {
              q->sgte   = fin->sgte;
              fin->sgte = q;
              fin       = q;
         }
     }
     
          inicio = inicio->sgte;
     }
 
}
 
void ordenarLista(Tlista lista)
{
     Tlista actual , siguiente;
     int t;
     
     actual = lista;
     while(actual->sgte != NULL)
     {
          siguiente = actual->sgte;
          
          while(siguiente!=NULL)
          {
               if(actual->nro > siguiente->nro)
               {
                    t = siguiente->nro;
                    siguiente->nro = actual->nro;
                    actual->nro = t;          
               }
               siguiente = siguiente->sgte;                    
          }    
          actual = actual->sgte;
          siguiente = actual->sgte;
           
     }
}
 
void concatenar(Tlista &inicio, Tlista &inicio2)
{
 Tlista aux = inicio;
 while(aux->sgte)
 {
  aux = aux->sgte;
 }
 aux->sgte = inicio2;
}
 
/*                        Funcion Principal
------------------------------------------------------------------*/
 
int main()
{
    inicio = NULL;
    fin    = NULL;
    inicio2 = NULL;
    fin2    = NULL;
 
    system("color 0b");
    
    generarLista( inicio, fin, 4 );
    ordenarLista( inicio );
    cout<<"\n\n LISTA:\n\n";
    reportarLista( inicio );        
    
    generarLista( inicio2, fin2, 5 );
    ordenarLista( inicio2 );
    cout<<"\n\n LISTA:\n\n";
    reportarLista( inicio2 ); 
    
    concatenar( inicio , inicio2 );
    ordenarLista( inicio );
    cout<<"\n\n LISTA:\n\n";
    reportarLista( inicio );
 
   system("pause");
   
   return 0;
}

Concatenar listas


20.6.Escriba un programa para concatenar dos objetos de lista enlazada de caracteres. El programa deberá incluir la función concatenar, que reciba referencias a ambos objetos lista como argumentos y que concatene la segunda lista con la primera.


/* C++  Programa que concatena listas
** 
**@autor: Cristian Quezada & Lucero Polo
**/

#include 

using namespace std;

struct nodo{
       char nom;
       struct nodo *sig;
};

nodo *inicio, *fin;
nodo *inicio2, *fin2;

nodo *generarLista( nodo *inicio,  int n ) //genero una lista aleatoria
{
     nodo *q;
     
     for(int i=0; i<n; i++)
   {
         q = new nodo;
         q->nom = (char)(70+i);
         
         if(inicio==NULL)
         {
              q->sig = inicio;
              inicio  = q;
              fin     = q;        
         }
         else
         {
              q->sig   = fin->sig;
              fin->sig = q;
              fin       = q;
         }
     }
     return inicio;
}




void mostrarLista(nodo *inicio)        //imprime listas
{    
    while(inicio != NULL)
    {
            cout<nom<<"   ";
            inicio=inicio->sig;
    }
 
}


nodo *generarLista2( nodo *inicio, int n ) 
{
     nodo *q , *inicio2 , *fin2;
     inicio2 = NULL;
     fin2    = NULL;
     
     for(int j=0; j<n; j++)
    {
         q = new nodo;
         q->nom = (char)(60+j);
         if(inicio2==NULL)
         {
              q->sig = inicio2;
              inicio2  = q;
              fin2     = q;        
         }
         else
         {
              q->sig   = fin2->sig;
              fin2->sig = q;
              fin2      = q;
         }
     }
     return inicio2;
}

nodo *concatenar(nodo *inicio , nodo *inicio2)
{
 nodo *aux = inicio;
 while(aux->sig)
 {
  aux = aux->sig;
 }
 aux->sig = inicio2;
 return inicio;
}
 
/*                        Funcion Principal
------------------------------------------------------------------*/
 

int main()
{
    inicio = NULL;
    inicio2 = NULL;
    
    system("color 0b");
 
    inicio=generarLista( inicio, 6 );
    
    cout<<"\n\n LISTA:\n\n";
    
    mostrarLista( inicio );

    inicio2=generarLista2( inicio , 6 );
    
    cout<<"\n\n LISTA 2:\n\n";
    
    mostrarLista( inicio2 );
    
    inicio=concatenar( inicio , inicio2);
    
    cout<<"\n\n LISTA 2:\n\n";
    
    mostrarLista( inicio );  cout<<"\n\n\n";

   system("pause");
   
   return 0;
}

Personalizar ,letras y fondo, dev c++

system("color FondoTexto");

0 = Black
1 = Blue
2 = Green
3 = Aqua
4 = Red
5 = Purple
6 = Yellow
7 = White
8 = Gray
9 = Light Blue
A = Light Green
B = Light Aqua
C = Light Red
D = Light Purple
E = Light Yellow
F = Bright White

Ejemplo::

si quieres un fondo Negro y un texto Azul Claro entonces debes codificar:

system("color 09");

un fondo Rojo y un P?rpura Claro ser?a:

system("color 4D");