Professional Documents
Culture Documents
\
|
=
donde el rango de k cubre todas aquellas neuronas a las que est conectada la
salida de U
j.
De esta forma, el error que se produce en una neurona oculta es
la suma de los errores que se producen en las neuronas a las que est
conectada la salida de sta, multiplicando cada uno de ellos por el peso de la
conexin.
Figura 4.14 Conexiones entre neuronas de la capa oculta con la capa de salida.
ADICIN DE UN MOMENTO EN LA REGLA DELTA GENERALIZADA
El mtodo de retropropagacin del error, tambin conocido como del gradiente
descendente, requiere un importante nmero de clculos para lograr el ajuste
de los pesos de la red. En la implementacin del algoritmo, se toma una
amplitud de paso que viene dada por la tasa de aprendizaje . A mayor tasa
de aprendizaje, mayor es la modificacin de los pesos en cada iteracin, con lo
que el aprendizaje ser ms rpido, pero, por otro lado. puede dar lugar a
oscilaciones. Rumelhart, Hinton y Williams sugirieron que para filtrar estas
oscilaciones se aada en la expresin del incremento de los pesos un trmino
(momento), , de manera que dicha expresin quede:
186 Tpicos y Aplicaciones de la Inteligencia Artificial
( ) ( ) ( ) ( ) ( ) = + + = + 1 1 t w t w y t w t w
ji ji pi pj ji ji
( ) ( ) t w y t w
ji pi pj ji
+ = + = 1
donde es una constante (momento) que determnale efecto en t+1 del
cambio de los pesos en el instante t.
Con este momento se consigue la convergencia de la red en menor nmero de
iteraciones, ya que si en t el incremento de un peso era positivo y en t+l
tambin, entonces el descenso por la superficie de error en t+l es mayor. Sin
embargo, si en t el incremento era positivo y en t+l es negativo, el paso que se
da en t+1 es ms pequeo, lo cual es adecuado, ya que eso significa que se
ha pasado por un mnimo y que los pasos deben ser menores para poder
alcanzarlo.
Resumiendo, el algoritmo backpropagation queda finalmente:
( ) ( ) ( ) [ ] 1 1 + + = + t w t w t w
ji ji ji
( ) ( ) ( )
(
+ + = + t w y t w t w
ji pi pj ji ji
1
donde:
( ) ( )
j pj pj pj
net f y d
1
=
si U
j
es una neurona de salida y
( )
j kj
k
pk pj
net f w
1
|
\
|
=
si U
j
no es una neurona de salida.
ESTRUCTURA Y APRENDIZAJE DE LA RED BACKPROPAGATION
En una red backpropagation existe una capa de entrada con n neuronas y una
capa de salida con m neuronas y al menos una capa oculta de neuronas
internas. Cada neurona de una capa (excepto las de entrada) recibe entradas
de todas las neuronas de la capa anterior y enva su salida a todas las
Mg. Abraham Gamarra Moreno 187
neuronas de la capa posterior (excepto las de salida). No hay conexiones hacia
atrs feedback ni laterales entre neuronas de la misma capa.
La aplicacin del algoritmo backpropagation tiene dos fases, una hacia
adelante y otra hacia atrs. Durante la primera fase el patrn de entrada es
presentado a la red y propagado a travs de las capas hasta llegar a la capa
de salida. Obtenidos los valores de salida de la red, se inicia la segunda fase,
comparndose estos valores con la salida esperada para obtener el error. Se
ajustan los pesos de la ltima capa proporcionalmente al error. Se pasa a la
capa anterior con una retropropagacin del error (backpropagation), ajustando
convenientemente los pesos y continuando con este proceso hasta llegar a la
primera capa. De esta manera se han modificado los pesos de las conexiones
de la red para cada ejemplo o patrn de aprendizaje del problema, del que
conocamos su valor de entrada y la salida deseada que debera generar la red
ante dicho patrn (fig. 4.15).
A diferencia de la regla delta en el caso del Perceptron, la tcnica
backpropagation o generalizacin de la regla delta, requiere el uso de
neuronas cuya funcin de activacin sea continua, y por tanto, diferenciable.
Generalmente, la funcin utilizada ser del tipo sigmoidal (Fig. 4.16).
A continuacin se presentan, a modo de sntesis. los pasos y frmulas a utilizar
para aplicar el algoritmo de entrenamiento:
Paso 1
Inicializar los pesos de la red con valores pequeos aleatorios.
Paso 2
Presentar un patrn de entrada, Xp: xp1,.xp2,...,xpn, y especificar la salida
deseada que debe generar la red: d1, d2,..., dM (si la red se utiliza como un
clasificador, todas las salidas deseadas sern cero, salvo una, que ser la de
la clase a la que pertenece el patrn de entrada).
Paso 3
Calcular la salida actual de la red, para ello presentamos las entradas a la red
y vamos calculando la salida que presenta capa hasta llegar a la capa de
salida sta ser la salida de la red y1, y2,...,yM. Los pasos son los siguientes:
Se calculan las entradas netas para las neuronas ocultas procedentes de
las neuronas de entrada.
Para una neurona j oculta:
=
+ =
N
i
h
j pi
h
ji
h
pj
x w net
1
188 Tpicos y Aplicaciones de la Inteligencia Artificial
en donde el ndice h se refiere a magnitudes de la capa oculta (hidden); el
subndice p, al p-simo vector de entrenamiento, y j a la j-sima neurona
oculta. El trmino puede ser opcional, pues acta como una entrada
ms.
Figura 4.15 Modelo de arquitectura de una red backpropagation. Pueden existir neuronas ficticias
de salida y pesos umbral de entrada al resto de las neuronas de cada capa.
Mg. Abraham Gamarra Moreno 189
Figura 4.16 Funcin de activacin sigmoidal: y=1/1+e
-x
Se calculan las salidas de las neuronas ocultas:
( )
h
pj
h
j pj
net f y =
Se realizan los mismos clculos para obtener las salidas de las neuronas
de salida (capa o: output)
=
+ =
L
j
o
k pj
o
kj
o
pk
y w net
1
( )
o
pk
o
k pk
net f y =
Paso 4
Calcular los trminos de error para todas las neuronas.
Si la neurona k es una neurona de la capa de salida, el valor de la delta es:
190 Tpicos y Aplicaciones de la Inteligencia Artificial
( ) ( )
o
pk
o
k pk pk
o
pk
net f y d
1
=
La funcin f, como se cit anteriormente, debe cumplir el requisito de ser
derivable, lo que implica la imposibilidad de utilizar una funcin escaln. En
general, disponemos de dos formas de funcin de salida que nos pueden
servir: la funcin lineal de salida (f
k
(net
jk
) = net
jk
) y la funcin sigmoidal
representada en la figura 4.16 y definida por la expresin:
( )
jk
net
jk k
e
net f
+
=
1
1
La seleccin de la funcin de salida depende de la forma en que se decida
representar los datos de salida: si se desea que las neuronas de salida sean
binarias, se utiliza la funcin sigmoidal, puesto que esta funcin es casi
biestable y, adems, derivable. En otros casos es tan aplicable una funcin
como otra.
Para la funcin lineal, tenemos:
1
1
=
o
k
f
mientras que la derivada de una
funcin f sigmoidal es:
( ) ( )
pk pk
o
k
o
k
o
k
y y f f f = = 1 1
1
por lo que los trminos de error para las neuronas de salida quedan:
( )
pk pk
o
pk
y d =
para la salida lineal, y
( ) ( )
pk pk pk pk
o
pk
y y y d = 1
para la salida sigmoidal.
Si la neurona j no es de salida, entonces la derivada parcial del error no puede
ser evaluada directamente. Por tanto, se obtiene el desarrollo a partir de
valores que son conocidos y otros que pueden ser evaluados.
La expresin obtenida en este caso es:
Mg. Abraham Gamarra Moreno 191
( )
o
kj
k
o
pk
h
pj
h
j
h
pj
w net f =
1
donde observamos que el error en las capas ocultas depende de todos los
trminos de error de la capa de salida. De aqu surge el trmino de
propagacin hacia atrs. En particular, para la funcin sigmoidal:
donde k se refiere a todas las neuronas de la capa superior a la de la neurona
j. As, el error que se produce en una neurona oculta es proporcional a la suma
de los errores conocidos que se producen en las neuronas a las que est
conectada la salida de sta, multiplicado cada uno de ellos por el peso de la
conexin. Los umbrales internos de las neuronas se adaptan de forma similar,
considerando que estn conectados con pesos desde entradas auxiliares de
valor constante.
Paso 5
Actualizacin de los pesos
Para ello, utilizamos el algoritmo recursivo, comenzando por las neuronas de
salida y trabajando hacia atrs hasta llegar a la capa de entrada, ajustando los
pesos de la forma siguiente:
Para los pesos de las neuronas de la capa de salida:
( ) ( ) ( ) 1 1 + + = + t w t w t w
o
kj
o
kj
o
kj
( )
pj
o
pk
o
kj
y t w = + 1
y para los pesos de las neuronas de la capa oculta:
( ) ( ) ( ) 1 1 + + = + t w t w t w
h
ji
h
ji
h
ji
( )
pi
h
pj
h
ji
x t w = + 1
En ambos casos, para acelerar el proceso de aprendizaje, se puede aadir un
trmino momento de valor:
( ) ( ) ( ) 1 t w t w
o
kj
o
kj
( )
o
kj
k
o
pk pj pj
h
pj
w y y =
1
192 Tpicos y Aplicaciones de la Inteligencia Artificial
en el caso de la neurona de salida, y
( ) ( ) ( ) 1 t w t w
h
ji
h
ji
cuando se trata de una neurona oculta.
Paso 6
El proceso se repite hasta que el trmino de error
=
=
M
k
pk p
E
1
2
2
1
resulta aceptablemente pequeo para cada uno de los patrones aprendidos.
4.9. IMPLEMENTACIN DE APLICACIONES CON REDES
NEURONALES
Para la implementacin de aplicaciones se utiliza el shell NEUROSHELL y el
Visual Basic .NET.
4.9.1. DETECCIN DE OBSTCULOS POR MEDIO DE UN ROBOT
Descripcin del problema
7
:
Un robot es un dispositivo automtico que realiza acciones especficas, que
dependen de las necesidades del proceso en que se encuentre involucrado, en
este caso se tiene un robot que cuenta con cuatro sensores de proximidad en
distintas ubicaciones que permanentemente detectan si hay objetos que se
encuentren a una distancia superior o inferior a la preestablecida, con base en
esto se decide si dar marcha adelante o atrs a cada uno de los dos motores
que posee; en las lecturas de los sensores podran darse 16 posibles
combinaciones (16=2
4
) y para cada combinacin cada uno de los dos motores
podra dar marcha adelante o marcha atrs (figura 4.17).
El comportamiento del robot lo describe la tabla 4.4, cuando los sensores
detecten un objeto que se encuentra a una distancia inferior a la
predeterminada se dir que el objeto se encuentra cerca y esto se representa
por medio de un 1 y cuando se detecte un objeto que se encuentra a una
distancia mayor que la predeterminada se dir que el objeto esta lejos lo cual
se indica con un 1; dependiendo de estas lecturas los motores podrn dar
7
Universidad Tecnolgica de Pereira. Colombia.
Mg. Abraham Gamarra Moreno 193
marcha adelante, lo que se representar por un 1 o dar marcha atrs con un
1.
Figura 4.17 Robot
Tabla 4.4 Comportamiento del robot
S1 S2 S3 S4 M1 M2
1 1 1 1 -1 -1
-1 1 1 1 -1 1
1 1 -1 -1 1 -1
-1 -1 -1 -1 1 1
1 -1 1 1 1 -1
1 1 -1 1 -1 1
1 1 1 -1 1 -1
Justificacin del tipo de red
Este tipo de problema generalmente es resuelto suministrndole al robot una
base de datos que contiene todas las posibles situaciones que se podran
presentarse y sus respectivas soluciones, en este caso se necesitara
almacenar las respuestas para ambos motores ante las 16 posibles
combinaciones en las lecturas de los sensores, cuando el nmero de variables
de entrada y el nmero de salidas es mucho mayor, la cantidad de datos
necesarios para especificar cada posible situacin crece indefinidamente,
debido a esto se requeriran dispositivos con gran capacidad de
194 Tpicos y Aplicaciones de la Inteligencia Artificial
almacenamiento; en contraste una red neuronal puede entrenarse con un
nmero representativo de patrones y aprender el comportamiento del sistema
utilizando dispositivos de menos capacidad de almacenamiento y costo.
IMPLEMENTACION EN NEUROSHELL
El ingreso al programa al NEUROSHELL se muestra en la figura 4.18.
Figura 4.18 Ingreso al Neuroshell
Luego del ingreso elija FILE, NEW e ingrese un nombre de archivo, como en la
figura 4.19 (no escriba ninguna extensin para el archivo).
Figura 4.19.
Elija Beginners Neural Networks, realice click en el icono (figura 4.20).
Mg. Abraham Gamarra Moreno 195
Figura 4.20
Seleccione Data Entry (figura 4.21) e ingrese los datos de la tabla 4.4, para
entrenar la red neuronal (figura 4.22). Se sugiere para el entrenamiento
duplicar estos datos dos veces salvo el titulo de cada columna.
Figura 4.21
196 Tpicos y Aplicaciones de la Inteligencia Artificial
Figura 4.22
Luego de ingresar los datos cierre la ventana despus de haber grabado estos
con File, Save File.
Ahora elija el icono en la figura 4.21, en la lista desplegable variable
type selection elija input y haga clic debajo del nombre de cada entrada, este
quedar marcado con I, luego elija Actual Output en la lista desplegable
anterior y haga clic en el nombre de cada salida para la red neuronal. Ahora
elija Settings y Compute mins/maxs. Cierre la ventana.
Las figuras 4.23 al 4.29 muestran el procedimiento a seguir hasta generar el
cdigo fuente en C o Visual Basic.
En la figura 4.26 elija examinar datos para analizar los datos y los errores
generados a la salida.
El procedimiento de la figura 4.27 al 4.29 permite generar el cdigo fuente en
C. Para nuestro caso elegiremos Visual Basic source code.
Mg. Abraham Gamarra Moreno 197
Figura 4.23
Figura 4.24
198 Tpicos y Aplicaciones de la Inteligencia Artificial
Figura 4.25
Figura 4.26
Mg. Abraham Gamarra Moreno 199
Figura 4.27
Figura 4.28
200 Tpicos y Aplicaciones de la Inteligencia Artificial
Figura 4.29
El codigo generado en Visual Basic se genera en un archivo que tiene la
extensin .VB y es un procedimiento en Visual Basic; que contiene el
conocimiento en una red neuronal. Para nuestro caso el archivo es ROBOT.VB
y se encuentra en la carpeta APLICACIN ROBOT del CD que acompaa al
libro, cuyo contenido es:
' Insert this code into your VB program to fire the
D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network
' This code is designed to be simple and fast for porting to any machine.
' Therefore all code and weights are inline without looping or data storage
' which might be harder to port between compilers.
Sub Fire_ROBOT (inarray(), outarray())
Dim netsum as double
Static feature2(3) as double
' inarray(1) is S1
' inarray(2) is S2
' inarray(3) is S3
' inarray(4) is S4
' outarray(1) is M1
' outarray(2) is M2
if (inarray(1)<-1) then inarray(1) = -1
if (inarray(1)> 1) then inarray(1) = 1
inarray(1) = (inarray(1) + 1) / 2
Mg. Abraham Gamarra Moreno 201
if (inarray(2)<-1) then inarray(2) = -1
if (inarray(2)> 1) then inarray(2) = 1
inarray(2) = (inarray(2) + 1) / 2
if (inarray(3)<-1) then inarray(3) = -1
if (inarray(3)> 1) then inarray(3) = 1
inarray(3) = (inarray(3) + 1) / 2
if (inarray(4)<-1) then inarray(4) = -1
if (inarray(4)> 1) then inarray(4) = 1
inarray(4) = (inarray(4) + 1) / 2
netsum = -.7532668
netsum = netsum + inarray(1) * 7.551737
netsum = netsum + inarray(2) * .2998328
netsum = netsum + inarray(3) * 7.341322
netsum = netsum + inarray(4) * -6.852577
feature2(1) = 1 / (1 + exp(-netsum))
netsum = -2.495483
netsum = netsum + inarray(1) * -5.648689
netsum = netsum + inarray(2) * 1.05053
netsum = netsum + inarray(3) * -5.979871
netsum = netsum + inarray(4) * 6.870361
feature2(2) = 1 / (1 + exp(-netsum))
netsum = -4.198974E-02
netsum = netsum + inarray(1) * 4.999131
netsum = netsum + inarray(2) * -3.897346
netsum = netsum + inarray(3) * 2.603323E-05
netsum = netsum + inarray(4) * -3.897321
feature2(3) = 1 / (1 + exp(-netsum))
netsum = .1287855
netsum = netsum + feature2(1) * -2.675452
netsum = netsum + feature2(2) * -2.65109
netsum = netsum + feature2(3) * 6.387748
outarray(1) = 1 / (1 + exp(-netsum))
netsum = 3.821959
netsum = netsum + feature2(1) * -6.030695
netsum = netsum + feature2(2) * 3.957484
netsum = netsum + feature2(3) * 8.61486E-03
outarray(2) = 1 / (1 + exp(-netsum))
outarray(1) = 2 * (outarray(1) - .1) / .8 + -1
if (outarray(1)<-1) then outarray(1) = -1
if (outarray(1)> 1) then outarray(1) = 1
outarray(2) = 2 * (outarray(2) - .1) / .8 + -1
if (outarray(2)<-1) then outarray(2) = -1
if (outarray(2)> 1) then outarray(2) = 1
End Sub
202 Tpicos y Aplicaciones de la Inteligencia Artificial
Ahora debemos generar una aplicacin en Visual Basic 6.0, que nos permita
utilizar el cdigo que contiene a la red neuronal.
Iniciamos creando un formulario que permita manipular las entradas y salidas
que tiene la red neuronal (figura 4.30).
Figura 4.30. Formulario en Visual Basic que manipula las entradas y salidas de la red neuronal.
Luego modificamos el cdigo por defecto que tiene el formulario. El cdigo
modificado debe quedar tal como se muestra en el listado siguiente:
Private Sub Command1_Click()
Dim e(4) As Double
Dim s(2) As Double
' Asignacion de entradas
e(1) = Val(Text1.Text)
e(2) = Val(Text2.Text)
e(3) = Val(Text3.Text)
e(4) = Val(Text4.Text)
' llamada a la red neuronal
Call Fire_ROBOT(e, s)
' mostrar salida
If (s(1) >= 0.9 And s(1) <= 1) Then
Text5.Text = " motor gira hacia adelante"
End If
If (s(1) >= -1 And s(1) <= -0.9) Then
Text5.Text = " motor gira hacia atrs"
End If
If (s(2) >= 0.9 And s(2) <= 1) Then
Text6.Text = " motor gira hacia adelante"
End If
Mg. Abraham Gamarra Moreno 203
If (s(2) >= -1 And s(2) <= -0.9) Then
Text6.Text = " motor gira hacia atrs"
End If
End Sub
' Insert this code into your VB program to fire the
D:\ABRAHAM\FILES2~2\EPG\MAESTA~1\IA\ROBOT network
' This code is designed to be simple and fast for porting to any machine.
' Therefore all code and weights are inline without looping or data storage
' which might be harder to port between compilers.
Sub Fire_ROBOT(inarray() As Double, outarray() As Double)
Dim netsum As Double
Static feature2(3) As Double
' inarray(1) is S1
' inarray(2) is S2
' inarray(3) is S3
' inarray(4) is S4
' outarray(1) is M1
' outarray(2) is M2
If (inarray(1) < -1) Then inarray(1) = -1
If (inarray(1) > 1) Then inarray(1) = 1
inarray(1) = (inarray(1) + 1) / 2
If (inarray(2) < -1) Then inarray(2) = -1
If (inarray(2) > 1) Then inarray(2) = 1
inarray(2) = (inarray(2) + 1) / 2
If (inarray(3) < -1) Then inarray(3) = -1
If (inarray(3) > 1) Then inarray(3) = 1
inarray(3) = (inarray(3) + 1) / 2
If (inarray(4) < -1) Then inarray(4) = -1
If (inarray(4) > 1) Then inarray(4) = 1
inarray(4) = (inarray(4) + 1) / 2
netsum = -0.7532668
netsum = netsum + inarray(1) * 7.551737
netsum = netsum + inarray(2) * 0.2998328
netsum = netsum + inarray(3) * 7.341322
netsum = netsum + inarray(4) * -6.852577
feature2(1) = 1 / (1 + Exp(-netsum))
netsum = -2.495483
netsum = netsum + inarray(1) * -5.648689
netsum = netsum + inarray(2) * 1.05053
netsum = netsum + inarray(3) * -5.979871
netsum = netsum + inarray(4) * 6.870361
feature2(2) = 1 / (1 + Exp(-netsum))
netsum = -0.04198974
netsum = netsum + inarray(1) * 4.999131
netsum = netsum + inarray(2) * -3.897346
netsum = netsum + inarray(3) * 0.00002603323
netsum = netsum + inarray(4) * -3.897321
feature2(3) = 1 / (1 + Exp(-netsum))
netsum = 0.1287855
204 Tpicos y Aplicaciones de la Inteligencia Artificial
netsum = netsum + feature2(1) * -2.675452
netsum = netsum + feature2(2) * -2.65109
netsum = netsum + feature2(3) * 6.387748
outarray(1) = 1 / (1 + Exp(-netsum))
netsum = 3.821959
netsum = netsum + feature2(1) * -6.030695
netsum = netsum + feature2(2) * 3.957484
netsum = netsum + feature2(3) * 0.00861486
outarray(2) = 1 / (1 + Exp(-netsum))
outarray(1) = 2 * (outarray(1) - 0.1) / 0.8 + -1
If (outarray(1) < -1) Then outarray(1) = -1
If (outarray(1) > 1) Then outarray(1) = 1
outarray(2) = 2 * (outarray(2) - 0.1) / 0.8 + -1
If (outarray(2) < -1) Then outarray(2) = -1
If (outarray(2) > 1) Then outarray(2) = 1
End Sub
Private Sub Command2_Click()
End
End Sub
Notese que tambin se ha agregado el cdigo generado por el Neuroshell
(contenido del archivo ROBOT.VB)
Una vez modificado el cdigo ejecutamos el programa e ingresamos las
entradas de la red neuronal y al presionar el boton Determinar la accion de los
motores del robot con una red neuronal se debe obtener la salida que ofrece
la red neuronal. Para nuestro caso se ha realizado la ejecucin con las
entradas del ltimo patrn de entrenamiento de la tabla 4.4, esta ejecucin se
muestra en la figura 4.31.
Figura 4.31. Ejecucin del programa que utiliza la red neuronal.
Mg. Abraham Gamarra Moreno 205
Cabe mencionar que las salidas de la red neuronal son cercanas o iguales a 1
-1 y se debe aproximar estas salidas a estos valores. Esta aproximacin se
realiza a travs del siguiente cdigo:
If (s(1) >= 0.9 And s(1) <= 1) Then
Text5.Text = " motor gira hacia adelante"
End If
If (s(1) >= -1 And s(1) <= -0.9) Then
Text5.Text = " motor gira hacia atrs"
End If
If (s(2) >= 0.9 And s(2) <= 1) Then
Text6.Text = " motor gira hacia adelante"
End If
If (s(2) >= -1 And s(2) <= -0.9) Then
Text6.Text = " motor gira hacia atrs"
End If
4.9.2. APLICACIN PARA SNTOMAS Y DIAGNSTICOS DE
AUTOMVILES
Consideremos un ejemplo concreto de aplicacin de sntomas y diagnsticos.
Emplearemos Como base para nuestro ejemplo una aplicacin de diagnstico
para automviles. Concretamente, nos concentraremos en una aplicacin que
diagnostique por qu no arranca un coche. Primero se definen los distintos
sntomas que hay que considerar:
No hace nada: no pasa nada cuando se hace girar la llave del contacto.
Hace clic: cuando se da vuelta a la llave, se oyen fuertes chasquidos.
Molinillo: cuando se da vuelta a la llave se oye un ruido parecido al de un
molinillo.
Arranque: el motor gira como si intentase arrancar, pero no es capaz de
funcionar por s mismo.
Sin chispa: al sacar el cable de una buja y acercarlo al bloque cuando se
intenta arrancar, en el motor no saltan chispas.
Cable caliente: despus de intentar arrancar el motor, el cable que va de la
batera a la bobina del motor de arranque est caliente.
Sin gasolina: al sacar el tubo de gasolina del carburador (o inyector) e
intentar arrancar el motor, no sale gasolina por el tubo.
A continuacin, se consideran las posibles causas del problema, basndose en
los sntomas:
Batera: la batera est descargada
206 Tpicos y Aplicaciones de la Inteligencia Artificial
Bobina del motor de arranque: falla la bobina del motor de arranque.
Motor de arranque: falla el motor de arranque.
Cables: fallan los cables del encendido.
Distribuidor: el rotor o la tapa del distribuidor estn corrodos.
Bomba de gasolina: falla la bomba de gasolina.
Aunque nuestra lista no es una representacin Completa de todos los posibles
problemas, los sntomas podran indicar alguno de estos problemas, o una
combinacin de ellos. Para completar el ejemplo vamos a construir una matriz
que indica la correspondencia de los sntomas con sus causas probables. La
matriz se ha ilustrado en la Tabla 4.5.
Al inspeccionar la matriz se aprecia la variedad de problemas que puede
indicar cualquier sntoma. La matriz tambin ilustra el problema que
encontramos cuando se intenta programar un sistema para llevar a cabo la
funcin de diagnstico. Es raro que haya una correspondencia biunvoca entre
sntomas y causas. Para tener xito, nuestro sistema automatizado debe ser
capaz de correlacionar muchos sntomas distintos, y, en el caso de que alguno
de los sntomas no se aprecie o est ausente, debe ser capaz de "llenar los
espacios en blanco" del problema basndose solamente en los sntomas
indicados.
Tabla 4.5. Para el problema de diagnsticos del automvil, se hacen corresponder los sntomas con
las causas.
Causas probables
Sntomas Batera Bobina Motor de
arranque
Cables Distribuidor Bomba de
gasolina
No hace nada X
Clics X X X
Molinillo X X X X
Gira X X X
Sin chispa X X
Cable caliente X X
Sin gasolina X
La solucin
Empleando los datos de nuestro ejemplo, ser necesaria una red con siete
unidades de entrada y seis unidades de salida. Esto deja nicamente sin
determinar el nmero de unidades internas (ocultas). En este caso, no hay
nada que indique cuntas unidades ocultas se van a necesitar para resolver el
problema, y no hay consideraciones de interfaz externa que vayan a limitar el
nmero de unidades ocultas.
Mg. Abraham Gamarra Moreno 207
Una ecuacin emprica segn Sierra
8
, para calcular el nmero de neuronas de
una capa oculta es:
N
M
n
N
M * 2
* 2
< <
donde:
M: Es el nmero de ejemplos con que vamos a entrenar a la red.
N: Es el nmero de unidades de entradas.
n: Es el nmero de neuronas que vamos a situar en capas intermedias
El shell Neuroshell calcula la cantidad de neuronas ocultas para la red
neuronal que se esta implementando.
A continuacin, debemos definir los conjuntos de datos que sern utilizados
para entrenar a la red. Volviendo de nuevo a la matriz de nuestro ejemplo, se
pueden considerar los datos de los vectores fila de la matriz como tramas de
entrada de siete dimensiones; esto es, para cada salida de causa probable que
desearamos que aprendiera la red, hay siete sntomas posibles que indican el
problema por su presencia o ausencia. Esta aproximacin proporcionar siete
pares de vectores de entrenamiento, cada uno de los cuales consta de una
trama de sntomas de siete elementos y de una trama de indicacin de
problema formada por seis elementos.
Haremos que la existencia de un sntoma quede indicada por un 1, y que la
ausencia de un sntoma sea representada mediante un 0. Para cualquier
vector de entrada dado, la causa o causas correctas se indican mediante un 1
lgico en la posicin correspondiente del vector de salida. Los pares de
vectores de entrenamiento que se producen por la correspondencia de la
matriz de sntomas y problemas para este ejemplo se muestran en la tabla 4.6.
Si se comparan las tablas 4.5 y la tabla 4.6., se notarn pequeas diferencias.
Lo nico que queda ahora es entrenar a la red con estos pares de datos. Una
vez que est entrenada, la red producir una salida que identifique a la causa
probable indicada por el mapa de sntomas de entrada. La red har esto
cuando la entrada sea equivalente a una de las entradas de entrenamiento, tal
como se esperaba, y adems producir una salida, indicando la causa
probable del problema, cuando la entrada sea parecida a alguna de las
entradas de entrenamiento, pero distinta de todas ellas. Esta aplicacin ilustra
la capacidad de la red para realizar la "mejor suposicin" (generalizacin) y
pone de manifiesto la capacidad de la red para enfrentarse a entradas de datos
con ruido o incompletas.
1.
8
Sierra Molina, Guillermo y otros (1995). Sistemas Expertos en Contabilidad y
Administracin de Empresas. Editorial Addison Wesley. USA.
208 Tpicos y Aplicaciones de la Inteligencia Artificial
Tabla 4.6. Estos pares de vectores de entrenamiento se utilizan para el problema de diagnsticos
del automvil.
Entrada de sntomas Salida de causas probables
N
o
h
a
c
e
n
a
d
a
C
l
i
c
s
M
o
l
i
n
i
l
l
o
G
i
r
a
S
i
n
c
h
i
s
p
a
C
a
b
l
e
c
a
l
i
e
n
t
e
S
i
n
g
a
s
o
l
i
n
a
B
a
t
e
r
a
B
o
b
i
n
a
M
o
t
o
r
d
e
a
r
r
a
n
q
u
e
C
a
b
l
e
s
D
i
s
t
r
i
b
u
i
d
o
r
B
o
m
b
a
d
e
g
a
s
o
l
i
n
a
1
0 0 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 1 1 1 0 0 0
0 0 1 0 0 0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 0 0 0 1 1 1
0 0 0 0 1 0 0 0 0 0 1 1 0
0 0 0 0 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 1
Se puede utilizar el Neuroshell, para entrenar a la red neuronal con los datos
de la tabla 4.6 y se debe obtener tambin el codigo fuente en Visual Basic. La
implementacion se encuentra en el CD que se adjunta al libro.
El formulario y la ejecucin del programa en Visual Basic 6.0, teniendo en
cuenta el 4to patron de entrenamiento se muestra en la figura 4.32.
Figura 4.32. Ejecucin del programa en Visual Basic 6.0, teniendo en cuenta el 4 patron de
entrenamiento de la tabla 4.6.
El codigo del formulario debe ser modificado de la siguiente manera:
Mg. Abraham Gamarra Moreno 209
Private Sub Command1_Click()
Dim e(7) As Double
Dim s(6) As Double
e(1) = Val(Text1.Text)
e(2) = Val(Text2.Text)
e(3) = Val(Text3.Text)
e(4) = Val(Text4.Text)
e(5) = Val(Text5.Text)
e(6) = Val(Text6.Text)
e(7) = Val(Text7.Text)
Call Fire_DIAGNOST(e, s)
If (s(1) > 0.9 And s(1) <= 1) Then
Text8.Text = "mal"
End If
If (s(1) >= 0 And s(1) < 0.1) Then
Text8.Text = "bien"
End If
If (s(2) > 0.9 And s(2) <= 1) Then
Text9.Text = "mal"
End If
If (s(2) >= 0 And s(2) < 0.1) Then
Text9.Text = "bien"
End If
If (s(3) > 0.9 And s(3) <= 1) Then
Text10.Text = "mal"
End If
If (s(3) >= 0 And s(3) < 0.1) Then
Text10.Text = "bien"
End If
If (s(4) > 0.9 And s(4) <= 1) Then
Text11.Text = "mal"
End If
If (s(4) >= 0 And s(4) < 0.1) Then
Text11.Text = "bien"
End If
If (s(5) > 0.9 And s(5) <= 1) Then
Text12.Text = "mal"
End If
If (s(5) >= 0 And s(5) < 0.1) Then
Text12.Text = "bien"
End If
If (s(6) > 0.9 And s(6) <= 1) Then
Text13.Text = "mal"
End If
If (s(6) >= 0 And s(6) < 0.1) Then
Text13.Text = "bien"
End If
End Sub
210 Tpicos y Aplicaciones de la Inteligencia Artificial
' Insert this code into your VB program to fire the
F:\FILES2~1\ANNOSA~1\ARCHIV~2\CAPITU~3\DIAGNO~1\DIAGNOST network
' This code is designed to be simple and fast for porting to any machine.
' Therefore all code and weights are inline without looping or data storage
' which might be harder to port between compilers.
Sub Fire_DIAGNOST(inarray() As Double, outarray() As Double)
Dim netsum As Double
Static feature2(9) As Double
' inarray(1) is No_hace_Nada
' inarray(2) is Hace_Clics
' inarray(3) is Molinillo
' inarray(4) is Gira
' inarray(5) is Sin_chispa
' inarray(6) is Cable_caliente
' inarray(7) is Sin_gasolina
' outarray(1) is Batera
' outarray(2) is Bobina
' outarray(3) is Motor_de_arranque
' outarray(4) is Cables
' outarray(5) is Distribuidor
' outarray(6) is Bomba_de_gasolina
If (inarray(1) < 0) Then inarray(1) = 0
If (inarray(1) > 1) Then inarray(1) = 1
inarray(1) = inarray(1)
If (inarray(2) < 0) Then inarray(2) = 0
If (inarray(2) > 1) Then inarray(2) = 1
inarray(2) = inarray(2)
If (inarray(3) < 0) Then inarray(3) = 0
If (inarray(3) > 1) Then inarray(3) = 1
inarray(3) = inarray(3)
If (inarray(4) < 0) Then inarray(4) = 0
If (inarray(4) > 1) Then inarray(4) = 1
inarray(4) = inarray(4)
If (inarray(5) < 0) Then inarray(5) = 0
If (inarray(5) > 1) Then inarray(5) = 1
inarray(5) = inarray(5)
If (inarray(6) < 0) Then inarray(6) = 0
If (inarray(6) > 1) Then inarray(6) = 1
inarray(6) = inarray(6)
If (inarray(7) < 0) Then inarray(7) = 0
If (inarray(7) > 1) Then inarray(7) = 1
inarray(7) = inarray(7)
netsum = -0.3115481
netsum = netsum + inarray(1) * 0.7032344
netsum = netsum + inarray(2) * 0.1466639
netsum = netsum + inarray(3) * 2.036957
netsum = netsum + inarray(4) * -0.4733835
netsum = netsum + inarray(5) * -0.4653012
netsum = netsum + inarray(6) * -1.454124
netsum = netsum + inarray(7) * -0.7716009
Mg. Abraham Gamarra Moreno 211
feature2(1) = 1 / (1 + Exp(-netsum))
netsum = -0.007483043
netsum = netsum + inarray(1) * -0.7950581
netsum = netsum + inarray(2) * -1.6701
netsum = netsum + inarray(3) * 1.082342
netsum = netsum + inarray(4) * 0.8707346
netsum = netsum + inarray(5) * -0.3615806
netsum = netsum + inarray(6) * -0.6289499
netsum = netsum + inarray(7) * 0.9206671
feature2(2) = 1 / (1 + Exp(-netsum))
netsum = 0.3411922
netsum = netsum + inarray(1) * 1.407685
netsum = netsum + inarray(2) * 1.998027
netsum = netsum + inarray(3) * -1.747856
netsum = netsum + inarray(4) * -1.269704
netsum = netsum + inarray(5) * -2.329731
netsum = netsum + inarray(6) * 1.356552
netsum = netsum + inarray(7) * 1.647663
feature2(3) = 1 / (1 + Exp(-netsum))
netsum = -0.2768248
netsum = netsum + inarray(1) * 2.065744
netsum = netsum + inarray(2) * -1.146601
netsum = netsum + inarray(3) * -0.9325874
netsum = netsum + inarray(4) * -1.517177
netsum = netsum + inarray(5) * 0.2812504
netsum = netsum + inarray(6) * -0.6556798
netsum = netsum + inarray(7) * 1.173773
feature2(4) = 1 / (1 + Exp(-netsum))
netsum = -0.1239126
netsum = netsum + inarray(1) * -1.830723
netsum = netsum + inarray(2) * 0.8275196
netsum = netsum + inarray(3) * 0.2012251
netsum = netsum + inarray(4) * -0.7351373
netsum = netsum + inarray(5) * 0.5414248
netsum = netsum + inarray(6) * 2.384689
netsum = netsum + inarray(7) * -1.566727
feature2(5) = 1 / (1 + Exp(-netsum))
netsum = 0.0145554
netsum = netsum + inarray(1) * -0.4000922
netsum = netsum + inarray(2) * -1.257582
netsum = netsum + inarray(3) * 0.8750437
netsum = netsum + inarray(4) * 1.78116
netsum = netsum + inarray(5) * 1.741183
netsum = netsum + inarray(6) * -2.168171
netsum = netsum + inarray(7) * -0.9200088
feature2(6) = 1 / (1 + Exp(-netsum))
netsum = 0.3624522
netsum = netsum + inarray(1) * -1.666589
netsum = netsum + inarray(2) * -2.92119
netsum = netsum + inarray(3) * 1.415627
netsum = netsum + inarray(4) * 0.1193302
netsum = netsum + inarray(5) * 0.3643235
netsum = netsum + inarray(6) * 1.332756
netsum = netsum + inarray(7) * 1.651392
212 Tpicos y Aplicaciones de la Inteligencia Artificial
feature2(7) = 1 / (1 + Exp(-netsum))
netsum = -0.08557819
netsum = netsum + inarray(1) * 0.3886256
netsum = netsum + inarray(2) * -2.094244
netsum = netsum + inarray(3) * -1.564476
netsum = netsum + inarray(4) * 1.770092
netsum = netsum + inarray(5) * 0.9950833
netsum = netsum + inarray(6) * -1.562377
netsum = netsum + inarray(7) * 1.671334
feature2(8) = 1 / (1 + Exp(-netsum))
netsum = -0.2997127
netsum = netsum + inarray(1) * 1.399435
netsum = netsum + inarray(2) * -0.1395936
netsum = netsum + inarray(3) * -1.913407
netsum = netsum + inarray(4) * -0.9458458
netsum = netsum + inarray(5) * 2.404087
netsum = netsum + inarray(6) * 0.6442617
netsum = netsum + inarray(7) * -1.377198
feature2(9) = 1 / (1 + Exp(-netsum))
netsum = 0.8538765
netsum = netsum + feature2(1) * 1.642975
netsum = netsum + feature2(2) * -1.08525
netsum = netsum + feature2(3) * 1.692052
netsum = netsum + feature2(4) * 0.5226364
netsum = netsum + feature2(5) * -1.016138
netsum = netsum + feature2(6) * 0.3381723
netsum = netsum + feature2(7) * -4.312466
netsum = netsum + feature2(8) * -0.8845294
netsum = netsum + feature2(9) * 0.3042739
outarray(1) = 1 / (1 + Exp(-netsum))
netsum = 0.6356097
netsum = netsum + feature2(1) * -1.699543
netsum = netsum + feature2(2) * -0.8347372
netsum = netsum + feature2(3) * 1.740408
netsum = netsum + feature2(4) * -2.244962
netsum = netsum + feature2(5) * 2.778615
netsum = netsum + feature2(6) * -1.380548
netsum = netsum + feature2(7) * -1.0302
netsum = netsum + feature2(8) * -1.023457
netsum = netsum + feature2(9) * -0.1288214
outarray(2) = 1 / (1 + Exp(-netsum))
netsum = 0.8881556
netsum = netsum + feature2(1) * 1.621511
netsum = netsum + feature2(2) * -0.03661929
netsum = netsum + feature2(3) * 0.1688382
netsum = netsum + feature2(4) * -1.013181
netsum = netsum + feature2(5) * 2.699184
netsum = netsum + feature2(6) * -1.219513
netsum = netsum + feature2(7) * 0.4337809
netsum = netsum + feature2(8) * -3.760823
netsum = netsum + feature2(9) * -1.450161
outarray(3) = 1 / (1 + Exp(-netsum))
netsum = -0.1752312
netsum = netsum + feature2(1) * 0.7248147
Mg. Abraham Gamarra Moreno 213
netsum = netsum + feature2(2) * 0.4916552
netsum = netsum + feature2(3) * -3.363693
netsum = netsum + feature2(4) * -1.489237
netsum = netsum + feature2(5) * 0.3150889
netsum = netsum + feature2(6) * 2.669589
netsum = netsum + feature2(7) * 0.2992842
netsum = netsum + feature2(8) * 0.4325282
netsum = netsum + feature2(9) * 0.1342072
outarray(4) = 1 / (1 + Exp(-netsum))
netsum = -0.2363798
netsum = netsum + feature2(1) * 0.8358494
netsum = netsum + feature2(2) * 0.6256061
netsum = netsum + feature2(3) * -3.400938
netsum = netsum + feature2(4) * -1.574203
netsum = netsum + feature2(5) * 0.3605849
netsum = netsum + feature2(6) * 2.502021
netsum = netsum + feature2(7) * 0.2546888
netsum = netsum + feature2(8) * 0.5457298
netsum = netsum + feature2(9) * 0.2242781
outarray(5) = 1 / (1 + Exp(-netsum))
netsum = -0.1454982
netsum = netsum + feature2(1) * 0.7328083
netsum = netsum + feature2(2) * 1.886714
netsum = netsum + feature2(3) * 0.05207601
netsum = netsum + feature2(4) * -1.110788
netsum = netsum + feature2(5) * -1.82287
netsum = netsum + feature2(6) * 0.5481207
netsum = netsum + feature2(7) * 1.574738
netsum = netsum + feature2(8) * 1.149344
netsum = netsum + feature2(9) * -4.210217
outarray(6) = 1 / (1 + Exp(-netsum))
outarray(1) = (outarray(1) - 0.1) / 0.8
If (outarray(1) < 0) Then outarray(1) = 0
If (outarray(1) > 1) Then outarray(1) = 1
outarray(2) = (outarray(2) - 0.1) / 0.8
If (outarray(2) < 0) Then outarray(2) = 0
If (outarray(2) > 1) Then outarray(2) = 1
outarray(3) = (outarray(3) - 0.1) / 0.8
If (outarray(3) < 0) Then outarray(3) = 0
If (outarray(3) > 1) Then outarray(3) = 1
outarray(4) = (outarray(4) - 0.1) / 0.8
If (outarray(4) < 0) Then outarray(4) = 0
If (outarray(4) > 1) Then outarray(4) = 1
outarray(5) = (outarray(5) - 0.1) / 0.8
If (outarray(5) < 0) Then outarray(5) = 0
If (outarray(5) > 1) Then outarray(5) = 1
outarray(6) = (outarray(6) - 0.1) / 0.8
If (outarray(6) < 0) Then outarray(6) = 0
If (outarray(6) > 1) Then outarray(6) = 1
End Sub
214 Tpicos y Aplicaciones de la Inteligencia Artificial
4.9.3. CONCESIN DE AYUDAS POR ESTUDIOS
El problema consiste en determinar cul es el tipo de ayuda, que se puede
conceder por estudios a un trabajador en una empresa, en base a concesiones
otorgadas en otros casos.
Para la concesin se toman los siguientes atributos:
salario del trabajador,
tipo de estudios a realizar, y
antigedad en la empresa.
La empresa cuenta con la informacin de la tabla 4.7 referida a ayudas
concedidas en ejercicios anteriores.
Tabla 4.7. Ayudas concedidas con ejercicios anteriores
Mg. Abraham Gamarra Moreno 215
Tabla 4.7. Ayudas concedidas con ejercicios anteriores (continuacin)
Tabla 4.7. Ayudas concedidas con ejercicios anteriores (continuacin)
216 Tpicos y Aplicaciones de la Inteligencia Artificial
Se puede utilizar el Neuroshell, para entrenar a la red neuronal con los datos
de la tabla 4.7 y se debe obtener tambin el codigo fuente en Visual Basic. La
implementacion se encuentra en el CD que se adjunta al libro.
El formulario y la ejecucin del programa en Visual Basic 6.0, teniendo en
cuenta el 16 avo patrn de entrenamiento se muestra en la figura 4.33.
Figura 4.33. Ejecucin del programa en Visual Basic 6.0, teniendo en cuenta el 16 avo patrn de
entrenamiento de la tabla 4.7.
4.9.4. IMPLEMENTACIN DE OTRAS APLICACIONES CON REDES
NEURONALES ARTIFICIALES
En el CD se encuentra la implementacin
del reconocimiento de los caracteres A y
B, utilizando Neuroshell y Visual Basic
.NET.
Adems se implementa el ejemplo de la
identificacin de animales de la tabla
4.2.