Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

martes, 9 de diciembre de 2014

Red neuronal artificial (I). Generando conexiones aleatorias condicionadas.

Este es el primer post de una serie de posts que voy a ir creando sobre redes neuronales artificiales. El fin último es conseguir crear una red neuronal artificial básica, con su respectiva estructura conexial entre neuronas, sus entradas y salidas y estudiar así su comportamiento según los estímulos que le vayamos dando.

En este primer apartado la idea es conseguir que los enlaces entre neuronas cercanas sean más probables que las alejadas entre sí. Es decir vamos a crear una generador de números aleatorios con la propiedad de que haya más probabilidades de que salgan más números con valores bajos que de valores altos. De esta forma obtenemos la base para crear los enlaces entre neuronas de uma manera más parecida a una estructura de red neuronal biológica.

Para conseguir el objetivo me he basado en la gráfica de la curvatura de una linea cotangente. El número aleatorio que le demos (eje X), nos lo convierte en otro número de valor más reducido (eje Y).

Ejemplo visual: si le damos una entrada de valor 80, teniendo en cuenta la curvatura de la gráfica nos debería devolver un valor de 25 aproximadamente.



























Código: 

package atan;

import java.util.Scanner;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class Atan {

    public static void main(String[] args) {

        XYSeries series = new XYSeries("Atan (x) -> -10 to 0");

        // Introduccion de datos
        double c = Math.abs(Math.atan(-10));
        double esc; // escala %

        for (int i = 0; i < 11; i++) {
            esc = Math.atan(i - 10) * 100 / c;
            series.add(i * 10, esc + 100);
        }

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);

        JFreeChart chart = ChartFactory.createXYLineChart(
                "Escala aTangente", // Título
                "Número Entrada (x) ->", // Etiqueta Coordenada X
                "Número Salida  (y) ->", // Etiqueta Coordenada Y
                dataset, // Datos
                PlotOrientation.VERTICAL,
                false, 
                false,
                false
        );

        // Mostramos la grafica en pantalla
        ChartFrame frame = new ChartFrame("Ejemplo Grafica Lineal", chart);
        frame.pack();
        frame.setVisible(true);
        
        for (int i = 0; i < 4; i++) {
            System.out.println("\nIngrese número 1 al 100");
            Scanner entrada = new Scanner(System.in);
            double num = entrada.nextInt();

            esc = Math.atan((num / 10) - 10) * 100 / c;

            System.out.println("entrada = " + num);
            System.out.println("salida  = " + (esc + 100));
        }

    }

}


Resutado:

run:

Ingrese número 1 al 100
80
entrada = 80.0
salida  = 24.741493404500787

Ingrese número 1 al 100
40
entrada = 40.0
salida  = 4.451008982239117

Ingrese número 1 al 100
99
entrada = 99.0
salida  = 93.22501681994844

Ingrese número 1 al 100

...


Nota:  Hay la hipótesis de que obteniendo la gráfica de una red neuronal biológica mediante electrodos y siguiendo el mismo procedimiento anterior (aleatoriedad condicionada) se podría recrear de manera aproximada dicha estructura artificialmente en tiempo récord. Se ha recreado la red neuronal de un gusano compuesto de 302 neuronas y 6.393 conexiones siguiendo las conexiones entre ellas una a una (se tardó más de una década en conseguirlo). Un ser más complejo como el ser humano que contiene 100 mil millones de neuronas y billones de enlaces entre sí se haría impracticable a no ser que se obtenga la gráfica de curvatura neuronal y aplicándole el procedimiento aquí expuesto.

No hay comentarios:

Publicar un comentario

Con la tecnología de Blogger.