Page 1 of 3

Inteligencia artificial - Clase TPerceptron

PostPosted: Wed Apr 19, 2017 8:38 am
by Antonio Linares
Este es un ejemplo muy simple para comenzar a aprender las ideas básicas de la Inteligencia Artificial

En este ejemplo creamos un objeto TPerceptron y le hacemos aprender el comportamiento de la función nAnd(), a continuación comprobamos los resultados y parecen correctos.
Acto seguido, creamos un nuevo objeto TPerceptron y le enseñamos el comportamiento de la función nOr(), los resultados parecen correctos nuevamente :-)

No soy ningún experto en IA, solo tengo curiosidad al respecto. Agradezco vuestros comentarios y pruebas

perceptron.prg
Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oPerceptron := TPerceptron():New( 2 )
   local n, nX, nY
   
   // the perceptron learns nAnd()
   for n = 1 to 1000
      oPerceptron:Learn( { nX := nRandom( 1 ), nY := nRandom( 1 ) }, nAnd( nX, nY ) )
   next
   
   MsgInfo( oPerceptron:CalculateOutput( { 1, 1 } ), "1" )  
   MsgInfo( oPerceptron:CalculateOutput( { 1, 0 } ), "0" )
   MsgInfo( oPerceptron:CalculateOutput( { 0, 1 } ), "0" )
   MsgInfo( oPerceptron:CalculateOutput( { 0, 0 } ), "0" )

   // We create a new perceptron to learn nOr()
   oPerceptron := TPerceptron():New( 2 )

   for n = 1 to 1000
      oPerceptron:Learn( { nX := nRandom( 1 ), nY := nRandom( 1 ) }, nOr( nX, nY ) )
   next
   
   MsgInfo( oPerceptron:CalculateOutput( { 1, 1 } ), "1" )
   MsgInfo( oPerceptron:CalculateOutput( { 1, 0 } ), "1" )
   MsgInfo( oPerceptron:CalculateOutput( { 0, 1 } ), "1" )
   MsgInfo( oPerceptron:CalculateOutput( { 0, 0 } ), "0" )
   
   XBrowser( oPerceptron )

return nil

CLASS TPerceptron

   DATA aPreviousWeights
   DATA nPreviousThreshold
   DATA aWeights          
   DATA nThreshold        
   DATA nLearningRate    
   
   METHOD New( nInputs )
   
   METHOD Learn( aInputs, nExpectedOutput )
   
   METHOD CalculateOutput( aInputs )

ENDCLASS

METHOD New( nInputs ) CLASS TPerceptron

   local n

   ::nPreviousThreshold = 0
   ::aWeights = Array( nInputs )
   ::aPreviousWeights = Array( nInputs )
   ::nThreshold = 0
   ::nLearningRate = 0.1

   for n = 1 to nInputs
      ::aPreviousWeights[ n ] = 0
      ::aWeights[ n ] = 0
   next  

return Self

METHOD Learn( aInputs, nExpectedOutput ) CLASS TPerceptron

   local nError := nExpectedOutput - ::CalculateOutput( aInputs )
   local n
   
   for n = 1 to Len( ::aWeights )
      ::aWeights[ n ] = ::aPreviousWeights[ n ] + ::nLearningRate * nError * aInputs[ n ]
   next
   
   ::nThreshold = ::nPreviousThreshold + ::nLearningRate * nError

   ::aPreviousWeights = ::aWeights
   ::nPreviousThreshold = ::nThreshold

return nil

METHOD CalculateOutput( aInputs ) CLASS TPerceptron

   local nSum := 0
   local n
   
   for n = 1 to Len( ::aWeights )
      nSum += aInputs[ n ] * ::aWeights[ n ]
   next  
       
   nSum += ::nThreshold

return If( nSum > 0, 1, 0 )

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Wed Apr 19, 2017 9:20 am
by Carles
A,

too headache... :D

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Wed Apr 19, 2017 9:45 am
by Antonio Linares
La idea es muy simple:

Un perceptrón es el equivalente a una neurona.

El perceptrón recibe una serie de "inputs" y cada uno de estos tiene mayor ó menor intensidad ("pesos"), y el perceptron actúa como una función de Harbour ("CalculateOutputs") recibiendo unos parámetros (los "inputs") y devuelve un resultado para indicar si el resultado calculado es igual ó no al resultado esperado ("nExpectedOutput").

El perceptrón va modificando sus pesos (DATA aWeights) según acierta ó no, y se va "adaptando" al resultado que esperamos.

Cuando el perceptrón está lo suficientemente entrenado, podemos enviarle unos valores y ver si responde correctamente. De ser así
sus "pesos" se han ajustado correctamente y el perceptrón ha aprendido :-)

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Wed Apr 19, 2017 10:54 am
by Antonio Linares

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Wed Apr 19, 2017 2:03 pm
by thefull
GENIAL Antonio!!

Yo también estoy intentando sacar tiempo para hacer un poco los pinitos con IA.
Ahora solo se trata de darle "vida" al asunto ;-)

Saludos Cordiales

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Mon Apr 24, 2017 7:07 pm
by elvira
Maestro Antonio, nos podrías avanzar algo más de esta cosa tan interesante?.

Muy agradecida!.

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Mon Apr 24, 2017 9:29 pm
by Antonio Linares
Elvira,

El objetivo es entender la esencia de un perceptrón y convertirlo en una clase suficientemente genérica.

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Thu Apr 27, 2017 9:44 pm
by thefull
Aqui un video explicando dicho algoritmo;
https://www.youtube.com/watch?v=1XkjVl-j8MM

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Fri Apr 28, 2017 11:49 am
by thefull
En este, en castellano, Redes Neuronales Mutlticapa, básico, muy bueno para entender el Perceptron

https://www.youtube.com/watch?v=jaEIv_E29sk

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Fri Apr 28, 2017 2:31 pm
by wilsongamboa
Buenos días
Maestro Antonio
Podrías ayudarme a elaborar un perceptron cuyo ingreso de datos sean las ventas mes a mes y el año y luego hacerle que predica las ventas futuras ?
Perdón si dije algo mal
Es posible ?
Alguna idea ?
Gracias y perdón por la ignorancia

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Sat Apr 29, 2017 7:44 am
by Antonio Linares
Wilson,

La Clase TPerceptron que he publicado es sólo un primer ejemplo muy básico para comenzar a entender la esencia de la inteligencia artificial.
Tengo la intuición de que podemos hacerla muy genérica y aprender mucho de ella y del funcionamiento de las redes neuronales.

Todas las preguntas, comentarios, aportaciones, sugerencias, etc. son bienvenidas. Hay mucho por aprender :-)

Por un lado hay que comprender en que se basa la inteligencia artificial y por otra parte aprender a usar las herramientas más potentes que ya están disponibles, entre
las que destaca TensorFlow de Google.

La forma más sencilla e intuitiva que he encontrado de usar TensorFlow, sin necesidad de programar nada, es desde una hoja de cálculo de Google.

En este ejemplo vamos a hacer que TensorFlow prediga las ventas futuras:

Image

TensorFlow va a predecir las ventas de julio y agosto, para ellos marcamos toda el area en donde están los datos de los que disponemos:

Image

En el menú seleccionamos "Add-ons", "Smart Autofill" y "Start"

Image

Ahora se nos solicita especificar la columna para la cual deseamos aplicar el Smart Autofill (autorellenado inteligente):

Image

Y un servidor remoto de TensorFlow predice los resultados que buscamos:

Image

Cristobal ha hecho grandes avances en el uso de Google docs desde FWH. Sería fantástico poder usar TensorFlow,
así de fácil, desde nuestras aplicaciones con Harbour y FWH :-)

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Sat Apr 29, 2017 2:51 pm
by wilsongamboa
Gracias Antonio por tu interes
La idea mia es usaf akgo como lo que indicas desde mi programa automaticamente
Cristobal se podra hacer uso automagico de lo que indica Antonio?
Gracias por todo

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Tue May 02, 2017 1:35 pm
by thefull
Antonio,
Por lo que voy entendiendo que la variable nLearningRate, es el valor alpha el cual se usa , llamado también, razón de aprendizaje,
y podrías add un method a la clase ;

Code: Select all  Expand view
METHOD SetLearningRate( n ) INLINE  ::nLearningRate := n


Por lo que estoy aprendiendo, depende de que ejemplo estamos operando , este valor es modificado para ir afinando el Perceptron.

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Tue May 02, 2017 3:20 pm
by Antonio Linares
Rafa,

si, así es.

Si comparamos un perceptrón y una función de Harbour, tenemos:

El perceptrón recibe una serie de valores (inputs). Una función de Harbour recibe una serie de parámetros (inputs).

El perceptrón mantiene una serie de pesos (weights) cuyos valores va modificando. Una función usaría unas variables estáticas, si convertimos la función a Clase, serian DATAs del objeto.

El perceptrón calcula un resultado (output) y una función devuelve un resultado (output).

Este cálculo se hace en base a multiplicar los inputs por sus respectivos pesos. Una función podría evaluar un codeblock que realizase los cálculos que fuesen necesarios (?).

El resultado de este cálculo se compara con el valor esperado (output) y asi se calcula el error (diferencia de lo esperado menos lo obtenido), y se ajustan los pesos. Asi sucesivamente
hasta que el error se aproxima mucho a cero y el perceptrón va "aprendiendo".

Podemos comparar una aplicación, que usa muchas funciones, con una red neuronal ? Que podemos aprender del perceptrón para hacer nuestras aplicaciones "inteligentes" ? :-)

Propongo este brain-storming por si alguno más se anima a darle vueltas a estas ideas :-)

Re: Inteligencia artificial - Clase TPerceptron

PostPosted: Tue May 16, 2017 4:48 am
by Antonio Linares
Image

Pedro Domingos: The Master Algorithm
https://youtu.be/95XgpJAX6YE

Image

Image