Está en la página 1de 182

PONTIFICIA UNIVERSIDAD CATLICA DEL ECUADOR

FACULTAD DE INGENIERA
ESCUELA DE SISTEMAS

RECONOCIMIENTO DE IMAGENES MEDIANTE


REDES NEURONALES ART

FLIX NOVOA DIEGO SEBASTIAN


ZIGA CORRALES WLADIMIR AGUSTN

QUITO, 2006

AGRADECIMIENTO

Agradecemos eternamente a Dios y a la Virgen por su gua y bendicin en


cada instante.

A los miembros de la Facultad de Ingeniera quienes con su labor diaria


enaltecen el prestigio de la Pontificia Universidad Catlica.

A los seores profesores Diego Andrade, Jorge Aguilar y en especial a


nuestro admirado mentor Guido Ochoa por su invalorable aporte para la
consecucin del presente trabajo de disertacin.

A nuestras familias por habernos brindado su gua constante e


incondicional hacia la culminacin de la carrera.

DEDICATORIA

A mis padres y hermana que


me han brindado todo su apoyo
en cada uno de mis proyectos.
Diego

A Mam, Pap ,Ivanova ,Mihail


A quienes an guardan en su corazn un
lugar en el que pueda ser yo.
A quienes ya olvidaron creer y confiar en
s mismos. An es tiempo: Despierten!
A toda mi familiaGracias
Agustn

La sabidura no se restringe a la
adaptacin y preservacin indefinida del aprendizaje;
su esencia toma forma cuando se propaga el
conocimiento en el momento adecuado.

CONTENIDO

PAGINA
CAPITULO I
INTRODUCCIN ..

CAPITULO II
TEORA DE RESONANCIA ADAPTATIVA (ART)
2.1 Importancia ...

2.2 Conceptos Generales

2.2.1 Propiedades y Arquitectura General de las Redes ART ..

2.2.2 Clasificacin y variaciones del algoritmo ART: ART1,


ART2, ARTMAP

2.2.2.1

Modelo ART1 ..

2.2.2.2

Modelo ART2 ..

10

2.2.2.3

Modelo ARTMAP ...

14

2.2.3 Aplicaciones de ART .

17

2.3 ART en el Reconocimiento de Imgenes


2.3.1 Subsistema de Atencin .......

18

2.3.2

Subsistema de Orientacin ...

18

2.3.3 Control de Ganancia en ART ...

26

2.3.4

ART1: Modelo Original ...

28

2.3.4.1 El Subsistema de Atencin ..

29

2.3.4.2

Procesamiento en F1 .

31

2.3.4.3

Procesamiento en F2 .

39

2.3.4.4

Rastros Descendentes de LTM

42

2.3.4.5 Rastros Ascendentes de LTM ..

44

2.3.4.6

Subsistema de Orientacin ...

49

2.3.5 Resumen del Procesamiento de ART1

53

CAPITULO III
RED ART1 PARA EL RECONOCIMIENTO DE DGITOS
ESCRITURA LIBRE
3.1 Descripcin del Problema .

56

3.2

Diseo de la Red de Prueba ..

57

3.3

Casos de Prueba .

59

3.4 Parmetros de Prueba

59

3.5

Resultados .

61

3.5.1

Glyph correspondiente al nmero 1 .

61

3.5.2

Glyph correspondiente al nmero 6 .

67

CAPITULO IV
DESARROLLO DE LA SOLUCIN DE LA RED ART1
4.1

Implementacin en Delphi
4.1.1

72

Diseo de la Red ..

72

4.1.2 Descripcin de la Aplicacin ...

72

4.2 Resultados .

76

4.2.1

Caso 1 ...

79

4.2.2

Caso 2 ...

83

4.2.3

Caso 3 ...

92

4.2.4

Caso 4 ...

95

4.2.5

Caso 5 ...

101

CAPITULO V
CONCLUSIONES Y RECOMENDACIONES
5.1

Conclusiones .

120

5.2

Recomendaciones .

121

FUENTES

122

ANEXOS
ANEXO 1 Cdigo Fuente de la Implementacin del Algoritmo
ART1 en C++ .....

126

ANEXO 2 Cdigo Fuente de la Implementacin del Algoritmo


ART1 en Delphi .

138

NDICE DE FIGURAS

PAGINA

Figura 2.1 Diagrama de Arquitectura Bsica de Redes ART

Figura 2.2 Proceso Codificacin del Glyph ..

Figura 2.3 Diagrama de Arquitectura de Red ART1 .

Figura 2.4 Diagrama de Arquitectura de Red ART2 ..

12

Figura 2.5 Diagrama de Arquitectura de Red ARTMAP ..

16

Figura 2.6 Presentacin Inicial del Patrn de Entrada ..

19

Figura 2.7 Propagacin Inicial del vector I a F2. Respuesta


Supralaminal
Figura 2.8 Intento

de

Reconocimiento

del

Patrn

20

Respuesta

Subliminal

22

Figura 2.9 Restauracin de Valores ..

24

Figura 2.10 Reconocimiento Final del Patrn de Entrada ...

25

Figura 2.11 Elemento de Procesamiento Genrico k de la Red ART1 ...

29

Figura 2.12 Elemento de Procesamiento vi, de la Capa F1 de la Red


ART1 ...

32

Figura 2.13 Elemento de Procesamiento vj, de la Capa F2 de la Red


ART1 ...

39

Figura 2.14. Diagrama Descriptivo de la Propiedad de Autoescalado de


las redes ART ...

51

Figura .3.1 Clasificacin de Caracteres de Escritura Libre

57

Figura .3.2 Arquitectura ART1 para 15 neuronas en F1 y 15 neuronas


en F2 ....

58

Figura 3.3 Glyph (5x3)

58

Figura 3.4 Glyph correspondiente al nmero 1 .....

61

Figura 3.5 Glyph correspondiente al nmero 6 .

67

Figura 4.1 Pantalla del Simulador del ART1 Simulator ...

73

Figura 4.2 Pantalla de la Arquitectura del ART1 Simulator .

74

Figura 4.3 Pantalla de Ingreso de Parmetros al ART1 Simulator ...

75

Figura 4.4 Subconjunto de Patrones .

77

Figura 4.5 Patrones Entrenados para la Red ..

78

Figura 4.6 Primer Caso Reconocimiento del Patrn Aprendido


Inicialmente ...

79

Figura 4.7 Primer Caso Ingreso y Aprendizaje de un Patrn


Subconjunto del Patrn Aprendido Inicialmente .

81

Figura 4.8 Primer Caso Nueva Clasificacin del Patrn Aprendido


Inicialmente ..

82

Figura 4.9 Segundo Caso Ingreso de un Patrn Similar a uno


Almacenado, Rho = 0.95

84

Figura 4.10 Segundo Caso Ingreso de un Patrn Similar a uno


Almacenado, Rho = 0.80 ..

90

Figura 4.11 Segundo Caso Comparacin de Similitud entre el Patrn


de Entrada vs. Patrn Asociado

91

Figura 4.12 Tercer Caso Reconocimiento de un Patrn Existente


Desplazado hacia la Derecha

92

Figura 4.13 Tercer Caso Comparacin de Similitud entre el Patrn de


Entrada Desplazado vs. Patrn Original Asociado ...

94

Figura 4.14 Cuarto Caso Reconocimiento de un Patrn Existente Pero


de Menor Tamao ...

95

Figura 4.15 Cuarto Caso Comparacin de Similitud entre el Patrn de


Entrada de Menor Tamao vs. Patrn Original Asociado ....

101

Figura 4.16 Quinto Caso Memoria Llena Coincidencia con el Patrn


ms Parecido (Nmero 2)

102

Figura 4.17 Quinto

Caso

Memoria

Llena

Coincidencias

Encontradas

110

Figura 4.18 Quinto Caso Memoria Llena Coincidencia (Nmero


cinco)

111

Figura 4.19 Quinto Caso Memoria Llena Coincidencia (Nmero


Seis)..

112

CAPITULO I

INTRODUCCIN
El reconocimiento de imgenes o patrones puede ser definido como el acto de
asimilar datos sin refinamiento y de realizar una accin de clasificacin en base a la
categora del dato. El reconocimiento de imgenes se convirti en materia de estudio
en los aos 60 y actualmente constituye un importante campo de investigacin en
universidades e industrias alrededor del mundo. A lo largo de los aos con la
intervencin de la Inteligencia Artificial se ha utilizado una diversa gama de modelos
para reconocer patrones, como son los algoritmos de redes neuronales y los sistemas
expertos. Nuestro estudio se enfocar en el primer modelo neuronal de la Teora
Resonancia Adaptativa (ART).
Consideramos de gran utilidad investigar acerca de los principios de ART1 dado que
es un algoritmo que no goza de la misma difusin de otros como perceptrn,
perceptrn multicapa o mapas autoorganizativos de Kohonen. Otra razn importante
es el sinnmero de aplicaciones que posee ART1, que incluyen aparte del
reconocimiento de caracteres, el diseo y manufactura de aviones, reconocimiento
automtico de blancos, previsiones financieras, monitoreo de maquinarias, diseo de
circuitos digitales, anlisis qumico y visin de robots.

En este contexto reconocemos que entender el marco terico del algoritmo y crear un
sistema de redes neuronales basadas en este modelo permitirn identificar y difundir
las bondades de ART1, generar posibles soluciones a diversos problemas y
finalmente implementar estas soluciones en la vida prctica.
El presente trabajo de grado tiene como objetivo realizar una descripcin funcional
del algoritmo ART1 y construir una red neuronal para el reconocimiento de dgitos
de escritura libre. Este trabajo contiene adems un software que implementa dicha
red en el lenguaje de programacin Delphi.

CAPITULO II

TEORA DE RESONANCIA ADAPTATIVA (ART)


2.1 Importancia
Una de las caractersticas ms distintivas de la memoria humana es su capacidad de
aprender nuevos conocimientos sin necesariamente olvidar aquellos aprendidos en
el pasado. Sera deseable poder impartir esta misma capacidad a las redes
neuronales artificiales, dado que stas pretenden simular el comportamiento del
cerebro humano. Sin embargo, en el proceso de aadir nueva informacin de
manera incremental (aprendizaje) muchas de estas redes tienden a olvidar
informacin aprendida en el pasado.
Con el fin de demostrar la importancia de la utilizacin de redes ART, que radica en
eliminar el problema anteriormente descrito, citaremos un ejemplo. Supongamos que
se construye una red ART para que reconozca las siluetas de ciertos tipos de
aviones. Reunimos las imgenes necesarias que se utilizarn para entrenar1 a la red.
Concluido este proceso, la red podr identificar con xito diferentes siluetas de
aviones, dentro de la clasificacin ya aprendida. Si en un futuro se disea otro avin
y se desea que la red reconozca su silueta, deberamos aadir sta al conocimiento
almacenado en la red.

La ventaja que presenta ART, es que para incluir esta nueva

Proceso en el cual una red neuronal artificial crea su base de conocimientos mediante ejemplos
representativos.

clasificacin, no es necesario volver a entrenar toda la red (con el nuevo patrn),


eliminando as la tendencia a olvidar el conocimiento previo.
ART supera el conflicto entre la estabilidad y la plasticidad, comnmente
denominado como dilema estabilidad-plasticidad (Grossberg, 1976). Un algoritmo es
plstico si conserva el potencial de adaptarse a nuevas entradas indefinidamente. Por
otro lado, un algoritmo es estable si preserva conocimiento previamente aprendido.
El dilema de la estabilidad-plasticidad puede ser planteado como sigue:

Cmo se puede disear un sistema de aprendizaje para mantener la


plasticidad, o adaptabilidad, en respuesta a acontecimientos significativos
pero seguir siendo estable en respuesta a acontecimientos irrelevantes?

Cmo el sistema sabe cul es la manera de cambiar entre su modo estable y


su modo plstico para alcanzar estabilidad sin rigidez y plasticidad sin caos?

En particular, cmo puede preservar su conocimiento previamente aprendido


mientras contina aprendiendo nuevas cosas?

Qu evita que el nuevo aprendizaje borre las memorias de un aprendizaje


previo?

2.2 Conceptos Generales


2.2.1 Propiedades y Arquitectura General de las Redes ART
El mtodo que ART utiliza para resolver el dilema de estabilidad y plasticidad
consiste en aadir un mecanismo de retroalimentacin entre una capa competitiva y

una capa de entrada de la red, que facilita el aprendizaje de informacin nueva sin
destruir la informacin anterior.
El modelo ART cuenta con tres propiedades cruciales:
1. La normalizacin de toda la actividad de la red. Los sistemas biolgicos
generalmente se adaptan muy fcilmente a grandes cambios en su ambiente.
Por ejemplo, el ojo humano puede adaptarse a grandes variaciones en la
intensidad de la luz.
2. Mejoramiento por contraste de los patrones de entrada. Reconocer
diferencias leves en los patrones de entrada puede significar mucho en
trminos de supervivencia. Distinguir una leona escondida de una en
descanso puede constituir una diferencia de vida o muerte para una cebra. El
mecanismo que se utiliza para revelar estas diferencias se conoce como
mejoramiento por contraste.
3. Memoria a corto plazo (STM ) (Short Term Memory) del patrn mejorado
por contraste. Antes de que el patrn de entrada pueda ser decodificado,
debe ser almacenado en una memoria a corto plazo. La memoria a largo
plazo (LTM) (Long Term Memory) implementa un mecanismo de excitacin
(clasificacin), mientras que la STM es usada para causar cambios graduales
en la LTM.
La arquitectura bsica de una red ART se muestra en la Figura 2.1. A continuacin,
se presenta una breve descripcin de los elementos que actan en esta red (su
funcionamiento detallado se presentar a lo largo de este captulo):

Figura 2.1 Diagrama de Arquitectura Bsica de Redes ART


(J. A. Freeman y D. M. Skapura)

La red ART, consta de dos subsistemas: subsistema de atencin (attentional


subsystem) y subsistema de orientacin (orienting subsystem).

Dentro del subsistema de atencin, existen dos capas, F1 (capa de entrada) y


F2 (capa competitiva de representacin de categoras), entre las cuales se
establecen conexiones hacia adelante (feedforward) y hacia atrs (feedback).
Los nodos (neuronas) de ambas capas estn totalmente interconectados con
los nodos de la otra capa y entre s.

El nmero de nodos de cada capa es independiente al nmero de nodos de la


otra capa. As:
Para la capa F1 el nmero de nodos depender del tipo de patrn de
entrada (por ejemplo: para la red ART1, el patrn de entrada est
codificado en un vector de entrada en bits, donde cada bit ocupa una
neurona distinta). (Ver Figura 2.2)

Figura 2.2 Proceso Codificacin del Glyph


(Flix N. Diego, Ziga C. Wladimir)

Mientras que para la capa F2 el nmero de neuronas representar el


nmero de patrones mximo que se podr guardar en memoria y estar
definido de acuerdo a cada problema especfico. Por ejemplo: si el
objetivo es reconocer las vocales, necesitaramos un mnimo de cinco
neuronas en esta capa.

Las actividades2 que aparecen en los nodos de F1 y F2 en el subsistema de


atencin se llaman rastros de memoria a corto plazo (STM) porque slo
existen para una aplicacin de un vector de entrada en un momento
determinado. Los pesos asociados a las conexiones ascendentes (bottom-up:
de F1 hacia F2) y descendentes (top-down: de F2 hacia F1) se llaman
memoria a largo plazo (LTM) porque almacenan informacin que sigue
siendo parte de la red durante largos perodos de tiempo.

Las flechas nos indican las conexiones entre componentes y las seales de
excitacin (+) (azul) y de inhibicin (-) (rojos) que son envidados de, hacia y
a travs de estos.

Cada subsistema contiene unidades con funciones especficas: la Unidad de


Control de Ganancia (G) en el subsistema de orientacin y la Unidad de Seal
de Restauracin (R) en el subsistema de orientacin.

2.2.2 Clasificacin y variaciones del algoritmo ART: ART1, ART2, ARTMAP


2.2.2.1 Modelo ART1
Descripcin
El modelo ART1 es el que ms se asemeja a la Arquitectura General de las Redes
ART (seccin 2.2.1). A continuacin presentaremos una breve descripcin del
modelo simplificado ART1. El modelo original, propuesto por Carpenter y
Grossberg, ser descrito en la seccin 2.3.4.

Grado de respuesta al estmulo generado al aplicar un vector de entrada sobre una neurona.

Arquitectura

Figura 2.3 Diagrama de Arquitectura de Red ART1


(Ben Krose y Patrick van der Smagt )

El modelo simplificado de ART1 consiste en dos capas de neuronas binarias (0 y 1),


F1 y F2. (Ver Figura 2.3). Cada neurona en F1 est conectada con todas las
neuronas en F2 mediante la LTM hacia adelante compuesta de valores de pesos
continuos Wf, y viceversa a travs de la LTM hacia atrs de valores de pesos binarios
Wb.
Los otros mdulos son el control de ganancia 1 y 2 (G1 y G2), y un mdulo de
restauracin o reajuste. Cada neurona en la capa F1 recibe tres entradas:
1. Un componente del vector de entrada,

2. Un componente de la Unidad de Seal de Restauracin, y


3. Un componente de la Unidad de Control de Ganancia G1.
Cada neurona en la capa de F2 calcula el producto interno de sus pesos de entrada
(de valores continuos) y el patrn enviado sobre estas conexiones. La neurona
ganadora entonces inhibe el resto de neuronas por medio de una inhibicin lateral.
El control de ganancia G2 representa la operacin 'OR' entre todos los elementos del
patrn de entrada X.

G1 es igual a G2, excepto cuando el patrn de la

retroalimentacin desde F2 contiene cualquier 1; entonces es forzado a un valor de


cero.
Finalmente, la seal de reajuste es enviada a la neurona activa en F2 si el vector x de
entrada y la salida de F1 difieren por ms que un cierto nivel de la vigilancia.
La red comienza afianzando la entrada en F1. Porque la salida de F2 es cero, G1 y
G2 estn ambos activados y la salida de F1 empareja su entrada.
El patrn se enva a F2, y en F2 una neurona se activa. Esta seal entonces se enva
de vuelta hacia la LTM hacia atrs, que reproduce un patrn binario en F1. Se inhibe
G1, y solamente las neuronas en F1 que reciban un ' 1 ' de entrada y de F2
permanecen activas. Si hay una falta de coincidencia sustancial entre los dos
patrones, la seal de restauracin inhibir la neurona en el F2 y se repite el proceso.
2.2.2.2 Modelo ART2
Descripcin
Superficialmente, ART2 solamente difiere de ART1 en que admite componentes
analgicas (o de escala de grises) en sus vectores, adems de binarias, y en la

10

arquitectura, para tener capacidad para tratar patrones analgicos.

ART2 debe

reconocer la similitud subyacente de patrones idnticos que se superpongan a


fondos constantes que posean distintos niveles. Dos patrones como estos pueden
tener un aspecto completamente distinto, aun cuando lo cierto es que deberan ser
clasificadas como un mismo patrn. El precio de esta capacidad adicional es un
aumento de complejidad en F1, que consta de varias capas y varios sistemas de
control de ganancia. Como compensacin, las ecuaciones de la memoria a largo
plazo LTM son algo ms sencillas en ART2.
Arquitectura
Carpenter y Grossberg describieron varios sistemas ART2 y todos contaban
aproximadamente con una dinmica equivalente. Consideramos al sistema definitivo
a aquel mostrado en la Figura 2.4.
Este mdulo de ART2 incluye los dos componentes principales de todos los mdulos
ART: un subsistema de atencin, que contiene una campo de entrada F1 y una
campo de representacin de categoras F2, y un subsistema de orientacin, el cual
interacta con el subsistema de atencin para llevar a cabo un proceso de bsqueda
controlado internamente.
El campo de entrada y el campo de representacin de categoras estn vinculados
mediante filtros adaptativos ascendentes y descendentes. El camino del i-simo nodo
en F1 al j-simo nodo en F2 contiene un rastro de memoria a largo plazo (LTM) o
peso adaptativo z ij . El camino de regreso del j-simo nodo en F2 al i-simo nodo en
F1 contiene un peso z ji

11

Adems la figura 2.4 ilustra algunas de las caractersticas de ART2 que no son
compartidas por todos los sistemas ART. Una de las mencionadas caractersticas es
el campo multicapa (tres capas) F1. Tanto F1 como F2 y adems el campo de
prepocesamiento F0 son redes competitivas que realizan mejoramiento por contraste
y normalizacin a sus patrones de activacin.

Figura 2.4 Diagrama de Arquitectura de Red ART2


(Flix N. Diego, Ziga C. Wladimir)
12

Ahora describiremos a los componentes de una red ART2 para lo cual nos guiaremos
en la figura anterior.
El Campo de Prepocesamiento F0: Un vector de entrada I es transformado en el
campo F0. Cada capa de este campo de memoria a corto plazo (STM) lleva a cabo
dos clculos:
1. Suma las entradas internas y externas al campo.
2. Normaliza el vector de actividad resultante de la suma.
Estos clculos permiten obtener un vector de salida de F0 al sistema de orientacin y
un vector de entrada al campo F1.
El Campo de Entrada F1: Como en el campo F0, cada capa en F1, suma las
entradas y normaliza el vector resultante. Las operaciones de las dos capas inferiores
(w y u) de F1 son las mismas que las que se llevaron a cabo en las dos capas de F0.
En la capa superior de F1 p , se suma tanto la seal interna u de F1 y todas las
seales filtradas provenientes de F2 a F1.
El Campo de Representacin de Categoras F2: Si F2 se encuentra en estado
inactivo, todas las salidas de F2 a F1 son cero. Un campo competitivo F1 en estado
activo est diseado para realizar una eleccin si solo un nodo de F2 tiene una
memoria STM ha superado el umbral determinado. Este es el nodo que recibe la
mayor entrada total desde F1.

13

2.2.2.3 Modelo ARTMAP


Descripcin
El siguiente paso en el desarrollo de modelos ART fue la introduccin de una nueva
arquitectura llamada ARTMAP. Esta arquitectura fue diseada para un aprendizaje
supervisado de mapeos arbitrarios de vectores de entrada a vectores de salida. El
modelo bsico de la arquitectura de ARTMAP es un sistema que consiste de dos
mdulos ART1 y un mdulo de control llamado Mapa de Campo. Si los mdulos de
ART1 en la arquitectura de ARTMAP son sustituidos por mdulos ART difusos o
por mdulos ART gaussianos, un nuevo modelo de ARTMAP se obtiene, el mismo
que toma el nombre de ARTMAP difuso o ARTMAP gaussiano respectivamente.
Los tres modelos ARTMAP mencionados anteriormente (estndar, difuso y
gaussiano) representan los modelos bsicos de la arquitectura de ARTMAP. La
principal diferencia entre ellos est en la manera en que cada uno de stos identifica
clusters (grupos) en el espacio de entrada.
Arquitectura y Dinmica
A continuacin se presentar una descripcin del proceso de aprendizaje de
ARTMAP con el fin de desarrollar una comprensin intuitiva del mismo.

La

estructura bsica de un sistema de ARTMAP se muestra en Figura 2.5. Los bloques


individuales en la figura tienen las siguientes funciones:
Capa de Entrada (F0): Al inicio de cada intento de emparejamiento un patrn se
presenta en esta capa. El tamao de la misma es igual a la dimensionalidad N de los
patrones la entrada.

14

Capa de Comparacin (F1): En el segundo paso, el patrn de la capa de entrada es


copiado en esta capa. Posteriormente, el patrn de entrada y el patrn ptimo
representado por la neurona ganadora en la capa del reconocimiento son comparados
aqu. Si son significativamente diferentes, se inicia una bsqueda para una encontrar
una nueva neurona ganadora en F2.
Capa de Reconocimiento (F2): Cada neurona en esta capa define un cluster en el
espacio de entrada (el mtodo de identificacin difiere para diferentes tipos de
modelos ARTMAP). El tamao de esta capa es variable y aumenta durante el
entrenamiento a medida que nuevos clusters son identificados en espacio de entrada.
Mapa de Campo (MF): Cada neurona en esta capa representa una clase y recibe
entradas de una conexin diferente de cero de todas las neuronas en F2, la misma
que

pertenece a la misma clase representada por esta neurona.

Durante el

entrenamiento el contenido de la capa MF es idntico al contenido de la capa de


salida.
Capa de Salida (OL): Cada neurona en esta capa representa una clase definida en el
conjunto de datos. Al principio de cada ensayo, un cdigo de la clase en la cual el
patrn de entrada debe ser clasificado se copia en esta capa. Cada clase es
representada por una neurona. El tamao de esta capa es igual al nmero de clases
M.

15

Figura 2.5 Diagrama de Arquitectura de Red ARTMAP


(J. A. Freeman y D. M. Skapura)

Existen dos parmetros ajustables en las redes ARTMAP. El primero de ellos es el


parmetro de vigilancia usado en los clculos de la capa de comparacin. El segundo
parmetro es la tasa de aprendizaje y puede variar de cero a uno.
Se ha demostrado anteriormente que los resultados obtenidos por las redes ARTMAP
son dependientes del orden en el cual los patrones de entrada se presentan durante el
entrenamiento. Para suprimir esta dependencia del orden de presentacin, se utiliza
un mtodo de votacin. En este mtodo varias redes independientes ARTMAP se
entrenan bajo el mismo conjunto de datos presentados en orden diferente. En la fase
de prueba un nuevo patrn es clasificado dentro de la clase votado o seleccionada por
la mayora de las redes.

16

2.2.3 Aplicaciones de ART


Algunas de las reas de aplicacin tecnolgica de las redes neuronales ART
incluyen: manufactura y diseo industrial, el control de robots mviles,
reconocimiento de rostros, reconocimiento de objetivos o blancos, diagnsticos
mdicos, anlisis de electrocardiogramas, verificacin de firmas, monitoreo de fallos
de herramientas, anlisis qumico, diseo de circuitos, anlisis de ADN y protenas,
reconocimiento visual de objetos en 3D, anlisis musical, reconocimiento de radar,
sonar y ssmico (Caudell et al., 1994; Fay et al., 2001; Griffith and Todd, 1999).
Adicionalmente, se ha estudiado la implementacin de sistemas ART para el diseo
de microchips VLSI. (Serrano-Gotarredona, Linares-Barranco, and Andreou 1998).
Los distintos tipos de aplicaciones explotan la capacidad de los sistemas ART para
aprender a clasificar bases de datos grandes de una manera estable. Las memorias
ART tambin se traducen a un conjunto transparente de reglas IF-THEN que
caracterizan el proceso de toma de decisiones y que pueden ser utilizados en la
seleccin de caractersticas.
Los principios de ART han ayudado adems a explicar el comportamiento
paramtrico y datos cerebrales en reas de percepcin visual, reconocimiento de
objetos, identificacin de fuentes auditivas, y reconocimiento de palabras, y control
motriz-sensorial adaptativo. (Levine, 2000; Page, 2000). Un rea de reciente
progreso incluye la forma en que el neocortex es organizado en capas, esclareciendo
la forma en que los principios del diseo ART son encontrados en circuitos
neocorticales.

17

2.3 ART en el Reconocimiento de Imgenes


Continuaremos con una breve descripcin de como esta red realiza el reconocimiento
de patrones. Comenzaremos por describir como funcionan los subsistemas de
atencin y orientacin.
2.3.1 Subsistema de Atencin
Consiste bsicamente en una red tal y como se ve en la Figura 2.1. Su funcin es la
de reconocer y clasificar las informaciones aprendidas. En este subsistema se
localizan la memoria a corto plazo y la memoria a largo plazo (STM y LTM).
El control de ganancia, acta sobre las neuronas de entrada (STM en F1) para
estabilizar el funcionamiento de la red. As, aumenta la sensibilidad o el grado de
atencin de los nodos, evitando una posible anticipacin respecto a la llegada de la
informacin del siguiente patrn a travs de las conexiones hacia atrs (feedback).
2.3.2 Subsistema de Orientacin:
Este subsistema tambin contribuye a determinar si el patrn de entrada pertenece o
no a una clase ya aprendida. Este proceso lo hace estableciendo la similitud entre la
entrada y el prototipo de cada clase almacenada en los pesos de las conexiones hacia
atrs (LTM), que deber ser mayor al valor del parmetro de vigilancia.3 Si ninguna
es suficientemente parecida, se crea una nueva clase, cuyo prototipo es la nueva
entrada.
En resumen, el subsistema de atencin realiza la tarea de reconocimiento (bsqueda

Representa el grado de similitud mnimo requerido para que un patrn de entrada sea clasificado
dentro de un patrn ya aprendido.

18

de clase), mientras que el subsistema de orientacin acta sobre el primero,


permitindole responder a entradas no pertenecientes a ninguna categora, creando
para ellas nuevas clases.
Siguiendo con la descripcin de como una red ART realiza el proceso de
reconocimiento de patrones, tomaremos una secuencia de ocurrencias que podran
darse cuando una red de este tipo intenta determinar si un cierto patrn de entrada
est entre los patrones almacenados previamente.

Figura 2.6 Presentacin Inicial del Patrn de Entrada


(J. A. Freeman y D. M. Skapura)

19

En la Figura 2.6, se puede ver como se presenta un patrn de entrada codificado


como vector de entrada I distribuido en cada nodo de F1. Una vez que se tiene el
vector I, se produce una actividad X a travs de F1.

Figura 2.7 Propagacin Inicial del vector I a F2. Respuesta Supralaminal


(J. A. Freeman y D. M. Skapura)

El procesamiento de propagacin a F2 luego de la presentacin inicial del patrn de


entrada en esta etapa (ver figura 2.7), es el siguiente:

El patrn de entrada, I, excita tanto el sistema de orientacin, A, como el


control de Ganancia G.

G manda una seal excitatoria a todos y cada uno de los nodos de la capa a
F1. Esta seal es conocida como seal no especfica.

20

La aparicin de la actividad X en F1 da lugar a un patrn de salida, S, que


enva una seal inhibitoria hacia A.

La estructura de la red le permite a la unidad A permanecer inactiva ya que, el


efecto de la seal de excitacin enviada por I es cancelado por la seal
inhibitoria enviada por S.

S es enviado hacia F2 mediante las conexiones ascendentes. Cada nodo de


F2 recibe todo el vector de salida, S, procedente de F1.

Las neuronas de F2 calculan sus valores de entrada neta mediante el producto


punto de los valores de entrada provenientes de F1 por los pesos de conexin
ascendentes respectivos.

Como respuesta a las entradas provenientes de F1, se desarrolla un patrn de


actividad Y, a travs de los nodos de la capa competitiva F2 que lleva a cabo
una mejora de contraste en la seal de entrada.

La neurona que gane la competencia en F2 ser aquella que cuente con el


mayor valor de entrada neta proveniente de las unidades en F1.

En la Figura 2.8, se puede ver el proceso que realiza la red en su intento de reconocer
el patrn ingresado:

21

Figura 2.8 Intento de Reconocimiento del Patrn


Respuesta Subliminal
(J. A. Freeman y D. M. Skapura)

El patrn de activacin Y da lugar a un patrn de salida U que viene de F2. El


valor de U en la unidad ganadora es 1, mientras que para el resto de neuronas
su valor es 0.

El patrn de salida, U, se enva como seal inhibitoria hacia el subsistema de


control de ganancia G y a las unidades de F1.

El subsistema de control de ganancia suspende su actividad ya que ste est


configurado de tal forma que, G se para cuando recibe cualquier seal
inhibitoria procedente F2.

U tambin pasa a ser un segundo patrn de entrada para las unidades F1.

22

U es transformada en V, por los rastros de LTM que hay en conexiones


descendentes procedentes de F2 y que llegan a F1.

Como consecuencia de la Regla 2/3 4, slo aquellos nodos de F1 que reciban


tanto seales de I como de V permanecern activos. Entonces, el patrn que
permanece en F1 es I V (la interseccin de I con V).

En la Figura 2.8, los patrones I y V no coinciden. Entonces, se desarrolla una


nuevo patrn de actividad X* en F1, que da lugar a un nuevo patrn de
salida, S*.

Como se mencion anteriormente, la unidad A permaneca inactiva porque la


seal de inhibicin que S manda hacia A cancela el efecto de excitacin
enviado por I. En este caso, al ser diferente el nuevo patrn de salida S* al S
inicial, provoca que la seal inhibitoria no sea suficiente para cancelar la
seal de excitacin de I hacia A, de tal forma que A se activa.

En la Figura 2.9, se puede ver como A, al estar activada en respuesta a la desigualdad


de patrones presente en F1, realiza la restauracin de valores (Reset):

Hay tres posibles fuentes de entrada para F1, pero que slo dos de ellas parecen utilizarse en un
instante dado. Las unidades de F1 y F2 estn diseadas de tal forma que permanecen activas
nicamente si dos de las tres posibles fuentes de entrada estn presentes. Esta caracterstica se
denomina Regla 2/3 y su importancia y funcionamiento sern detallados posteriormente.

23

Figura 2.9 Restauracin de Valores


(J. A. Freeman y D. M. Skapura)

A enva una seal no especfica de restauracin a todos los nodos de F2.

Cada nodo responde a la seal de A segn su estado actual. As, si el nodo


est inactivo, no responde; pero si ste est activado, pasa a estado inactivo, y
permanece as durante un periodo de tiempo apreciable. Esta inhibicin
sostenida se hace para evitar que el mismo nodo gane la competicin durante
el prximo ciclo de bsqueda de igualdad del patrn I.

La salida descendente y la seal inhibitoria que llegan al control de ganancia


desaparecen puesto que, al estar el nodo ganador anterior inactivo, Y
desaparece.

En la Figura 2.10, se describe el reconocimiento final del patrn de entrada I, para la


red ART que se ha tomado como ejemplo.

24

Figura 2.10 Reconocimiento Final del Patrn de Entrada


(J. A. Freeman y D. M. Skapura)

El procesamiento realizado por las unidades en esta etapa, es el siguiente:

El patrn original, I, se vuelve a instaurar en F1.

Comienza un nuevo ciclo de bsqueda de igualdad.

En esta vez se puede ver que aparece una nueva actividad Y* en F2, es decir,
aparece un nuevo nodo ganador. Entonces, se reconoce la importancia de que
los nodos participantes en el patrn original Y permanezcan inactivos por los
efectos a largo plazo de la seal de restauracin desde A.

El ciclo de bsqueda de igualdad de patrones continuar mientras no se


encuentre una coincidencia, o hasta que F2 se quede sin valores almacenados
previamente con los cuales pueda comparar.

25

Si no se encuentra coincidencia alguna, la red asignar un nodo libre de F2 y


empezar a aprender el nuevo patrn (no es necesario que el ciclo de
bsqueda de coincidencias analice todos los patrones almacenados
anteriormente antes de que sea seleccionado un nodo de F2 libre). El
aprendizaje se produce a travs de modificaciones en los pesos, o rastros de
LTM. Es importante entender que este proceso de aprendizaje no comienza ni
se detiene, sino que contina, incluso, mientras se da el proceso de bsqueda
de iguales. As, cada vez que se envan seales a travs de las conexiones, los
pesos asociados a estas sufren modificaciones, las cuales resultan ser no
significativas dentro del tiempo necesario para un ciclo completo de
bsqueda de coincidencias.

Cuando se encuentra una coincidencia no habr seal de restauracin, y la red


toma un estado de resonancia donde las conexiones permanecen activadas
durante un tiempo suficientemente largo de tal forma que los pesos se vean
fortalecidos. Dicho estado slo se dar, cuando se produzca una coincidencia
de patrones, o durante la seleccin de un nuevo nodo de F2 para almacenar
un nuevo patrn.

2.3.3 Control de Ganancia en ART


Ahora es necesario examinar con ms detalle la necesidad de un mecanismo de
control de ganancia. Se trata de caractersticas importantes del sistema, segn pone
de manifiesto el ejemplo siguiente. Supongamos que la red ART anterior fuera slo
una de otras muchas, dentro de una jerarqua de redes perteneciente a un sistema

26

mucho mayor. La capa F2 podra recibir entradas procedentes de otra capa por
encima de ella, as como de la capa F1 situada ms abajo. Se piensa que esta
estructura jerrquica es frecuente en los sistemas neuronales biolgicos. Si la capa
F2 fuera estimulada por una capa superior, podra producir una salida descendente y
devolver seales a la capa F1. Es posible que esta seal descendente llegase a F1
antes de que llegara a F1 una seal de entrada I procedente de la parte inferior. Una
seal prematura procedente de F2 podra ser el resultado de una anticipacin que
surgiera de un nivel superior de la jerarqua. En otras palabras, F2 est indicando lo
que espera que sea la siguiente seal de entrada, antes que el patrn llegue
realmente a F1.
La aparicin de una seal descendente anticipada procedente de F2 nos plantea un
pequeo dilema. Supongamos que F1 produjese una salida en respuesta a cualquier
vector individual de entrada, independientemente de su origen. Entonces la seal
anticipada procedente de F2 producira una salida de F1, y se producira el ciclo de
bsqueda de coincidencia sin que hubiera llegado a F1 un vector de entrada
procedente de la parte inferior. Vamos a aadir ahora el control de ganancia y la
regla de los 2/3. De acuerdo con lo expuesto en la seccin anterior, si existe G,
entonces cualquier seal procedente de F2

da lugar a una inhibicin de G.

Recordemos que G activa de forma no especfica a todas las unidades de F1. Si est
en vigencia la regla de los 2/3, la inhibicin de G significa que una seal
descendente procedente de F2 no puede, por s misma, desencadenar una salida
procedente de F1. En lugar de esto, las unidades de F1 quedan sensibilizadas, por el
patrn descendente. Si ahora el patrn de entrada esperado se recibe en F1,
procedente de la parte inferior, este condicionamiento previo da lugar a una
27

resonancia de la red. Incluso en el caso de que el patrn de entrada no sea la


esperado, F1 seguir proporcionando una salida, puesto que est recibiendo entradas
procedentes de dos de los tres orgenes posibles, I, G y F2. Si no hay una seal de
anticipacin procedente de F2, entonces F1 queda completamente inactiva hasta
que se recibe una vector de entrada procedente de la parte inferior. Entonces, como
G no est inhibida, las unidades de F1 vuelven a estar recibiendo entradas de dos
orgenes, y F1 enviar una seal de salida hacia arriba, hasta F2, para que comience
el ciclo de bsqueda de coincidencias. G y la regla de los 2/3 se combinan para
permitir que la capa F1 distinga entre una seal de anticipacin, procedente de la
parte superior, y una seal de entrada procedente de la parte inferior. En resumen,
en el primer caso, cada neurona de la capa F1 recibe seales desde F2 e I, y la
respuesta de F1 es subliminal. En el segundo caso, cada neurona de la capa F1
recibe seales desde G e I, y la respuesta es supraliminal, esto es, genera una salida
no nula.

2.3.4 ART1: Modelo Original


Se debe tener en cuenta que todas las entradas de ART1 tienen que ser vectores
binarios, es decir, que sus componentes son elementos del conjunto {0,1}. Esta
restriccin no limita la utilidad de la red, ya que hay muchos problemas cuyos datos
se pueden pasar al formato binario. Examinaremos primero el subsistema de
atencin, incluyendo las capas de memoria a corto plazo (STM) F1 y F2, y el
mecanismo de control de ganancia, G.

28

2.3.4.1 El Subsistema de Atencin


La funcin del subsistema de atencin es el reconocimiento y clasificacin de la
informacin aprendida.
Las ecuaciones dinmicas de las actividades xk de los elementos de procesamiento
pertenecientes a las capas F1 y F2 tienen la forma siguiente, con todos los trminos
mayores que cero:

e x k = x k + (1 Ax k )J k (B + Cx k )J k
+

(2.1)

Figura 2.11 Elemento de Procesamiento Genrico k de la Red ART1


(Flix N. Diego, Ziga C. Wladimir)

29

La ecuacin 2.1 muestra que la variacin en el tiempo de las actividades de cada


neurona es igual al valor negativo de la actividad xk ms el valor de la excitacin
neta (1 Axk )J k y menos el valor de la inhibicin neta (B + Cxk )J k .
+

xk

Mediante

el valor negativo de las actividades se logra reducir su valor

gradualmente hacia un valor de cero, lo que se conoce como decaimiento.

Jk

es la entrada excitadora total a la k-sima unidad.

Jk

es la entrada inhibidora total a la k-sima unidad.

A, B, C son constantes y tomarn un subndice segn la capa a la que hagan


referencia, es decir 1 o 2.

Axk

representa una respuesta inhibitoria debido a la normalizacin.

0 < xk (0) < 1 porque el efecto inhibitorio de una entrada nunca puede exceder a la
entrada excitadora; se sigue que el valor de la excitacin neta sea:

(1 Axk )J k + .
- Cxk representa la inhibicin causada por el resto de neuronas de la capa.
-B

representa un parmetro de inhibicin que se utiliza para realizar el


mejoramiento por contraste.

Entonces se obtiene el valor combinado de estos trminos de inhibicin que es

(B + Cxk )J k , que representa la inhibicin neta.

simboliza un parmetro de convergencia

30

es el subndice de las actividades. De aqu en adelante se lo reemplazar por

el subndice 1i cuando se hable de actividades de la capa F1 y por 2j cuando se


hable de actividades de la capa F2.
El factor e requiere una explicacin mayor. Debido a que las actividades de
clasificacin de patrones entre las capas F1 y F2 deben ocurrir mucho ms rpido
que el tiempo necesario para un cambio significativo en las conexiones de los pesos.
El factor e incorpora este requerimiento. Si hacemos que e mantenga un valor

cercano a cero, 0 < e << 1 , entonces xk tomar un valor muy grande; es decir,

xk alcanzar su valor de equilibrio xk = 0 rpidamente. Puesto que el xk pasa la

mayora de su tiempo cerca de su valor del equilibrio, no tendremos que


preocuparnos por la evolucin en el tiempo de los valores de la actividad.
Automticamente fijaremos las actividades iguales a los valores asintticos. Bajo
estas condiciones, el factor de e llega a ser superfluo, y lo eliminaremos de las
ecuaciones que siguen.

2.3.4.2 Procesamiento en F1
En la Figura 2.12 se ilustra un elemento de procesamiento de la capa F1, con sus
distintas entradas, salidas y vectores de pesos.

31

Figura 2.12 Elemento de Procesamiento vi, de la Capa F1 de la Red ART1


(Flix N. Diego, Ziga C. Wladimir)

La actividad de la unidad vi de la capa F1 es x1i . Las salidas, procedentes de este


elemento, suben hacia F2 y cruzan al subsistema de orientacin A (aparecen en la
con flechas rojas). Adems, la unidad recibe un estmulo negativo que surge de la
neurona ganadora en la capa F2. Este estmulo (mostrado con una flecha verde)
tiene un valor de 1 y representa la entrada inhibidora total J (como aparece en la
figura 2.11) a la neurona.
Por otro lado, el elemento vi recibe un vector de entrada de componentes
binarios, I i , procedente de la parte inferior; una seal excitadora, G, procedente del

32

control de ganancia y entradas excitadoras Vi provenientes de cada neurona en la


capa F2. Estos tres tipos de entradas: I i , G y Vi (mostrados en la figura 2.12 con
flechas azules) constituyen la entrada excitadora total J + (ver figura 2.11) a la
neurona.
La entrada neta procedente de F2 a la unidad se obtiene de la forma:
N

Vi = u j z ij

(2.2)

j =1

El valor de la entrada neta de todas las neuronas de F2 para cada elemento de


procesamiento de la capa F1 no es ms que el producto punto entre la seal
propagada desde F2 ( u j ) y los pesos descendentes zij , siendo N el nmero de
neuronas de la capa F2.
Suponemos que la funcin de salida de cada unidad de F1 asciende rpidamente
hasta un valor de 1 para actividades no nulas. De esta manera, se puede aproximar la
salida de la unidad, si , mediante una funcin escaln binaria:
1 si x1i > 0
s i = h( x1i ) =
0 si x1i 0

(2.3)

La entrada excitadora total, J k , est dada por la ecuacin:

+
K

(2.4)

= I i + D1Vi + B1G

donde B1 y D1 son constantes (para el trmino inhibitorio J k , estableceremos un


valor de 1).

33

Sustituyendo estas dos ltimas definiciones, la ecuacin para los elementos de


procesamiento de F1 es:

x1i = x1i + (1 A1 x1i )(I i + D1Vi + B1G ) (B1 + C1 x1i )

(2.5)

La salida del sistema de control de ganancia, G, depende de las actividades de otras


partes de la red. Se puede describir G resumidamente mediante la ecuacin:
1 si I 0 y U = 0
G =
0 caso contrario

(2.6)

En otras palabras, si hay una entrada y F2 no est produciendo una salida, entonces
G=1. Cualquier otra combinacin de actividad de I y de F2 evita prcticamente que
el control de ganancia genere su excitacin en F1.
Vamos a examinar la Ecuacin 2.5 en busca de cuatro posibles combinaciones de
actividad de I y de F2.
Caso 1.- Considrese el caso en que no hay vector de entrada y F2 est inactiva.
Dicha ecuacin se reduce a:

x1i = x1i (B1 + C1 x1i )

(2.7)

ya que I i , Vi , G = 0.

En equilibrio, x1i = 0 , entonces:

x1i =

B1
1 + C1

(2.8)

34

de esta manera, las unidades sin entradas se mantienen en un estado de actividad


negativa.
Caso 2.- Aplicamos un vector I, pero mantenemos a F2 inactiva por el momento. En

este caso, tanto F1 como el control de ganancia reciben seales procedentes de la


parte inferior. Dado que F2 est inactiva, G no resulta inhibida. Las ecuaciones para
las unidades F1 pasan a ser:

x1i = x1i + (1 A1 x1i )(I i + B1G ) (B1 + C1 x1i )

(2.9)

ya que Vi = 0.
Cuando las unidades alcanzan sus actividades de equilibrio, es decir cuando

xk = 0 , despejando x1i , se obtiene:

x1i =

Ii
1 + A1 (I i + B1 ) + C1

(2.10)

en donde se ha utilizado G = 1. En este caso, las unidades que reciben un valor de


entrada no nulo procedente de la parte inferior tambin generan un valor de
actividad mayor que cero, y poseen un valor de salida no nulo de acuerdo con la
ecuacin 2.3. Sin embargo, las unidades que reciben una entrada nula, experimentan
una subida de sus actividades hasta el nivel cero a travs de la seal de excitacin no
especfica procedente de G.
Caso 3.- Coinciden en la capa F1 un patrn de entrada, I, y un patrn

descendente,V, procedente de F1. Las ecuaciones para las actividades son:

35

x1i = x1i + (1 A1 x1i )(I i + D1Vi ) (B1 + C1 x1i )

(2.11)

ya que G = 0.
As, en el estado de equilibrio el valor para x1i se obtiene de:

x1i =

I i + D1VI B1
1 + A1 (I i + D1VI ) + C1

(2.12)

Aqu el estado de equilibrio requiere un pequeo esfuerzo para su interpretacin. El


que x1i sea menor, igual o mayor que cero depende de los valores relativos de las
magnitudes del numerador y del denominador de la ecuacin 2.12. Se pueden
distinguir tres casos interesantes que quedan determinados por la aplicacin de la
regla de los 2/3.
Si una unidad tiene un valor de entrada positivo, Ii, y una entrada neta positiva
grande procedente de la parte superior, Vi, entonces la regla de los 2/3 dice que la
actividad de la unidad debera ser mayor que cero. Para que esto suceda, debe ser
cierto que I i + D1V I B1 > 0 en la ecuacin 2.12. Para analizar todava ms esta
relacin, vamos a anticipar algunos resultados sobre el procesamiento en la capa F2.
Para ser exactos, supondremos que solamente un nico nodo de la capa F2 tiene una
salida no nula en cualquier instante dado, que la salida mxima de cualquier nodo de
la capa F2 es 1, y que el peso mximo de cualquier conexin descendente tambin
N

es 1. Dado que Vi = u j z ij y que solamente un u j es no nulo, entonces V I =1.


j =1

Entonces en el caso ms extremo, cuando V I =1 e I i = 1, se debe tener que:

36

1 + D1 B1 > 0

B1 < D1 + 1

(2.13)

Toda unidad que no reciba una seal descendente de F2 debe tener una actividad
negativa, incluso aunque reciba una entrada procedente de la parte inferior. En este
caso, debemos tener que I i B1 < 0 , o bien B1 > 1
Caso 4.- Supongamos que F2, est produciendo una salida descendente (quiz como

resultado de entradas procedentes de niveles superiores), pero que todava no hay un


vector de entrada I. G sigue estando inhibida en este caso. La ecuacin para las
actividades es:

x1i = x1i + (1 A1 x1i )D1Vi (B1 + C1 x1i )

(2.14)

ya que I i , G = 0.
El estado de equilibrio es:

x1i =

D1VI B1
1 + A1 (I i + D1VI ) + C1

(2.15)

Si una unidad no recibe una entrada neta procedente de F2 (si V I =0) entonces
permanece en su nivel ms negativo de actividad, como en las ecuacin 2.8. Si
V I >0, entonces la actividad de la unidad asciende hasta algn valor superior al de la

ecuacin 2.8, pero debe seguir siendo negativa porque no se desea que la unidad
tenga una salida no nula basada nicamente en entradas descendentes. Entonces, a
partir del numerador de la ecuacin 2.15, se debe tener que:

37

B1 > D1

(2.16)

Combinando las ecuaciones 10 11 y 13 se obtiene la condicin general:


mx{ D1 ,1} < B1 < D1 +1

(2.17)

Los parmetros de la ART1 deben satisfacer las condiciones de la ecuacin 2.17


para que se respete la regla de los 2/3, y para distinguir entre patrones de entradas
ascendentes y descendentes. El cumplimiento de las condiciones impuestas por la
ecuacin 2.17 no garantiza que una unidad que reciba tanto una entrada procedente
de la parte inferior, Ii, como una procedente de la parte superior, Vi , vaya a tener un
valor de activacin positivo. Es preciso considerar el caso en que Vi sea menor que
su valor mximo de 1 (aunque u j = 1 , zij

puede ser menor que 1, lo cual dara

lugar a que V I <1). En tal caso, la condicin para que la ecuacin 2.12 produzca un
valor positivo es: I i + D1Vi B1 > 0
Dado que I i =1, esta relacin define la siguiente condicin sobre V I :

VI >

B1 1
D1

(2.18)

La ecuacin 2.18 nos dice que la entrada de la unidad vi debida a una seal
descendente que procede de F2 debe satisfacer una cierta condicin umbral para
asegurar una activacin positiva de vi , incluso en el caso de que vi reciba una
fuerte entrada Ii procedente de la parte inferior. Volveremos a este resultado cuando
hablemos de los pesos, o rastros de LTM, que van de F2 a F1.

38

2.3.4.3 Procesamiento en F2

En la Figura 2.13 se ilustra un elemento de procesamiento de la capa F2, con sus


distintas entradas y vectores de pesos.

Figura 2.13 Elemento de Procesamiento vj, de la Capa F2 de la Red ART1

(Flix N. Diego, Ziga C. Wladimir)

Como observamos en la Figura 2.13, la actividad de la unidad v j es x2 j . Las salidas

u j de la unidad se vuelven a enviar hacia abajo a F1 (figura 2.13 flecha roja). Este
elemento de procesamiento, recibe entradas procedentes de la capa F1 ( T j ) y un

39

trmino de realimentacin positiva g ( x2 j ) procedente de s misma. Estos dos tipos


de entradas: T j y

g ( x2 j ) (figura 2.13 flechas azules) conforman la entrada

excitadora total J + (figura 2.11) a la neurona v j . Adems esta unidad enva una
seal idntica a g ( x2 j ) a travs de una conexin inhibitoria a todas las neuronas de
la capa F2, excepto a s misma. Por ende, v j recibir estmulos negativos
provenientes de los dems elementos en F2 (figura 2.13 flechas verdes). Estas
entradas forman la entrada inhibidora total J (figura 2.11) a esta neurona.
Las actividades de las unidades estn descritas mediante la ecuacin 2.1. La
entrada neta recibida procedente de la capa F1 se calcula como de costumbre:
M

T j = si z ji
i =1

(2.19)

El valor de la entrada neta para cada elemento de procesamiento de la capa F2 es el


producto punto entre la seal propagada desde F1 ( si ) y los pesos descendentes z ji ,
siendo M el nmero de neuronas de la capa F1.
La entrada excitadora total a v j es:
+

J j = D2T j + g ( x2 j )

(2.20)

La entrada inhibidora total a v j es:

J j = g ( x2 k )

k j

(2.21)

40

Sustituyendo los valores de las entradas excitadora e inhibidora en la ecuacin 2.5,


se obtiene:

x2 j = x2 j + (1 A2 x2 j )( D1T j + g ( x2 j )) ( B2 + C2 x2 j ) g ( x2 k )

(2.22)

k j

En esta ecuacin se describe una capa competitiva con interacciones de centro


activado y periferia desactivada. La evolucin de las actividades de las unidades de
esta capa est influenciada por la forma funcional de g(x). Seleccionaremos los
distintos parmetros de la ecuacin anterior 2.22 y la forma funcional de g(x) de tal
forma que se incremente la actividad del nico nodo de F2 que tenga el mayor
valor de entrada neta procedente de F1, de acuerdo con la ecuacin 2.19. Las
actividades de todos los dems nodos se reducen a cero. La salida de este nodo
ganador recibe un valor de uno. Por tanto, se pueden expresar los valores de salida
de los nodos de F2 en la forma:

1 si T j max{Tk } k
k
u j = f ( x2 j ) =
0 caso contrario

(2.23)

Es necesario aclarar un ltimo detalle acerca de la Figura 2.10. El elemento de


proceso de la figura parece violar nuestra regla de una sola salida por nodo: el nodo
enva una salida igual a g ( x2 j ) a las unidades de F2, y una salida de f ( x2 j ) a las
unidades de F1. Se puede explicar esta discrepancia haciendo que la Figura 2.10
represente una estructura compuesta. Se puede disponer que la unidad v j tenga
como nico valor de salida a x2 j . Esta salida se puede enviar entonces a otros dos
elementos de proceso; uno que proporciona una salida de g ( x2 j ) y otro que da una

41

salida de

f ( x2 j ) Suponiendo que existan estos dos nodos intermedios, o

interneuronales, se puede evitar violar el estndar de una sola salida. El nodo de la


Figura 2.10 representa una composicin de los nodos v j

y de los dos nodos

intermedios.

2.3.4.4 Rastros Descendentes de LTM

Las ecuaciones que describen los rastros descendentes de LTM (los pesos de las
conexiones de unidades de F2 hasta las unidades de F1) son del tipo de una red
competitiva.

z ij = (-z ij + h(x1i )) f (x 2 j )

(2.24)

Ya que f ( x2 j ) slo es no nula para un nico valor de j (para un nodo de F2, vj), la
ecuacin anterior es no nula slo para conexiones que descienden desde esa unidad
ganadora. Entonces:

Si el j-simo nodo de F2 est activado y tambin est activado el i-simo


nodo de F1, entonces z ij = - z ij + 1 y z ij se aproximan asintticamente a 1.

Si el j-simo nodo de F2 est activado y el i-simo nodo de F1 no est


activado, entonces z ij = - z ij y z ij se van reduciendo hasta cero.

As, se puede resumir el comportamiento de z ij de la siguiente manera:

42

- z ij + 1 vj y vi estn activados

vj activado, vi inactivo
z ij = - z ij

vj y vi estn inactivos
0

(2.25)

Recordemos de la ecuacin 2.18. Recordemos que, si F2 est activada, entonces vi


puede estar activa slo si sta recibe una entrada Ii procedente de la parte inferior, y
adems una entrada neta suficientemente grande, Vi, procedente de la capa F2. Como
slo est activada una unidad de F2 a la vez, entonces Vi = u j z ij = z ij , y la
ecuacin 2.18 pasa a ser ahora una condicin que afecta al peso de la conexin que
va desde vi hasta vj:
z ij

>

B1 1
D1

(2.26)

A no ser que z ij tenga un valor mnimo dado por la ecuacin anterior, ste ir
decreciendo hasta cero an en el caso de que vj est activada y vi est recibiendo una
entrada Ii procedente de la parte inferior.
Desde un punto de vista prctico, todos los pesos de conexin descendentes deben
recibir un valor inicial mayor que le mnimo dado por la ecuacin 2.26, para que as
pueda tener lugar el aprendizaje de la red. En caso contrario, cada vez que un vj est
activado en F2, todas las conexiones que vayan desde l hasta cualquier unidad de
F1 tendern a cero; de tal forma que todos los pesos de la conexin sern nulos, y el

sistema se tornar inservible.


Establecer una condicin de resonancia durante un largo periodo de tiempo, hace que
los pesos descendentes se aproximen a sus pesos asintticos de 0 1, dependiendo la
ecuacin 2.25. Suponiendo que los patrones de entrada de F1 se conservan durante

43

un tiempo suficiente para que se equilibren los pesos descendentes, se les puede dar a
los pesos descendentes sus asintticos. Si vj es el nodo ganador de F2, entonces:
1 si vi est activada
z ij =
0 caso contrario

(2.27)

Los pesos de conexin procedentes de otros nodos, vj con j J , no resultan


modificados. Este es el modelo de aprendizaje rpido.

2.3.4.5 Rastros Ascendentes de LTM

Las ecuaciones que describen los pesos ascendentes de LTM son algo ms
complicadas que las utilizadas para los pesos descendentes de LTM. As, el peso de
la conexin que va desde vi en F1 hasta vj en F2 est dado por:

z ji = Kf(x2 j )[(1 - z ji ) Lh( x1i ) - z ji h( x1k )]


k i

(2.28)

en donde K y L son constantes, f(x2j) es la salida de vj y h(x1i) es la salida de vi.


Al igual que en el caso de los pesos descendentes de LTM, el factor f(x2j) asegura
que slo se permite cambiar a los pesos del nodo ganador. Salvo a este detalle, la
ecuacin anterior corresponde a un sistema competitivo con interacciones de centro
activado y periferia desactivada. En este caso, sin embargo, son los pesos (en lugar
de las unidades) individuales los que compiten entre si.
Vamos a suponer que vj es la unidad ganadora de F2. Hay que considerar dos casos:
1 si vi est activado en F1
h(x1i ) =
0 caso contrario

(2.29)

44

Los pesos de la conexin con otras unidades F2 no van a cambiar puesto que, para
ellas:

f(x2 k ) = 0 , si k j

(2.30)

Antes de continuar con ste anlisis, vamos a introducir nuevas notaciones:

Si el patrn de entrada es I, entonces definiremos el mdulo I, |I|, como la


sumatoria de los nodos Ii:
| I | = Ii

(2.31)

Dado que Ii es o bien 0, o bien 1, |I| es igual al nmero de entradas no nulas.

La salida de F1 es el patrn S; su mdulo es:


| S | = h(x1i ) ,

(2.32)

que tambin es precisamente el nmero de salidas no nulas que hay en F1. El


patrn de respuesta en s, S, depende de las condiciones presentes de la red:
I
S=
J
I V

si F2 est activada
si F2 est desactivada

(2.33)

en donde el ndice de J significa que vj era la unidad ganadora en F2. Se


puede interpretar que VJ representa un patrn binario con un 1 en las
posiciones en las que la entrada Vi procedente de la parte superior es
suficientemente grande para admitir la activacin de vi, siempre que vi reciba
una entrada Ii procedente de la parte inferior.
Dado que

45

| S | = h(x1i ) ,
i

(2.34)

se tiene que

h(x
k 1

1k

) = h(x1k ) h(x1i ) ,

(2.35)

que a su vez ser igual o bien a


| S | o bien a | S | - 1 ,

(2.36)

dependiendo de si est o no activa vi.


Entonces, se pueden resumir los tres casos de la ecuacin 2.28 de la siguiente forma:
K [(1 - z ji ) L - z ji (| S | -1)] si vi y vj estn activadas

z ji = K [z ji | S |]
si vi est desactivada y vj activa

si vj est desactivada
0

(2.37)

Debemos recordar que vi puede seguir activada nicamente si recibe una seal de Ii
procedente de la parte inferior, junto con una entrada Vi suficientemente grande
procedente de la parte superior. En el caso del aprendizaje rpido, los pesos del nodo
F2, vJ, toman los valores asintticos dados por:

zJi

= L 1 + | S |

si vi est activada

(2.38)

si vi est desactivada

en donde se tiene L > 0 para mantener L 1 > 0.


El hecho de definir los pesos ascendentes en la forma que se ha hecho, da una
caracterstica importante a la red ART1 que ser descrita dentro del siguiente
escenario:

46

Supongamos que un nodo de F2, vJ1, gana, y que aprende durante la presentacin de
un patrn de entrada, I1, y que otro nodo vJ2 gana y aprende el patrn de entrada I2.
Adems, se tiene que el patrn de entrada I1 un subconjunto del patrn de entrada I2;
esto es, I1 I2 . La prxima vez que se presente I1 o I2, desearamos que ganase el
nodo apropiado de F2. La ecuacin 2.38 nos asegurar que el nodo adecuado gane,
manteniendo a los pesos del nodo que ha aprendido el patrn del subconjunto
suficientemente ms elevados que los del nodo que ha aprendido el patrn del
conjunto ms extenso.
Para el patrn del subconjunto I1, los pesos que vienen de los nodos activos de F1
toman el valor

z J 1,i =

L
L 1+ | I1 |

(2.39)

en donde se ha usado el resultado

| S | = | I1 V J | = | I1 | .

(2.40)

Para el patrn del subconjunto ms extenso, I2,

z J 2 ,i =

L
L 1+ | I 2 |

(2.42)

en las conexiones procedentes de los nodos activos de F1. Calculemos ahora la


entrada neta a los dos nodos para cada una de los patrones de entrada, para verificar
que el nodo vJ1 es el ganador para el patrn I1 y que el nodo vJ2 es el ganador para el
patrn I2.
Entonces, las entradas netas de vJ1 y vJ2 para el patrn de entrada |I1| son:

47

TJ 1,1 = z J 1,i h( x1i )1


i

L | I1 |
L 1+ | I1 |

y
TJ 2 ,1 = z J 2 ,i h( x1i )1
i

L | I1 |
L 1+ | I 2 |

(2.33)

respectivamente, en donde el subndice adicional de T y de h(x1i) indica el nmero de


patrones que se est presentando. Dado que I1 I2 , | I1 | < | I2 | y adems TJ2,1 < TJ1,1 ,

as que vJ1 es el ganador, tal como se deseaba.


Cuando se presenta I2 es, las entradas netas son:
TJ 1,2 = z J 1,i h( x1i ) 2
i

L | I1 |
L 1+ | I1 |

y
TJ 2 ,2 = z J 2 ,i h( x1i ) 2
i

L | I2 |
L 1+ | I 2 |

(2.43)

Se observa que | I1 | aparece en el numerador de la expresin de TJ1,2 en lugar de | I2 |.


Esto se da porque debemos recordar que vJ1 ha aprendido nicamente el patrn del
subconjunto. As, los pesos ascendentes de ese nodo son no nulos slo para las

48

unidades de F1 que representen al subconjunto. Esta vez, dado que | I1 | < | I2 | ,


tenemos que TJ2,2 > TJ1,2 , as que gana vJ2.
En una red que tenga nodos libres (nodos que an no hayan participado en ningn
aprendizaje) en F2, es preciso asegurarse de que sus pesos, debido al sistema de
inicializacin, no sean tan grandes y que ganen accidentalmente un nodo que ya haya
aprendido un patrn. Por tanto, es preciso mantener todos los pesos iniciales por
debajo de un cierto valor. Dado que todos los patrones son un subconjunto del patrn
que slo contiene unos, se debera mantener todos los valores iniciales de los pesos
dentro del siguiente intervalo:
0 z ji (0)

L
L 1+ M

(2.44)

en donde M es el nmero de nodos que hay en F1 y, por tanto, es el nmero de


conexiones ascendentes que llega a cada nodo de F2. Esta condicin asegura que
ningn nodo desocupado gane accidentalmente a algn otro nodo que haya aprendido
cierto patrn de entrada.

2.3.4.6 Subsistema de Orientacin

El subsistema de orientacin perteneciente a la red ART es el responsable de detectar


faltas de coincidencia entre los patrones ascendentes y descendentes de la capa F1.
Su funcionamiento se puede modelar aadiendo trminos a las ecuaciones dinmicas
que describan las actividades de los elementos de procesamiento de F2.

49

Para modelar la dinmica del subsistema de orientacin haremos un acercamiento


basado en describir el proceso de bsqueda de coincidencias y de restauracin, y sus
efectos en las neuronas de F2.
Se puede modelar el subsistema de orientacin como un nico elemento de
procesamiento, A, con una salida para cada una de las unidades de la capa F2. Las
entradas de A son las salidas de las unidades de F1, S, y el vector de entrada I (ver
Figura 2.8). Los pesos de las conexiones que vienen del vector I son todos ellos
iguales a un cierto valor P; mientras que, los que pertenecen a conexiones
procedentes de F1 son todos iguales a un cierto valor Q.
Entonces, la entrada neta que llega a A es:
P | I| Q |S| ,

(2.45)

mientras que la salida de A se activa si la entrada neta pasa a ser no nula:


P | I|-Q |S|> 0

o bien
P | I| >Q |S|
P |S|
>
Q |I|

(2.46)

La magnitud P/Q es el llamado parmetro de vigilancia y suele identificarse


mediante el smbolo (rho). As, el subsistema de orientacin no se activa cuando
|S|

|I|

(2.47)

50

Adems, se debe tomar en cuenta que | S | = | I | cuando F2 est inactiva. Entonces, el


subsistema de orientacin no debe enviar una seal de restauracin de F2 se
momento. Partiendo de la ltima ecuacin, se obtienen dos condiciones, la primera
afecta al parmetro de vigilancia, y la segunda que afecta a P y a Q:

1 , P Q

(2.48)

El valor de parmetro de vigilancia mide hasta qu grado separa el sistema entre


distintas clases de patrones de entrada. De esta forma, se constituye una bsqueda
de autoescalado, es decir que, la presencia o ausencia de una cierta caracterstica en
dos patrones puede o no causar una restauracin, segn la importancia global de esa
caracterstica para la clase.

Figura 2.14. Diagrama Descriptivo de la Propiedad de Autoescalado ART

(J. A. Freeman y D. M. Skapura)

51

La figura anterior (Figura 2.14.), muestra un ejemplo de ste autoescalado, en donde:


a) Para un valor de = 0,8, la existencia de una caracterstica adicional en el
centro del patrn descendente de la derecha es ignorada por el subsistema de
orientacin, que considera ambos patrones en una misma clase.
b) Para el mismo valor de , estos patrones ascendentes y descendentes darn
lugar a que el subsistema de orientacin enve una seal de restauracin a F2.
Expresado de otra forma, el valor de determina la granularidad (atomicidad del
proceso) con la cual la red clasifica los patrones de entrada. Entonces, para un cierto
conjunto de patrones a clasificar, el grado de discriminacin ser directamente
proporcional al valor de .
El tener un valor de menor a 1 permite tambin la posibilidad de que el patrn
descendente que est codificada en F2 represente a una cierta clase y pueda cambiar
a medida que se le presentan nuevos vectores de entrada a la red. De manera
explcita, en la Figura 2.14., se haba supuesto que el patrn descendente de la
derecha haba sido aprendido previamente por uno de los nodos de F2. La aparicin
del patrn ascendente de la izquierda no da lugar a una restauracin, entonces se
establece una resonancia entra la capa F1 y el nodo ganador de F2 que haya
producido el patrn descendente. Durante esta resonancia, como se dijo cuando se
estaba describiendo la arquitectura de la red ART, pueden cambiar los pesos. El nodo
F1 que corresponde a la caracterstica del centro no est activado, ya que esta

caracterstica faltaba en el vector de entrada. Tanto el peso descendente de esta


conexin como el peso ascendente del nodo F2 decrecern, de tal forma que en el
modo de aprendizaje rpido, nos limitamos a hacerlos igual a cero.
52

Finalmente, para completar el modelo del subsistema de orientacin, consideraremos


los efectos producidos sobre las unidades de F2. As, cuando se produce una falta de
coincidencia para un cierto patrn, el subsistema de orientacin debera inhibir la
unidad de F2 que haya dado lugar a un patrn no coincidente (la neurona ganadora),
y deber mantenerse esta inhibicin durante el resto del ciclo de bsqueda y
coincidencias.

2.3.5 Resumen del Procesamiento de ART1

Para el algoritmo de aprendizaje se emplear las soluciones asintticas de las


ecuaciones dinmicas, y el aprendizaje rpido para los pesos.
Algoritmo de aprendizaje

1. Definicin de parmetros:
M: unidades en F1.
N: unidades en F2.
A1 ^ C1 > 0

mx{ D1 ,1} < B1 < D1 +1


L>1
0 < <1
2. Inicializar pesos:
pesos descendentes: vj vi

z ij (0 ) >

B1 1
D1

53

0 < z ji (0) <

pesos ascendentes: vi vj

L
L 1+ M

3. Inicializar actividades en F1 y F2:


en F1: x1i (0) =

B1
1 + C1

en F2: x2 j (0) = 0

Procesamiento de datos en la red entrada I {0,1}


4. Aplicar una entrada I a F1 x1i =

Ii
1 + A1 (I i + B1 ) + C1

5. Calcular la salida ( si ) de F1
1 si x1i > 0
s i = h( x1i ) =
0 si x1i 0

6. Propagar s a F2 y calcular la entrada neta: T j


M

T j = si z ji
i =1

7. Calcular la salida de F2 (neurona ganadora vJ)

1 si T j max{Tk } k
k
u j = f ( x2 j ) =
0 caso contrario
8. Propagar la salida de F2 a F1 y calcular la entrada neta Vi
N

Vi = u j z ij
j =1

54

9. Calcular las nuevas actividades en F1:


x1i =

I i + D1VI B1
1 + A1 (I i + D1V I ) + C1

10. Calcular las salidas si como en el paso 5.

11. Realizar la comparacin entre I y la respuesta desde F2:

12. Si

S
I

S
I

< vJ inactiva, las salidas de F2 = 0 y regresar al paso 4 con I original.

De lo contrario, si

S
I

> continuar.

13. Actualizar los pesos bottom-up solo en vJ

zJi

= L 1 + | S |

si vi est activada
si vi est desactivada

14. Actualizar pesos top-down solo de vJ a todas las unidades en F1:


1 si vi est activada
z ij =
0 caso contrario
15. Remover I. Restaurar las unidades inactivas en F2. Ir al paso 4 con un nuevo
patrn de entrada I.

55

CAPITULO III

RED ART1 PARA EL RECONOCIMIENTO DE


DGITOS ESCRITURA LIBRE

3.1 Descripcin del Problema.

Buscamos construir una red neuronal ART1 con el fin de utilizarla para resolver el
problema del reconocimiento de dgitos de libre escritura. Este problema radica en
intentar agrupar dentro de una misma clase a dgitos con mnimas variaciones en
forma, pero que representen un mismo valor numrico. En la siguiente figura se
ilustra con un ejemplo el problema a resolver: Los tres patrones, a pesar de la ligera
variacin en su escritura, representan a un mismo valor, el nmero 1.

56

Figura 3.1 Clasificacin de Caracteres de Escritura Libre

(Flix N. Diego, Ziga C. Wladimir)

3.2 Diseo de la Red de Prueba.

En la etapa inicial de prueba utilizaremos un glyph de 5x3 equivalente a una red de


15 neuronas en la capa de entrada. Escogimos una red pequea con el propsito de
facilitar los clculos ya que los mismos se llevaran cabo solamente con la ayuda de
una calculadora. No haremos uso del computador sino hasta la fase de
implementacin una vez que se haya experimentado previamente con el
funcionamiento del algoritmo en esta etapa de pruebas.

57

Figura 3.2 Arquitectura ART1 para 15 neuronas F1 y 15 neuronas F2

(Flix N. Diego, Ziga C. Wladimir)

Figura 3.3 Glyph (5x3)

(Flix N. Diego, Ziga C. Wladimir)

58

3.3 Casos de Prueba

Se han definido dos casos de prueba para determinar las bondades del algoritmo. El
primer caso de prueba ser el glyph correspondiente al nmero uno (1), mientras que
en el segundo caso se probar el glyph del nmero seis (6).

3.4 Parmetros de Prueba.

El prximo paso para probar la red es definir los parmetros que determinan las
caractersticas de la misma. Estos parmetros son los siguientes:
M, nmero de neuronas en la capa de entrada F1.
N, nmero de neuronas en la capa competitiva F2.
A, respuesta inhibitoria debido a la normalizacin.
B, parmetro de inhibicin que se utiliza para realizar el mejoramiento por
contraste.
C, inhibicin causada por el resto de neuronas de la capa.
D, multiplicador del efecto de la seal de entrada neta procedente de F2 hacia cada
neurona en F1.
L, constante para el ajuste de pesos ascendentes.
, parmetro de vigilancia que determina la similitud entre el vector de entrada y el
patrn almacenado en memoria LTM.
Estos parmetros debern ser seleccionados bajo las condiciones establecidas por el
algoritmo:

59

1. A1 ^ C1 > 0,
2. mx{ D1 ,1} < B1 < D1 +1,
3. L > 1,
4. 0 < <1

En virtud de estas condiciones, los valores de los parmetros que hemos escogido
son los siguientes:
M = 15
N = 15
A1 = 1
B1 = 1.5
C1 = 5
D1 = 0.9
L=3
= 0.9

60

3.5 Resultados
3.5.1 Glyph correspondiente al nmero 1. 5

Figura 3.4 Glyph correspondiente al nmero 1

(Flix N. Diego, Ziga C. Wladimir)

1. Definicin de Parmetros.

M = 15
N = 15
A1 = 1
B1 = 1.5
C1 = 5

Numeracin correspondiente al algoritmo de la seccin 2.3.5.Resumen del Procesamiento de ART1.

61

D1 = 0.9
L=3
= 0.9
2. Inicializar Pesos.

Pesos Descendentes:
Las condiciones del algoritmo imponen que z ij (0) >

z ij (0) >

B1 1
, de donde:
D1

1.5 1
= 0.556
0.9

Para cumplir con esta condicin se aadi un pequeo valor positivo (0.3) a
B1 1
, porque representa una adicin significativa de alrededor del 50% de 0.556.
D1
Por ende:
z ij (0 ) =

1.5 1
+ 0.3 = 0.856 , entonces:
0.9

z ij = (0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856,
0.856, 0.856, 0.856, 0.856)T
Pesos Ascendentes:
Las condiciones del algoritmo indican que z ji (0 ) <

z ji (0 ) <

L
, de donde:
L 1+ M

3
= 0.176
3 1 + 15

62

Para cumplir con esta condicin se rest el valor de 0.076 a

L
por
L 1+ M

comodidad, para obtener un valor fcil de manejar como 0.1, as:


z ji (0) =

3
0.076 = 0.1 , entonces:
3 1 + 15

z ji = (0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)
3. Inicializar Actividades.

En F1: x1i (0) =

B1
, as:
1 + C1
x1i (0 ) =

1.5
= 0.25
1+ 5

X 0 = (-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25,
-0.25, -0.25, -0.25)
En F2: x2 j (0) = 0

4. Aplicar una entrada I a F1 y calcular las actividades.


I 1 = (0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1)

si I i = 0

x11 = 0

si I i = 1

x12 =

1
= 0.118
1 + 1(1 + 1.5) + 5

X 1 = (0, 0.118, 0, 0.118, 0.118, 0, 0, 0.118, 0, 0, 0.118, 0, 0.118,0.118, 0.118)

5. Calcular la salida ( si ) de F1.

63

S = (0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1)
6. Propagar s a F2 y calcular la entrada neta: T j

T j = z ji S = 0.1 8 = 0.8

T = (0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8)
7. Calcular la salida de F2 (neurona ganadora vJ)

Dado que todas las neuronas tienen el mismo valor de entrada neta, se escoger a la
primera como ganadora, ya que es fcil hacer un seguimiento de las neuronas
ganadoras en un orden secuencial.
U = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
8. Propagar la salida de F2 a F1 y calcular la entrada neta Vi

Vi = z ij U = 0.856
V = (0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856,

0.856, 0.856, 0.856, 0.856)

9. Calcular las nuevas actividades en F1:

Si I i = 0
x11 =

0 + 0.9 * 0.856 1.5


= 0.108
1 + 1 * (0 + 0.9 * 0.856 ) + 5

Si I i = 1

64

x11 =

1 + 0.9 * 0.856 1.5


= 0.035
1 + 1 * (1 + 0.9 * 0.856 ) + 5

X 2 = (-0.108, 0.035, -0.108, 0.035, 0.035, -0.108, -0.108, 0.035, -0.108, -0.108,

0.035, -0.108, 0.035, 0.035, 0.035)


10. Calcular las salidas si

S = (0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1)

11. Realizar la comparacin entre I y la respuesta desde F2:

S
I

12. Dado que

S
I

8
8

S
I

=1

> 0.9 , contino.

13. Actualizar los pesos ascendentes solo en vJ

si vi est activa:

z Ji =

3
3 1+ 8

= 0.621

z Ji = (0, 0.621, 0, 0.621, 0.621, 0, 0, 0.621, 0, 0, 0.621, 0, 0.621, 0.621, 0.621)


14. Actualizar pesos descendentes solo de vJ a todas las unidades en F1.

z iJ = (0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1) T

El subndice J (jota mayscula) en v representa a la neurona ganadora en la capa competitiva F2.

65

Matriz de Pesos Descendentes (15x15):

Matriz de Pesos Ascendentes (15x15):

66

3.5.2 Glyph correspondiente al nmero 6.

Figura 3.5 Glyph correspondiente al nmero 6

(Flix N. Diego, Ziga C. Wladimir)

Se comenzar en el paso 4 del algoritmo (aplicar una entrada I a F1 y calcular las


actividades) por cuanto los parmetros tienen valores nicos para cada red. Adems,
los valores de los pesos y las actividades corresponden a los ltimos valores
obtenidos en los clculos del glyph del nmero 1.
4. I 2 = (1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1)

si I i = 0

x15 = 0

si I i = 1

x11 =

1
= 0.118
1 + 1(1 + 1.5) + 5

X 3 = (0.118, 0.118, 0.118, 0.118, 0, 0, 0.118, 0.118, 0.118, 0.118, 0, 0.118, 0.118,
0.118, 0.118)

67

5. S = (1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1)
6. T j = z ji S = 0.1 12 = 1.2

Para la neurona ganadora (la primera de F2), con z Ji se tiene:

TJ = z Ji S = 0.621 +0.621 +0.621 +3*0.621= 3.726

T = (3.726, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2)
7. U = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
8. Vi = z ij U
V = (0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1)
9. Las nuevas actividades

ij

en F1:

si I i = 1 y Vi = 0

x11 =

1 + 0 .9 * 0 1 .5
= 7.14 10 2
1 + 1 * (1 + 0 ) + 5

si I i = 1 y Vi = 1

x12 =

1 + 0 .9 * 1 1 .5
= 5.063 10 2
1 + 1 * (1 + 0.9 * 1) + 5

si I i = 0 y Vi = 1

x15 =

0 + 0 .9 * 1 1 .5
= 8.695 10 2
1 + 1 * (0 + 0.9 * 1) + 5

si I i = 0 y Vi = 0

x16 =

0 + 0 .9 * 0 1 .5
= 0.25
1 + 1 * (0 + 0.9 * 0 ) + 5

10. S = (0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1)

11.

S
I

6
12

= 0.707

68

12. Dado que

S
I

< 0.9 , vuelvo al paso 4 del algoritmo (aplicar una entrada I a F1 y

calcular las actividades).


4. X 3 = (0.118, 0.118, 0.118, 0.118, 0, 0, 0.118, 0.118, 0.118, 0.118, 0, 0.118,

0.118, 0.118, 0.118)


5. S = (1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1)
6. T j = z ji S = 0.1 12 = 1.2

Se debe enviar una seal de restauracin para la neurona 1 de la capa F2, para evitar
que vuelva a ganar en la competencia, as T1 = 0, de donde:

T = (0, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2)
7. Tomando como ganadora esta vez a la segunda neurona de F2, se tiene:
U = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
8. Vi = z ij U
V = (0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856, 0.856,

0.856, 0.856, 0.856, 0.856)


9. si I i = 0

x1i = -0.108

si I i =1

x1i = 0.035

10. S = (1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1)

11.

S
I

12
12

=1

69

12. Dado que

S
I

> 0.9 , contino.

13. si vi est activa:


z Ji =

3
3 1 + 12

= 0.549

z Ji = (0.549, 0.549, 0.549, 0.549, 0, 0, 0.549, 0.549, 0.549, 0.549, 0, 0.549,


0.549, 0.549, 0.549)
14. z iJ = (1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1) T

Matriz de Pesos Descendentes (15x15):

70

Matriz de Pesos Ascendentes (15x15):

71

CAPITULO IV

DESARROLLO DE LA SOLUCIN DE LA RED ART1

4.1 Implementacin en Delphi.


4.1.1 Diseo de la Red.

En la implementacin de la aplicacin de software utilizaremos un glyph de mayor


tamao (9x7) que el glyph de 5x3 empleado en el captulo 3 en los casos de prueba.
Hemos decidido implementar esta red de 63 neuronas en la capa de entrada con el fin
de sacar provecho de la capacidad de procesamiento matemtico del computador.
4.1.2 Descripcin de la Aplicacin

En la Figura 4.1 se aprecia que el ART1 Simulator posee una zona de mens que
contiene las opciones Archivo y Ayuda. La opcin Archivo permite realizar
funciones de crear (Nuevo), Abrir, Guardar como y Salir.

72

Figura 4.1 Pantalla del Simulador del ART1 Simulator

(Flix N. Diego, Ziga C. Wladimir)

La aplicacin posee dos PageControls, Simulador y Arquitectura. El PageControl


Simulador permite la visualizacin de todo el procesamiento del algoritmo de
reconocimiento de caracteres, mientras que el PageControl Arquitectura muestra una
pantalla en la cual se detalla grficamente la estructura de la red ART1, como se
muestra en las figuras 4.1 y 4.2 respectivamente.

73

Figura 4.2 Pantalla de la Arquitectura del ART1 Simulator

(Flix N. Diego, Ziga C. Wladimir)

La interfase del Simulador contiene cuatro botones: Parmetros, Crear Red, Ejecutar
y Limpiar Glyph. El evento clic del botn Parmetros despliega una pantalla que
solicita el ingreso de los parmetros necesarios para construir la red (Figura 4.3). El
botn Crear Red permite inicializar los valores de los pesos de las capas F1 y F2,
despus de haber dibujado un glyph (patrn) de entrada con el puntero en la Grilla de
Ingreso de Glyph (Figura 4.1).

74

Figura 4.3 Pantalla de Ingreso de Parmetros al ART1 Simulator

(Flix N. Diego, Ziga C. Wladimir)

El botn Ejecutar realiza el algoritmo ART1 sobre el patrn ingresado mostrando en


la Zona de Procesamiento el vector de entrada y salida de F1, la neurona ganadora y
vector de salida en F2, y el valor de coincidencia entre el vector de entrada a F1 y el
de salida de F2; actualiza los pesos en ambas capas, muestra la codificacin binaria
del patrn de la Grilla de Ingreso de Glyph y almacena en un ComboBox o men de
persiana los patrones en LTM ms parecidos al patrn ingresado. Se puede
seleccionar uno de estos patrones y mediante el botn Mostrar ste se dibujar en la
Grilla de Clasificacin de Glyph (Figura 4.1). Finalmente el botn Limpiar Glyph
permite borrar el dibujo del glyph de entrada de la Grilla de Ingreso de Glyph.

75

4.2 Resultados

Primeramente se han definido los parmetros de la siguiente manera:


M= 63
N=12
A1=1
B1= 1.5
C1=5
D1=0.9
L=3
= 0.95
Analizaremos 5 casos:
i) Comprobaremos que la red aprende el patrn ms bsico o subconjunto de los

patrones que representan un mismo valor numrico.


Un patrn P es subconjunto de un patrn de entrada I si tiene una menor cantidad
de neuronas activas que I. En la Figura 4.4 se muestran 2 patrones, siendo el patrn
b subconjunto del patrn a. Aqu, las neuronas activas aparecen de color fucsia.

76

Figura 4.4 Subconjunto de Patrones.

(Flix N. Diego, Ziga C. Wladimir)

ii). Determinaremos la dependencia entre el tamao del glyph de entrada, el valor del

parmetro de vigilancia rho y el grado de tolerancia en el reconocimiento de


dgitos.
iii). Someteremos la red a reconocer el desplazamiento en la Grilla de Ingreso de

Glyph de un patrn previamente aprendido.


iv). Intentaremos que la red identifique el cambio de tamao de un patrn ya

aprendido.
v). Averiguaremos lo que sucede en el proceso de reconocimiento cuando se da el

caso de que la memoria LTM de la red est llena.


Antes de comenzar a analizar estos 5 casos previamente entrenamos la red con los 10
patrones que representan los nmeros dgitos, tal como se observa en la Figura 4.5.
Adems en cada caso se incluir la salida del programa, la cual se desplegarn los
resultados parciales del procesamiento del algoritmo que incluyen:
77

El patrn de entrada codificado como vector.

La primera salida de la capa de entrada F1.

La neurona ganadora en la capa competitiva F2. (El valor de las neuronas en F2


comienzan en cero).

La salida de F2 despus de la competencia.

La nueva salida en F1 despus de la retropropagacin.

La coincidencia entre el patrn de salida y el de entrada (a ser comparada con


rho).

Figura 4.5 Patrones Entrenados para la Red.

(Flix N. Diego, Ziga C. Wladimir)

78

4.2.1 Caso 1
1. Para este caso definiremos un rho = 0.8 con el fin de demostrar que la red

aprende y almacena en memoria LTM los patrones subconjuntos. Si mantenemos


un rho muy alto como el utilizado en el entrenamiento (0.95) el reconocimiento
ser mucho menos tolerante a pequeos cambios en los patrones y podra
almacenar el patrn subconjunto como uno nuevo.
A continuacin ingresaremos el patrn que representa al nmero uno (1) tal y
como se ve en la Grilla de Ingreso de Glyph de la Figura 4.6. Este patrn ser
clasificado como el nmero uno del entrenamiento de al red.

Figura 4.6 Primer Caso Reconocimiento del Patrn Aprendido Inicialmente.

(Flix N. Diego, Ziga C. Wladimir)

79

Vector de Entrada:
000100000110000001000000100000010000001000000100000010000001000
Salida F1:
000100000110000001000000100000010000001000000100000010000001000

Neurona Ganadora F2: 1


Salida F2: 010000000000000
Nueva Salida F1:
000100000110000001000000100000010000001000000100000010000001000
Coincidencia entre trama de salida y trama de entrada: 1

2. A continuacin haremos que la red clasifique a un patrn del nmero uno (1) con

una barra inclinada izquierda mucho ms corta. Este patrn es clasificado como
miembro de la clase del primer patrn aprendido (patrn a de la Figura 4.4). Esto
se puede apreciar en la Zona de Procesamiento donde se ve que la neurona
ganadora en F2 es la misma que cuando se ingres el primer patrn. Sin embargo
la red almacena en su memoria LTM el segundo patrn ingresado (patrn b
Figura 4.4) ya que ste es subconjunto del primero.

80

Figura 4.7 Primer Caso Ingreso y Aprendizaje de un Patrn Subconjunto del

Patrn Aprendido Inicialmente.


(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
000100000110000101000100100000010000001000000100000010000001000
Salida F1:
000100000110000101000100100000010000001000000100000010000001000
Neurona Ganadora F2: 1
Salida F2: 010000000000000
Nueva Salida F1:
000100000110000001000000100000010000001000000100000010000001000
81

Coincidencia entre trama de salida y trama de entrada: 0,833333333333333

3. Como tercer paso se vuelve a ingresar el nmero uno (1) con la barra ms larga.

En este punto la red lo clasificar como su subconjunto (el nmero uno con la
barra corta), dado que este subconjunto representa hasta este instante el patrn
ms simple (el de menor nmero de neuronas activas) del nmero uno.

Figura 4.8 Primer Caso Nueva Clasificacin del Patrn Aprendido Inicialmente.

(Flix N. Diego, Ziga C. Wladimir)

82

Vector de Entrada:
000100000110000101000100100000010000001000000100000010000001000
Salida F1:
000100000110000101000100100000010000001000000100000010000001000
Neurona Ganadora F2: 1
Salida F2: 010000000000000
Nueva Salida F1:
000100000110000001000000100000010000001000000100000010000001000
Coincidencia entre trama de salida y trama de entrada: 0,833333333333333

4.2.2 Caso 2
1. Inicialmente ingresaremos un patrn correspondiente al nmero seis (6) de la

forma indicada en la Grilla de Ingreso de Glyph de la figura 4.9. En este caso


mantendremos el rho = 0.95 para obligar que la red aprenda a este patrn como
nuevo.

83

Figura 4. 9 Segundo Caso Ingreso de un Patrn Similar a uno Almacenado,

Rho = 0.95.
(Flix N. Diego, Ziga C. Wladimir)}

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 6
Salida F2: 000000100000000
Nueva Salida F1:
000111000000000000000100000011111101000001100000110000010111110
84

Coincidencia entre trama de salida y trama de entrada: 0,91304347826087

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 5
Salida F2: 000001000000000
Nueva Salida F1:
000111000000000000000100000011111100000001000000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,826086956521739

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 3
Salida F2: 000100000000000
Nueva Salida F1:
000111000000000000000000000000011100000001000000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,652173913043478

85

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 2
Salida F2: 001000000000000
Nueva Salida F1:
000111000000000000000000000001111101000000100000010000010111110
Coincidencia entre trama de salida y trama de entrada: 0,739130434782609

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 8
Salida F2: 000000001000000
Nueva Salida F1:
000111000000000000000100000001111101000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,869565217391304

86

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 0
Salida F2: 100000000000000
Nueva Salida F1:
000111000000000000000100000010000001000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,695652173913043

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 9
Salida F2: 000000000100000
Nueva Salida F1:
000111000000000000000100000001111100000001000000000000000111000
Coincidencia entre trama de salida y trama de entrada: 0,565217391304348

87

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 1
Salida F2: 010000000000000
Nueva Salida F1:
000100000100000100000100000000010000000000000000000000000001000
Coincidencia entre trama de salida y trama de entrada: 0,260869565217391

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 4
Salida F2: 000010000000000
Nueva Salida F1:
000000000000000000000100000011111100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,347826086956522

88

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 7
Salida F2: 000000010000000
Nueva Salida F1:
000111000000000000000000000000010000000000000000000000000010000
Coincidencia entre trama de salida y trama de entrada: 0,217391304347826

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Neurona Ganadora F2: 10
Salida F2: 000000000010000
Nueva Salida F1:
000111000100000100000100000011111101000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 1

89

2. En este punto se reingresar el patrn del paso 1, pero se cambiar el valor de rho

a 0.8 para verificar que la red clasifica al patrn de entrada como uno de los
patrones en memoria LTM.

Figura 4. 10 Segundo Caso Ingreso de un Patrn Similar a uno Almacenado,

Rho = 0.80.
(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
000111000100000100000100000011111101000001100000110000010111110
Salida F1:
000111000100000100000100000011111101000001100000110000010111110
90

Neurona Ganadora F2: 6


Salida F2: 000000100000000
Nueva Salida F1:
000111000000000000000100000011111101000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,91304347826087
En este caso el nmero seis ingresado (Figura 4.11 a) es clasificado como el seis
del entrenamiento (Figura 4.5) y el seis aprendido en el paso 1 (Figura 4.8). Sin
embargo, el algoritmo no nos permite ver directamente los dos resultados y
clasifica al nmero como el primer patrn semejante que se encuentre en
memoria LTM, en este caso el seis del entrenamiento almacenado antes del seis
del paso 1.

Figura 4. 11 Segundo Caso Comparacin de Similitud entre el Patrn de Entrada

vs. Patrn Asociado.


(Flix N. Diego, Ziga C. Wladimir)
91

4.2.3 Caso 3
1. Ingresaremos el patrn del nmero uno (1) con la barra de la izquierda corta

como en la Figura 4.4 b, pero desplazado dos pxeles hacia la derecha en la Grilla
de Glyph de Entrada (Figura 4.12).

Figura 4. 12 Tercer Caso Reconocimiento de un Patrn Existente Desplazado

hacia la Derecha.
(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
000001000001100000010000001000000100000010000001000000100000010

92

Salida F1:
000001000001100000010000001000000100000010000001000000100000010
Neurona Ganadora F2: 4
Salida F2: 000010000000000
Nueva Salida F1:
000000000000100000010000001000000100000010000001000000100000010
Coincidencia entre trama de salida y trama de entrada: 0,8

Vector de Entrada:
000001000001100000010000001000000100000010000001000000100000010
Salida F1:
000001000001100000010000001000000100000010000001000000100000010
Neurona Ganadora F2: 3
Salida F2: 000100000000000
Nueva Salida F1:
000001000000000000000000000000000100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,3

Vector de Entrada:
000001000001100000010000001000000100000010000001000000100000010

93

Salida F1:
000001000001100000010000001000000100000010000001000000100000010
Neurona Ganadora F2: 11
Salida F2: 000000000001000
Nueva Salida F1:
000001000001100000010000001000000100000010000001000000100000010
Coincidencia entre trama de salida y trama de entrada: 1
Como se puede comprobar en estos resultados, el patrn desplazado no es
reconocido como el patrn ya existente en memoria LTM y es aprendido como
un patrn diferente, a pesar de son exactamente iguales en forma y tamao.,
como se muestra en la Figura 4.13.

Figura 4.13 Tercer Caso Comparacin de Similitud entre el Patrn de Entrada

Desplazado vs. Patrn Original Asociado.


(Flix N. Diego, Ziga C. Wladimir)
94

4.2.4 Caso 4
1. Ingresamos un patrn que representa al nmero cuatro (4), pero de un tamao

ms pequeo que los patrones hasta ahora aprendidos por la red., como aparece
en la grilla de ingreso de Glyph de la Figura 4.14.

Figura 4. 14 Cuarto Caso Reconocimiento de un Patrn Existente Pero de Menor

Tamao.
(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000

95

Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 4
Salida F2: 000010000000000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000
Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 9
Salida F2: 000000000100000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000

96

Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 10
Salida F2: 000000000010000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000
Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 2
Salida F2: 001000000000000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000

97

Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 5
Salida F2: 000001000000000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000
Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 6
Salida F2: 000000100000000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000

98

Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 3
Salida F2: 000100000000000
Nueva Salida F1:
000000000000000000000000000000011100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,333333333333333

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000
Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 8
Salida F2: 000000001000000
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,444444444444444

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000

99

Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 7
Salida F2: 000000010000000
Nueva Salida F1:
000000000000000000000000010000010000000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,222222222222222

Vector de Entrada:
000000000000000010000001010000111100000100000010000000000000000
Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Neurona Ganadora F2: 12
Salida F2: 000000000000100
Nueva Salida F1:
000000000000000010000001010000111100000100000010000000000000000
Coincidencia entre trama de salida y trama de entrada: 1
Se puede observar con claridad que el patrn del nmero cuatro de menor tamao
no es clasificado como le cuatro aprendido en le entrenamiento, sino ms bien es
aprendido por la red, a pesar de que en forma estos dos patrones son similares y
ambos representan al nmero cuatro (Figura 4.15)

100

Figura 4.15 Cuarto Caso Comparacin de Similitud entre el Patrn de Entrada de

Menor Tamao vs. Patrn Original Asociado.


(Flix N. Diego, Ziga C. Wladimir)

4.2.5 Caso 5
1. Alimentamos la red con un patrn que representa al nmero dos (2), dibujado de

la forma como aparece en la Figura 4.16. Como el valor de rho es alto (0.95) la
red intentar aprender el patrn; sin embargo, como la memoria LTM est llena
(15 neuronas en la capa F2 almacenan 15 patrones) el patrn no ser aprendido.
Como resultado se despliegan el o los patrones que arrojan un valor de rho ms
cercano al valor de rho establecido (0.95).

101

Figura 4.16 Quinto Caso Memoria Llena Coincidencia con el Patrn ms Parecido

(Nmero 2)
(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 2
Salida F2: 001000000000000
Nueva Salida F1:
011111010000010000001000000000111000000000100000010000001111111

102

Coincidencia entre trama de salida y trama de entrada: 0,869565217391304

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 3
Salida F2: 000100000000000
Nueva Salida F1:
011111010000010000001000000000011000000000000000010000000111110
Coincidencia entre trama de salida y trama de entrada: 0,695652173913043

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 6
Salida F2: 000000100000000
Nueva Salida F1:
011111010000011000000000000000111000000000100000010000000111110
Coincidencia entre trama de salida y trama de entrada: 0,782608695652174

103

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 8
Salida F2: 000000001000000
Nueva Salida F1:
011111010000011000001000000000111000000000100000010000001111111
Coincidencia entre trama de salida y trama de entrada: 0,91304347826087

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 5
Salida F2: 000001000000000
Nueva Salida F1:
011111010000001000000000000000111000000000000000010000001111110
Coincidencia entre trama de salida y trama de entrada: 0,739130434782609

104

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 9
Salida F2: 000000000100000
Nueva Salida F1:
011111010000011000001000000000111000000000000000000000000111000
Coincidencia entre trama de salida y trama de entrada: 0,652173913043478

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 0
Salida F2: 100000000000000
Nueva Salida F1:
011111010000011000001000000000000000000000100000010000001111111
Coincidencia entre trama de salida y trama de entrada: 0,782608695652174

105

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 10
Salida F2: 000000000010000
Nueva Salida F1:
000111000000000000000000000000111000000000100000010000000111110
Coincidencia entre trama de salida y trama de entrada: 0,565217391304348

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 14
Salida F2: 000000000000001
Nueva Salida F1:
011111000000000000000000001000011000000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,391304347826087

106

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 7
Salida F2: 000000010000000
Nueva Salida F1:
011111000000010000000000000000010000000000000000000000000010000
Coincidencia entre trama de salida y trama de entrada: 0,347826086956522

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 4
Salida F2: 000010000000000
Nueva Salida F1:
000000010000001000000000001000111000000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,304347826086957

107

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 13
Salida F2: 000000000000010
Nueva Salida F1:
000011000000000000000000001000111000000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,304347826086957

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 12
Salida F2: 000000000000100
Nueva Salida F1:
000000000000000000000000000000111000000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,130434782608696

108

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 11
Salida F2: 000000000001000
Nueva Salida F1:
000001000000000000000000001000000000000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,130434782608696

Vector de Entrada:
011111010000011000001000001000111000100000100000010000001111111
Salida F1:
011111010000011000001000001000111000100000100000010000001111111
Neurona Ganadora F2: 1
Salida F2: 010000000000000
Nueva Salida F1:
000100000000000000000000000000010000000000000000000000000001000
Coincidencia entre trama de salida y trama de entrada: 0,130434782608696

109

2. Nuevamente volveremos a obligar a la red a aprender un patrn, para lo cual

cambiaremos el valor de rho a 1 e ingresaremos a la red un patrn que se asemeje


tanto al nmero cinco como la seis tal y como se ve en la Grilla de Ingreso de
Glyph de la Figura 4.17.

Figura 4.17 Quinto Caso Memoria Llena Coincidencias Encontradas

(Flix N. Diego, Ziga C. Wladimir)

110

Como se aprecia en los resultados desplegados, existen dos patrones en memoria


LTM que muestran un valor de rho igual (0,9583) al realizar la comparacin con
el patrn ingresado. En las figuras 4.18 y 4.19 se aprecia que estos patrones son
los que representan al nmero cinco (5) y al seis (6).

Figura 4.18 Quinto Caso Memoria Llena Coincidencia (Nmero cinco).

(Flix N. Diego, Ziga C. Wladimir)

111

Figura 4.19 Quinto Caso Memoria Llena Coincidencia (Nmero Seis).

(Flix N. Diego, Ziga C. Wladimir)

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 5
Salida F2: 000001000000000
Nueva Salida F1:
011111110000001000000100000001111100000001000000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,958333333333333
112

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 6
Salida F2: 000000100000000
Nueva Salida F1:
011111010000001000000100000001111100000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,958333333333333

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 3
Salida F2: 000100000000000
Nueva Salida F1:
011111010000000000000000000000011100000001000000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,75

113

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 10
Salida F2: 000000000010000
Nueva Salida F1:
000111000000000000000100000001111100000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,791666666666667

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 8
Salida F2: 000000001000000
Nueva Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 1

114

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 9
Salida F2: 000000000100000
Nueva Salida F1:
011111010000001000000100000001111100000001000000000000000111000
Coincidencia entre trama de salida y trama de entrada: 0,708333333333333

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 2
Salida F2: 001000000000000
Nueva Salida F1:
011111010000000000000000000001111100000000100000010000010111110
Coincidencia entre trama de salida y trama de entrada: 0,791666666666667

115

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 0
Salida F2: 100000000000000
Nueva Salida F1:
011111110000001000000100000000000000000001100000110000010111110
Coincidencia entre trama de salida y trama de entrada: 0,791666666666667

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 14
Salida F2: 000000000000001
Nueva Salida F1:
011111000000000000000000000000011100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,375

116

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 7
Salida F2: 000000010000000
Nueva Salida F1:
011111100000000000000000000000010000000000000000000000000010000
Coincidencia entre trama de salida y trama de entrada: 0,333333333333333

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 4
Salida F2: 000010000000000
Nueva Salida F1:
000000010000001000000100000001111100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,375

117

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 13
Salida F2: 000000000000010
Nueva Salida F1:
000011000000000000000000000001111100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,333333333333333

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 12
Salida F2: 000000000000100
Nueva Salida F1:
000000000000000000000000000000111100000000000000000000000000000
Coincidencia entre trama de salida y trama de entrada: 0,166666666666667

118

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 1
Salida F2: 010000000000000
Nueva Salida F1:
000100000000000000000100000000010000000000000000000000000001000
Coincidencia entre trama de salida y trama de entrada: 0,166666666666667

Vector de Entrada:
011111110000001000000100000001111100000001100000110000010111110
Salida F1:
011111110000001000000100000001111100000001100000110000010111110
Neurona Ganadora F2: 11
Salida F2: 000000000001000
Nueva Salida F1:
000001000000000000000000000000000100000000000000000000000000010
Coincidencia entre trama de salida y trama de entrada: 0,125

119

CAPITULO V

CONCLUSIONES Y RECOMENDACIONES

5.1 Conclusiones

El algoritmo ART1 reconoce y clasifica patrones binarios conservando tanto el


potencial de adaptacin a nuevas entradas, como el conocimiento previamente
aprendido de forma efectiva.

El nmero de pxeles del glyph en donde se ingresar el patrn a reconocer


determina el nmero de neuronas en la capa de entrada F1.

El nmero de neuronas en la capa competitiva F2 debe ser al menos igual al


nmero de patrones que se intenta clasificar. El nmero de patrones adicionales
que se quiere que aprenda la red determinar un nmero mayor de neuronas en
esta capa de almacenamiento.

Un valor ms cercano a uno de rho y un glyph de mayor tamao permiten


realizar una clasificacin ms estricta de los patrones. Esto se debe a que se
permite un mayor grado de tolerancia a cambios relacionndose directamente con
los dgitos de escritura libre.

120

El algoritmo ART1 no logra clasificar patrones idnticos en forma y tamao que


han sido desplazados dentro del glyph. De la misma forma, tampoco reconoce
patrones que representen a un patrn ya aprendido pero de diferente tamao.

5.2 Recomendaciones

Definir el nmero de neuronas en F2. incrementado en un 25% al nmero de


patrones a clasificar para permitir que la red aprenda patrones complementarios o
con variantes significativas en su forma.

Determinar un mtodo que

encuentre el valor de rho ptimo para el

reconocimiento, tal que, permita una clasificacin correcta de todos los patrones
a reconocer con su correspondiente asociado en forma y valor.

Utilizar la transformada de Fourier u otros mtodos similares que utilicen el


mdulo de los patrones y no su posicin con el fin de complementar la
funcionalidad de ART1 en el reconocimiento de patrones desplazados.

Realizar estudios similares a este en los cuales se analicen las variantes de la


Teora de Resonancia Adaptativa (ART2, ARTMAP) con el fin de ampliar el
reconocimiento a patrones no binarios.

121

FUENTES

LIBROS

CARPENTER Gail A., GROSSBERG Stephen, The ART of Adaptive Pattern


Recognition by a Self-Organizing Neural Network, v.21 n.3, p.77-88, Marzo
1988.
FREEMAN J.A., SKAPURA D.M., Neural Networks: Algorithms, Applications,
and Programming Techniques, Addison Wesley Publishing Company, 1991
KANDELL Abraham, Fuzzy Expert Systems, CRC Press, CRC Press LLC, 1991
KRSE Ben, VAN DER SMAGT Patrick, An Introduction to Neural Networks,
Universiteit van Amsterdam, Noviembre 1996.
PRESS W.H., FLANNERY, B.P., Numerical Recipies: The Art of Scientific
Computing, Cambridge University Press, 1986.
RAO Valluru B., C++ Neural Networks and Fuzzy Logic, M&T Books, IDG
Books Worldwide, Inc., 1995.

122

PAPERS

CARPENTER G.A., GROSSBERG S., A Massively Parallel Architecture for a SelfOrganizing Neural Pattern Recognition Machine, Computer Vision, Graphics,
and Image Processing, 1987.
CARPENTER G.A., GROSSBERG S., ART2: Stable Self-Organization of Pattern
Recognition Codes for Analog Input Patterns, Applied Optics, 1987.
CARPENTER G.A., Distributed Learning, Recognition, and Prediction by ART and
ARTMAP Neural Networks, Neural Networks, 1997.
LIPPMANN r.p., An Introduction to Computing with Neural Nets, IEEE
Transactions on Acoustics, Speech, and Signal Processing, 1987.

INTERNET

http://ailab.ch/teaching/classes/2004ss/nn/Lecture_on_ART.pdf
http://www.cs.brandeis.edu/~cs113/docs/other/heins_tauritz.pdf
http://profusion.bu.edu/techlab/modules/xoopsfaq/index.php?cat_id=1
http://www.gui.uva.es/login/13/redesn.html
http://www.gui.uva.es/login/13/redesn.html
http://www.sav.us.es/formaciononline/asignaturas/asigpid/apartados/textos/recursos/r
edesneuronales/PIRN.htm
http://www.uta.edu/psychology/faculty/levine/EBOOK/ART_networks.pdf
http://cns.bu.edu/Profiles/Grossberg/CarGro2003HBTNN2.pdf

123

http://www.cs.brandeis.edu/~cs113/docs/other/heins_tauritz.pdf
http://ailab.ch/teaching/classes/2004ss/nn/Lecture_on_ART.pdf
http://www.it.uom.gr/pdp/DigitalLib/Neural/Neu_soft.htm
http://www-ra.informatik.uni-tuebingen.de/SNNS/

124

ANEXOS

ANEXO 1 Cdigo Fuente de la Implementacin del Algoritmo ART1 en C++.

ANEXO 2 Cdigo Fuente de la Implementacin del Algoritmo ART1 en


Delphi.

125

ANEXO 1
Cdigo Fuente de la Implementacin del Algoritmo ART1 en C++.
# include <conio.h>
# include <iostream.h>
# include <math.h>
struct capaF1{
float *salida;
float *peso;
};
struct capaF2{
float *salida;
float *peso;
};
struct ART1{
capaF1 *F1;
capaF2 *F2;
float A1;
float B1;
float C1;
float D1;
float L;
float ro;
int GF2;
float INH[];
float modX;
};
//-------------------------FUNCIONES--------------capaF1* crearF1 ( int cM, int cN){
capaF1 *crea;
crea = new capaF1;
crea->salida=new float[cM];
crea->peso=new float[cM*cN];
MxN
return(crea);
}

//matriz

capaF2* crearF2 ( int cN, int cM){


capaF2 *crea;
crea = new capaF2;

126

NxM
}

crea->salida=new float[cN];
crea->peso=new float[cN*cM];

//matriz

return(crea);

ART1* crearRed ( capaF1 *cF1, capaF2 *cF2, float cA1,


float cB1,
float cC1, float cD1, float cL, float
cro, float cINH[ ]){
ART1 *crea;
crea = new ART1;
crea->F1=cF1;
crea->F2=cF2;
crea->A1=cA1;
crea->B1=cB1;
crea->C1=cC1;
crea->D1=cD1;
crea->L=cL;
crea->ro=cro;
crea->GF2=-100;
for (int i=0 ; i<sizeof(cINH)/sizeof(cINH[0]); i++)
crea->INH[i]=cINH[i];
crea->modX=-100;
return (crea);
}
void eliminarInhibicion(ART1 *eART1, int eN){
for (int i=0 ; i<eN ; i++)
eART1->INH[i]=1;
}
void inicPesos(ART1 *iART1, int iN, int iM, float iB1,
float iD1, float iL){
int indiceF1=0;
int indiceF2=0;
int nodoF1=0;
int nodoF2=0;
//----Inicializar pesos F1
do{
for (int i=0; i<iN; i++){
iART1->F1->peso[indiceF1]=((iB11)/iD1)+0.2;
indiceF1++;
}
nodoF1++;

127

}
while (nodoF1<iM);
//----Inicializar pesos F2
do{
for (int j=0; j<iM; j++){
iART1->F2->peso[indiceF2]=(iL/(iL1+iM))-0.1;
indiceF2++;
}
nodoF2++;
}
while (nodoF2<iN);
}
void propagarF1 (ART1 *pART1, float *pvectorEntrada, int
iM){
float *unidadSalida;
unidadSalida=pART1->F1->salida;
for (int i =0; i<iM; i++){
unidadSalida[i]=pvectorEntrada[i]/(1 +
pART1->A1 * (pvectorEntrada[i] + pART1->B1) + pART1->C1);
if (unidadSalida[i] > 0)
unidadSalida[i]=1;
else
unidadSalida[i]=0;
}
}
void propagarF2 (ART1 *pART1, int pN, int pM){
float *unidadSalida;
//salida F2
float *unidadEntrada;
//salida F1
float conexionesaF2;
float mayor;
int ganadora;
float suma;
int indiceF2;
int nodoF2;
unidadSalida=pART1->F2->salida;
unidadEntrada=pART1->F1->salida;
mayor=-100;
indiceF2=0;
nodoF2=0;
for (int i=0; i<pN; i++)
unidadSalida[i]=0;
cout<<"\nEntradas netas a unidades F2\n";
do{

128

suma=0;
for (int j=0; j<pM; j++){
conexionesaF2=pART1->F2->peso[indiceF2];
suma= suma + (unidadEntrada[j] *
conexionesaF2);
indiceF2++;
}
suma=suma*pART1->INH[nodoF2];
if(suma > mayor && pART1->INH[nodoF2]==1){
ganadora=nodoF2;
mayor=suma;
};
cout<<" "<<suma;
nodoF2++;
}
while (nodoF2<pN);
cout<<"\nGANADORA F2:"<<ganadora<<"\n";

unidadSalida[ganadora]=1;
pART1->GF2 = ganadora;
getch();

void propagacionVueltaF1(ART1 *pART1, float


*pvectorEntrada, int pM, int pN){
int ganadora;
float* unidadDeF1;
float conexionesaF1;
float nuevaEntrada;
//X
float pesoDeConexion;
//Vi
int indiceGanadora;
unidadDeF1=pART1->F1->salida;
ganadora=pART1->GF2;
indiceGanadora= ganadora;
for (int i=0 ; i< pM; i++){
conexionesaF1=pART1->F1->peso[indiceGanadora];
pesoDeConexion=conexionesaF1;
nuevaEntrada=(pvectorEntrada[i] + (pART1->D1 *
pesoDeConexion) - pART1->B1)/ (1 + (pART1->A1 *
(pvectorEntrada[i] + (pART1->D1 *
pesoDeConexion))) + pART1->C1);
if(nuevaEntrada > 0)
unidadDeF1[i]=1;
else
unidadDeF1[i]=0;

129

indiceGanadora=indiceGanadora+pN;
}

float coincidencia(ART1 *cART1, float *cvectorEntrada,


int cM){
float *unidadF1;
float modPlantilla;
//moduloX
float modEntrada;
//moduloI
unidadF1=cART1->F1->salida;
modPlantilla=0;
modEntrada=0;
for (int i=0; i<cM ;i++){
modPlantilla=modPlantilla+unidadF1[i];
modEntrada=modEntrada+cvectorEntrada[i];
}

cART1->modX=modPlantilla;
return(modPlantilla/modEntrada);

void actualizar (ART1 *aART1, int aM, int aN){


int ganadoraF2;
float *unidadSalida;
float *conexiones;
float *entradasF2;
int indiceGanadora;
ganadoraF2= aART1->GF2;
conexiones= aART1->F2->peso;
entradasF2=aART1->F1->salida;
indiceGanadora=ganadoraF2*aM;
for(int i=0 ; i<aM ; i++){
conexiones[indiceGanadora]=(aART1->L / (aART1>L - 1 +
aART1->modX))*entradasF2[i];
indiceGanadora++;
}
conexiones= aART1->F1->peso;
indiceGanadora=ganadoraF2;

for(i=0 ; i<aM ; i++){


conexiones[indiceGanadora]=entradasF2[i];
indiceGanadora=indiceGanadora+aN;
}

130

float procesar(ART1 *rART1, float *vectorEntrada, int M,


int N){
float coincide;
float *vectorINH;
vectorINH =new float[N];
propagarF1 (rART1, vectorEntrada, M);
propagarF2 (rART1, N, M);
propagacionVueltaF1(rART1, vectorEntrada, M, N);
//-- utilizo el vectorINH porque da problemas con memoria
//-- si no se usa ste vector, INH sale alterado y no se
manejan correctamente
//-- las inhibiciones de las neuronas
for(int k=0; k<N ;k++)
vectorINH[k]=rART1->INH[k];
coincide=coincidencia(rART1, vectorEntrada, M);
for(k=0; k<N ;k++)
rART1->INH[k]=vectorINH[k];
return(coincide);
}
float* coincidenciasMasCercanas (ART1 *pART1, float
*vectorEntrada, int pN, int pM){
float *unidadSalida;
//salida F2
float *unidadEntrada;
float conexionesaF2;
float suma;
float *vectorF2;
int indiceF2;
int nodoF2;
vectorF2=new float[pN];
indiceF2=0;
nodoF2=0;
cout<<"Entrada Neta F2:";
do{
suma=0;
for (int j=0; j<pM; j++){
conexionesaF2=pART1->F2->peso[indiceF2];
suma= suma + (vectorEntrada[j] *
conexionesaF2);
indiceF2++;

131

}
vectorF2[nodoF2]=suma;
cout<<" "<<suma;
nodoF2++;
}while (nodoF2<pN);
return(vectorF2);

void memoriaLlena(ART1 *rART1, float *vectorEntrada, int


M, int N){
float *coincidencias;
float mayor;
int indice;
coincidencias=new float [N];
mayor=-100;
indice=0;
cout<<"\n\nMEMORIA LLENA\n";
coincidencias=coincidenciasMasCercanas (rART1,
vectorEntrada ,N, M);
for(int i=0; i<N; i++)
if(coincidencias[i]>mayor)
mayor=coincidencias[i];
for(i=0; i<N; i++){
if(coincidencias[i]==mayor){
cout<<"\nTrama Parecida:";
indice=i;
for(int j=0; j<M; j++){
cout<<rART1->F1->peso[indice]<<"
";
indice=indice+N;
}
}
}
}
//------FUNCIONES PARA MOSTRAR POR PANTALLA----------void verPesos(ART1 *rART1, int M, int N){
//------PESOS F1-------int indiceF1=0;
int nodoF1=0;
cout<<"\nPESOS F1 ";
cout<<"\n---------\n";
do{
for (int K=0; K<N; K++){
cout<<rART1->F1->peso[indiceF1]<<"
";

132

indiceF1++;
}
cout<<"\n";
nodoF1++;

}
while (nodoF1<M);
//------- PESOS F2------int indiceF2=0;
int nodoF2=0;
cout<<"\nPESOS F2";
cout<<"\n---------\n";
do{
for (int K=0; K<M; K++){
cout<<rART1->F2->peso[indiceF2]<<"
";
indiceF2++;
}
cout<<"\n";
nodoF2++;
}
while (nodoF2<N);
}
void informacion (ART1 *rART1, int M, int N, int
coincide){
cout<<"\n";
cout<<"\nPropaga F1: salida= ";
for (int k=0; k<M; k++)
cout<<rART1->F1->salida[k]<<"
";
cout<<"\nPropaga F2: salida= ";
for (k=0; k<N; k++)
cout<<rART1->F2->salida[k]<<"

";

cout<<"\nPropagaRegreso F1: salida= ";


for (k=0; k<M; k++)
cout<<rART1->F1->salida[k]<<"
";
cout<<"\nCoincidencia= "<<coincide;
}
//---------------------------MAIN-----------------void main (){

F2

int M;
int N;

// #neuronas F1
// # neuronas

133

float A1;
float B1;
float C1;
float D1;
float L;
float ro;
float
*INH;
float *vectorEntrada;
// definir vector de entrada solo para admitir M
float coincide;
int opcion;
capaF1 *F1;
capaF2 *F2;
ART1 *rART1;
do{
clrscr();
cout<<"\n
---MENU---";
cout<<"\n\n 1.Ingreso Par metros";
cout<<"\n 2.Inicializar";
cout<<"\n 3.Ingresar Entrada";
cout<<"\n 4.Procesar";
cout<<"\n 5.Salir";
cout<<"\n\n
Opcin:";
cin>>opcion;
switch (opcion) {
case 1:
clrscr();
cout<<"M="; cin>>M;
// #
neuronas F1
cout<<"N="; cin>>N;
// #
neuronas F2
cout<<"A1="; cin>>A1;
cout<<"B1="; cin>>B1;
cout<<"C1="; cin>>C1;
cout<<"D1="; cin>>D1;
cout<<"L="; cin>>L;
cout<<"ro="; cin>>ro;
INH=new float [N];
eliminarInhibicion(rART1, N);
break;
case 2:
clrscr();
F1= crearF1 (M, N);
F2= crearF2 (N, M);

134

rART1=crearRed (F1, F2, A1, B1,

C1, D1,

L, ro, INH);
inicPesos(rART1, N, M, B1, D1, L);
cout<<"PESOS INICIALES:\n";
verPesos(rART1, M, N);
getch();
break;
case 3:
clrscr();
vectorEntrada=new float[M];
for (int i=0; i<M; i++){
cout<<"\nElemento ["<<i<<"]:";
cin>>vectorEntrada[i];
}
break;
case 4:
clrscr();
cout<<"\n PESOS INICIALES:\n";
verPesos(rART1, M, N);
getch();
int finalizado;
int intentos;
finalizado=0;
intentos=0;
//-- utilizo el auxVectorEntrada porque da problemas con
memoria
//-- si no se usa este vector, el vectorEntrada original
sale alterado
//-- slo para la 1era iteracin
float *auxVectorEntrada;
auxVectorEntrada=new float[N];
for (i=0; i<M; i++)
auxVectorEntrada[i]=vectorEntrada[i];
eliminarInhibicion(rART1, N);
for (i=0; i<M; i++)
vectorEntrada[i]=auxVectorEntrada[i];

135

//---por manejo de memoria presenta problemas nicamente


para la primera
//---iteracin con respecto a la reinicializacin del
vector INH
cout<<"\n vectorentrada:";
for (i=0; i<M; i++)
cout<<" "<<vectorEntrada[i];
getch();
cout<<"\n vectorINH:";
for (i=0; i<N; i++)
cout<<" "<<rART1->INH[i];
getch();
while (finalizado==0 && intentos<N){
;

coincide=procesar(rART1,vectorEntrada,M,N)

if(coincide < rART1->ro){


// no coincide
rART1->INH[rART1->GF2]=0;
intentos++;
}
else{
cout<<"\n\n La entrada puede ser
clasificada dentro del patron: ";
for(int i=0; i<M; i++)
cout<<rART1->F1->salida[i]<<" ";
cout<<"\n\n";
finalizado=1;
}
}
if(finalizado==1)
actualizar (rART1, M, N);
//actualizar la red;
if(intentos > N-1)
memoriaLlena(rART1, vectorEntrada, M,
N);
getch();
//-------------------SALIDAS POR PANTALLA
informacion (rART1, M, N, coincide);
cout<<"\n\nPESOS FINALES:\n";
verPesos(rART1, M, N);
getch();

136

break;
case 5:
clrscr();
break;
default:
clrscr();
cout<<"\n No Valido!\n";
}
}while (opcion != 5);
}

137

ANEXO 2
Cdigo Fuente de la Implementacin del Algoritmo ART1 en Delphi.
Unidad Principal
unit undPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, Menus, CustomizeDlg, StdCtrls, ToolWin,
ActnMan, ActnCtrls,
Buttons, ComCtrls, ExtCtrls, ActnList, StdActns,
ActnColorMaps, jpeg;
type capaF1 = record
salida: array of Real;
peso: array of array of Real;
end;
type capaF2 = record
salida: array of Real;
peso: array of array of Real;
end;
type ART1 = record
F1 :capaF1;
F2 :capaF2;
A1 :Real;
B1 :Real;
C1 :Real;
D1 :Real;
L :Real;
rho :Real;
GF2: Integer;
INH :array of Real;
modX :Real;
end;
type entrada = record
neurona: array of Real;
end;
type

138

TART1Lab = class(TForm)
MainMenu1: TMainMenu;
MAyuda: TMenuItem;
MArchivo: TMenuItem;
MASalir: TMenuItem;
N2: TMenuItem;
MAGuardar: TMenuItem;
MAAbrir: TMenuItem;
MANuevo: TMenuItem;
PCInterfaz: TPageControl;
TabSimulador: TTabSheet;
LGlyphCodificado: TLabel;
LProcesamiento: TLabel;
PnGlyph: TPanel;
LbM: TLabel;
LbA1: TLabel;
LbB1: TLabel;
LbC1: TLabel;
LbD1: TLabel;
LbL: TLabel;
Lbrho: TLabel;
LbN: TLabel;
LTextA1: TLabel;
LTextB1: TLabel;
LTextC1: TLabel;
LTextD1: TLabel;
LTextL: TLabel;
LTextrho: TLabel;
LTextN: TLabel;
LTextM: TLabel;
PBGlyph: TPaintBox;
TBSimulador: TToolBar;
BtnParametros: TBitBtn;
BtnCrearRed: TBitBtn;
BtnEjecutar: TBitBtn;
MGlyphCodificado: TMemo;
MProcesamiento: TMemo;
LResultados: TLabel;
CuadroSaveDialog: TSaveDialog;
CuadroOpenDialog: TOpenDialog;
ActionList1: TActionList;
FileExit1: TFileExit;
IGlyph: TImage;
TabArquitectura: TTabSheet;
IArquitectura: TImage;
CBResultados: TComboBox;
PMostrarGlyph: TPanel;
PBResultado: TPaintBox;

139

BMostrarResulado: TButton;
LInfResultado: TLabel;
BLimpiarGlyph: TButton;
procedure ActionToolBar1Click(Sender: TObject);
procedure BtnParametrosClick(Sender: TObject);
procedure BtnCrearRedClick(Sender: TObject);
procedure BtnEjecutarClick(Sender: TObject);
procedure PBGlyphMouseDown(Sender: TObject; Button:
TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MAGuardarClick(Sender: TObject);
procedure MAAbrirClick(Sender: TObject);
procedure MANuevoClick(Sender: TObject);
procedure BMostrarResuladoClick(Sender: TObject);
procedure BLimpiarGlyphClick(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
M:Integer;
N:Integer;
A1:Real;
B1:Real;
C1:Real;
D1:Real;
L:Real;
rho:Real;
INH: array of Real;
coincide: Real;
F1: capaF1;
F2: capaF2;
rART1: ART1;
vectorEntrada : entrada;
glyphCodificado:String;
end;
var
ART1Lab: TART1Lab;
implementation
uses undParametros;
{$R *.dfm}
procedure TART1Lab.ActionToolBar1Click(Sender: TObject);
type

140

Button1= TButton;
begin
Button1.Create(Application);
end;
//------------------------------------------------------------------------------// Funcin para el glyph
function pintarglyph35(PBGlyph: TPaintBox; PX,PY:
Integer; Inicial: Boolean):TPaintBox;
begin
if (PBGlyph.Canvas.Pixels[PX,PY] = clWhite)then
PBGlyph.Canvas.Brush.Color := clFuchsia
else
PBGlyph.Canvas.Brush.Color := clWhite;
if (Inicial = true) then
PBGlyph.Canvas.Brush.Color := clWhite;
//primera fila
if((PX>0) and (PX<32) and (PY>0) and (PY<34))then
PBGlyph.Canvas.Rectangle(0,0,33,35);
if((PX>32) and (PX<64) and (PY>0) and (PY<34))then
PBGlyph.Canvas.Rectangle(32,0,65,35);
if((PX>64) and (PX<96) and (PY>0) and (PY<34))then
PBGlyph.Canvas.Rectangle(64,0,97,35);
if((PX>96) and (PX<128) and (PY>0) and (PY<34))then
PBGlyph.Canvas.Rectangle(96,0,129,35);
if((PX>128) and (PX<159) and (PY>0) and (PY<34))then
PBGlyph.Canvas.Rectangle(128,0,160,35);
//segunda fila
if((PX>0) and (PX<32) and (PY>34) and (PY<68))then
PBGlyph.Canvas.Rectangle(0,34,33,69);
if((PX>32) and (PX<64) and (PY>34) and (PY<68))then
PBGlyph.Canvas.Rectangle(32,34,65,69);
if((PX>64) and (PX<96) and (PY>34) and (PY<68))then
PBGlyph.Canvas.Rectangle(64,34,97,69);
if((PX>96) and (PX<128) and (PY>34) and (PY<68))then
PBGlyph.Canvas.Rectangle(96,34,129,69);
if((PX>128) and (PX<159) and (PY>34) and (PY<68))then
PBGlyph.Canvas.Rectangle(128,34,160,69);
//tercera fila
if((PX>0) and (PX<32) and (PY>68) and (PY<102))then
PBGlyph.Canvas.Rectangle(0,68,33,103);
if((PX>32) and (PX<64) and (PY>68) and (PY<102))then
PBGlyph.Canvas.Rectangle(32,68,65,103);

141

if((PX>64) and (PX<96) and (PY>68) and (PY<102))then


PBGlyph.Canvas.Rectangle(64,68,97,103);
if((PX>96) and (PX<128) and (PY>68) and (PY<102))then
PBGlyph.Canvas.Rectangle(96,68,129,103);
if((PX>128) and (PX<159) and (PY>68) and (PY<102))then
PBGlyph.Canvas.Rectangle(128,68,160,103);
//cuarta fila
if((PX>0) and (PX<32) and (PY>102) and (PY<136))then
PBGlyph.Canvas.Rectangle(0,102,33,137);
if((PX>32) and (PX<64) and (PY>102) and (PY<136))then
PBGlyph.Canvas.Rectangle(32,102,65,137);
if((PX>64) and (PX<96) and (PY>102) and (PY<136))then
PBGlyph.Canvas.Rectangle(64,102,97,137);
if((PX>96) and (PX<128) and (PY>102) and (PY<136))then
PBGlyph.Canvas.Rectangle(96,102,129,137);
if((PX>128) and (PX<159) and (PY>102) and (PY<136))then
PBGlyph.Canvas.Rectangle(128,102,160,137);
//quinta fila
if((PX>0) and (PX<32) and (PY>136) and (PY<170))then
PBGlyph.Canvas.Rectangle(0,136,33,171);
if((PX>32) and (PX<64) and (PY>136) and (PY<170))then
PBGlyph.Canvas.Rectangle(32,136,65,171);
if((PX>64) and (PX<96) and (PY>136) and (PY<170))then
PBGlyph.Canvas.Rectangle(64,136,97,171);
if((PX>96) and (PX<128) and (PY>136) and (PY<170))then
PBGlyph.Canvas.Rectangle(96,136,129,171);
if((PX>128) and (PX<159) and (PY>136) and (PY<170))then
PBGlyph.Canvas.Rectangle(128,136,160,171);
//sexta fila
if((PX>0) and (PX<32) and (PY>171) and (PY<204))then
PBGlyph.Canvas.Rectangle(0,170,33,205);
if((PX>32) and (PX<64) and (PY>171) and (PY<204))then
PBGlyph.Canvas.Rectangle(32,170,65,205);
if((PX>64) and (PX<96) and (PY>171) and (PY<204))then
PBGlyph.Canvas.Rectangle(64,170,97,205);
if((PX>96) and (PX<128) and (PY>171) and (PY<204))then
PBGlyph.Canvas.Rectangle(96,170,129,205);
if((PX>128) and (PX<159) and (PY>171) and (PY<204))then
PBGlyph.Canvas.Rectangle(128,170,160,205);
//septima fila
if((PX>0) and (PX<32) and (PY>204) and (PY<238))then
PBGlyph.Canvas.Rectangle(0,204,33,238);
if((PX>32) and (PX<64) and (PY>204) and (PY<238))then
PBGlyph.Canvas.Rectangle(32,204,65,238);
if((PX>64) and (PX<96) and (PY>204) and (PY<238))then
PBGlyph.Canvas.Rectangle(64,204,97,238);
if((PX>96) and (PX<128) and (PY>204) and (PY<238))then
PBGlyph.Canvas.Rectangle(96,204,129,238);

142

if((PX>128) and (PX<159) and (PY>204) and (PY<238))then


PBGlyph.Canvas.Rectangle(128,204,160,238);
Result:=PBGlyph;
end;
function pintarglyph63(PBGlyph: TPaintBox; PX,PY:
Integer; Inicial: Boolean):TPaintBox;
begin
if (PBGlyph.Canvas.Pixels[PX,PY] = clWhite)then
PBGlyph.Canvas.Brush.Color := clFuchsia
else
PBGlyph.Canvas.Brush.Color := clWhite;
if (Inicial = true) then
PBGlyph.Canvas.Brush.Color := clWhite;
//primera fila
if((PX>0) and (PX<23) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(0,0,24,28);
if((PX>23) and (PX<46) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(23,0,47,28);
if((PX>46) and (PX<69) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(46,0,70,28);
if((PX>69) and (PX<92) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(69,0,93,28);
if((PX>92) and (PX<115) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(92,0,116,28);
if((PX>115) and (PX<138) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(115,0,139,28);
if((PX>138) and (PX<159) and (PY>0) and (PY<27))then
PBGlyph.Canvas.Rectangle(138,0,160,28);
//segunda fila
if((PX>0) and (PX<23) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(0,27,24,55);
if((PX>23) and (PX<46) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(23,27,47,55);
if((PX>46) and (PX<69) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(46,27,70,55);
if((PX>69) and (PX<92) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(69,27,93,55);
if((PX>92) and (PX<115) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(92,27,116,55);
if((PX>115) and (PX<138) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(115,27,139,55);
if((PX>138) and (PX<159) and (PY>28) and (PY<55))then
PBGlyph.Canvas.Rectangle(138,27,160,55);
//tercera fila
if((PX>0) and (PX<23) and (PY>55) and (PY<82))then

143

PBGlyph.Canvas.Rectangle(0,54,24,82);
if((PX>23) and (PX<46) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(23,54,47,82);
if((PX>46) and (PX<69) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(46,54,70,82);
if((PX>69) and (PX<92) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(69,54,93,82);
if((PX>92) and (PX<115) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(92,54,116,82);
if((PX>115) and (PX<138) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(115,54,139,82);
if((PX>138) and (PX<159) and (PY>55) and (PY<82))then
PBGlyph.Canvas.Rectangle(138,54,160,82);
//cuarta fila
if((PX>0) and (PX<23) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(0,81,24,109);
if((PX>23) and (PX<46) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(23,81,47,109);
if((PX>46) and (PX<69) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(46,81,70,109);
if((PX>69) and (PX<92) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(69,81,93,109);
if((PX>92) and (PX<115) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(92,81,116,109);
if((PX>115) and (PX<138) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(115,81,139,109);
if((PX>138) and (PX<159) and (PY>81) and (PY<109))then
PBGlyph.Canvas.Rectangle(138,81,160,109);
//quinta fila
if((PX>0) and (PX<23) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(0,108,24,136);
if((PX>23) and (PX<46) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(23,108,47,136);
if((PX>46) and (PX<69) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(46,108,70,136);
if((PX>69) and (PX<92) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(69,108,93,136);
if((PX>92) and (PX<115) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(92,108,116,136);
if((PX>115) and (PX<138) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(115,108,139,136);
if((PX>138) and (PX<159) and (PY>108) and (PY<135))then
PBGlyph.Canvas.Rectangle(138,108,160,136);
//sexta fila
if((PX>0) and (PX<23) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(0,135,24,163);
if((PX>23) and (PX<46) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(23,135,47,163);

144

if((PX>46) and (PX<69) and (PY>135) and (PY<162))then


PBGlyph.Canvas.Rectangle(46,135,70,163);
if((PX>69) and (PX<92) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(69,135,93,163);
if((PX>92) and (PX<115) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(92,135,116,163);
if((PX>115) and (PX<138) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(115,135,139,163);
if((PX>138) and (PX<159) and (PY>135) and (PY<162))then
PBGlyph.Canvas.Rectangle(138,135,160,163);
//septima fila
if((PX>0) and (PX<23) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(0,162,24,190);
if((PX>23) and (PX<46) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(23,162,47,190);
if((PX>46) and (PX<69) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(46,162,70,190);
if((PX>69) and (PX<92) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(69,162,93,190);
if((PX>92) and (PX<115) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(92,162,116,190);
if((PX>115) and (PX<138) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(115,162,139,190);
if((PX>138) and (PX<159) and (PY>162) and (PY<190))then
PBGlyph.Canvas.Rectangle(138,162,160,190);
//octava fila
if((PX>0) and (PX<23) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(0,189,24,217);
if((PX>23) and (PX<46) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(23,189,47,217);
if((PX>46) and (PX<69) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(46,189,70,217);
if((PX>69) and (PX<92) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(69,189,93,217);
if((PX>92) and (PX<115) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(92,189,116,217);
if((PX>115) and (PX<138) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(115,189,139,217);
if((PX>138) and (PX<159) and (PY>189) and (PY<216))then
PBGlyph.Canvas.Rectangle(138,189,160,217);
//novena fila
if((PX>0) and (PX<23) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(0,216,24,238);
if((PX>23) and (PX<46) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(23,216,47,238);
if((PX>46) and (PX<69) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(46,216,70,238);
if((PX>69) and (PX<92) and (PY>216) and (PY<238))then

145

PBGlyph.Canvas.Rectangle(69,216,93,238);
if((PX>92) and (PX<115) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(92,216,116,238);
if((PX>115) and (PX<138) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(115,216,139,238);
if((PX>138) and (PX<159) and (PY>216) and (PY<238))then
PBGlyph.Canvas.Rectangle(138,216,160,238);
Result:=PBGlyph;
end;
function codificarGlyph35(PBGlyph: TPaintBox):String;
var codificacion:String;
PX:Integer;
PY:Integer;
begin
codificacion:='';
PY:=20;
repeat
PX:=20;
repeat
if (PBGlyph.Canvas.Pixels[PX,PY] = clWhite)then
codificacion:=codificacion+'0'
else
codificacion:=codificacion+'1';
PX:=PX+30;
until PX>140;
PY:=PY+35;
until PY>230;
Result:=codificacion;
end;
function codificarGlyph63(PBGlyph: TPaintBox):String;
var codificacion:String;
PX:Integer;
PY:Integer;
begin
codificacion:='';
PY:=20;
repeat
PX:=20;
repeat
if (PBGlyph.Canvas.Pixels[PX,PY] = clWhite)then
codificacion:=codificacion+'0'
else
codificacion:=codificacion+'1';
PX:=PX+20;
until PX>140;
PY:=PY+25;

146

until PY>220;
Result:=codificacion;
end;
function construirGlyph35(PBGlyph: TPaintBox): TPaintBox;
var PX:Integer;
PY:Integer;
begin
PY:=20;
repeat
PX:=20;
repeat
pintarglyph35(PBGlyph, PX, PY, true);
PX:=PX+30;
until PX>140;
PY:=PY+35;
until PY>230;
Result:=PBGlyph;
end;
function construirGlyph63(PBGlyph: TPaintBox): TPaintBox;
var PX:Integer;
PY:Integer;
begin
PY:=20;
repeat
PX:=20;
repeat
pintarglyph63(PBGlyph, PX, PY, true);
PX:=PX+20;
until PX>140;
PY:=PY+25;
until PY>236;
Result:=PBGlyph;
end;
function decodificarGlyph (PBGlyph: TPaintBox; m:
Integer; textoCodificado:String) :TPaintBox;
var x:Integer;
y:Integer;
sumax:Integer;
sumay:Integer;
cuadro:Integer;
filas:Integer;
i:Integer;
caracter:String[63];

147

begin
caracter:=textoCodificado;
if m=35 then
begin
sumax:=32;
sumay:=34;
filas:=7;
end
else
begin
sumax:=23;
sumay:=27;
filas:=9;
end;
cuadro:=2;
y:=0;
i:=1;
repeat
begin
x:=0;
cuadro:=cuadro-1;
repeat
begin
if caracter[cuadro]= '1' then
PBGlyph.Canvas.Brush.Color := clFuchsia
else
PBGlyph.Canvas.Brush.Color := clWhite;
PBGlyph.Canvas.Rectangle(x,y,x+sumax+1,y+sumay+1);
x:=x+sumax;
cuadro:=cuadro+1;
end
until x>162;
y:=y+sumay;
i:=i+1
end
until i>filas;
PBGlyph.Canvas.Pen.Color:= clBlack;
PBGlyph.Canvas.Rectangle(159,0,165,238);
PBGlyph.Canvas.Rectangle(0,237,165,240);
Result:= PBGlyph;
end;
function decodificarResultado (PBResultado: TPaintBox; m:
Integer; textoCBResultados:String) :TPaintBox;
var x:Integer;

148

y:Integer;
sumax:Integer;
sumay:Integer;
cuadro:Integer;
filas:Integer;
i:Integer;
caracter:String[63];
begin
caracter:=textoCBResultados;
if m=35 then
begin
sumax:=14;
sumay:=13;
filas:=7;
end
else
begin
sumax:=10;
sumay:=10;
filas:=9;
end;
cuadro:=2;
y:=0;
i:=1;
repeat
begin
x:=0;
cuadro:=cuadro-1;
repeat
begin
if caracter[cuadro]= '1' then
PBResultado.Canvas.Brush.Color := clFuchsia
else
PBResultado.Canvas.Brush.Color := clWhite;
PBResultado.Canvas.Rectangle(x,y,x+sumax+1,y+sumay+1);
x:=x+sumax;
cuadro:=cuadro+1;
end
until x>71;
y:=y+sumay;
i:=i+1
end
until i>filas;

149

Result:=PBResultado;
end;
//Fin de Funcin de Glyph
//------------------------------------------------------------------------------procedure TART1Lab.BtnParametrosClick(Sender: TObject);
var frmp: TFrmParametros;
begin
frmp := TFrmParametros.Create(Application);
if((self.LTextM.Caption='') or
(self.LTextM.Caption='35'))then
frmp.CBM.ItemIndex:=0
else
frmp.CBM.ItemIndex:=1;
frmp.EN.Text:=self.LTextN.Caption;
frmp.EA1.Text:=self.LTextA1.Caption;
frmp.EB1.Text:=self.LTextB1.Caption;
frmp.EC1.Text:=self.LTextC1.Caption;
frmp.ED1.Text:=self.LTextD1.Caption;
frmp.EL.Text:=self.LTextL.Caption;
frmp.Erho.Text:=self.LTextrho.Caption;
if (frmp.ShowModal=mrOK) and(frmp.correcto = 1) then
begin
ShowMessage('Los parmetros han sido ingresados
de forma satisfactoria');
if(frmp.CBM.ItemIndex=0)then
self.LTextM.Caption:='35'
else
self.LTextM.Caption:='63';
self.LTextN.Caption:=frmp.EN.Text;
self.LTextA1.Caption:=frmp.EA1.Text;
self.LTextB1.Caption:=frmp.EB1.Text;
self.LTextC1.Caption:=frmp.EC1.Text;
self.LTextD1.Caption:=frmp.ED1.Text;
self.LTextL.Caption:=frmp.EL.Text;
self.LTextrho.Caption:=frmp.Erho.Text;
self.M :=StrToInt(self.LTextM.Caption);
self.N :=StrToInt(self.LTextN.Caption);
self.A1 :=StrToFloat(self.LTextA1.Caption);
self.B1 :=StrToFloat(self.LTextB1.Caption);
self.C1 :=StrToFloat(self.LTextC1.Caption);
self.D1 :=StrToFloat(self.LTextD1.Caption);

150

self.L :=StrToFloat(self.LTextL.Caption);
self.rho :=StrToFloat(self.LTextrho.Caption);
if self.M=35 then
self.PBGlyph:=construirGlyph35(PBGlyph)
else
self.PBGlyph:=construirGlyph63(PBGlyph);
self.BtnCrearRed.Enabled:=true;
self.BtnParametros.Enabled:=false;
end;
frmp.free;
end;
function crearF1(M,N : Integer): capaF1;
var crea : capaF1;
i,j : Integer;
begin
SetLength(crea.salida, M);
SetLength(crea.peso, M);
for i:= Low(crea.peso) to High(crea.peso) do
begin
SetLength(crea.peso[i],N);
for j:= Low(crea.peso[i])to High(crea.peso[i])do
crea.peso[i,j]:=0;
end;
Result:=crea;
end;
function crearF2(N,M : Integer): capaF2;
var crea : capaF2;
i,j : Integer;
begin
SetLength(crea.salida, N);
SetLength(crea.peso, N);
for i:= Low(crea.peso) to High(crea.peso) do
begin
SetLength(crea.peso[i],M);
for j:= Low(crea.peso[i])to High(crea.peso[i])do
crea.peso[i,j]:=0;
end;
Result:=crea;
end;
function crearRed(F1: capaF1; F2: capaF2;
A1,B1,C1,D1,L,rho: Real; N: Integer): ART1;
var crea : ART1;
i:Integer;
begin
crea.F1:=F1;

151

crea.F2:=F2;
crea.A1:=A1;
crea.B1:=B1;
crea.C1:=C1;
crea.D1:=D1;
crea.L:=L;
crea.rho:=rho;
crea.GF2:=-100;
SetLength(crea.INH, N);
for i:= Low(crea.INH)to High(crea.INH)do
crea.INH[i]:=1;
crea.modX:=-100;
Result:=crea;
end;
function inicializarPesos(rART1: ART1; B1,D1,L: Real;
M:Integer):ART1;
var i,j:Integer;
lalto,lbajo:Real;
begin
repeat
lalto:=Random ;
until (lalto<((B1-1)/D1)*0.6) AND (lalto>((B11)/D1)*0.1);
repeat
lbajo:=Random;
until (lbajo<(L/(L-1+M))*0.3) AND (lbajo>(L/(L1+M))*0.1);
for i:= Low(rART1.F1.peso)to High(rART1.F1.peso)do
for j:= Low(rART1.F2.peso)to High(rART1.F2.peso) do
rART1.F1.peso[i,j]:=((B1-1)/D1)+lalto;
for i:= Low(rART1.F2.peso)to High(rART1.F2.peso) do
for j:= Low(rART1.F1.peso)to High(rART1.F1.peso)do
rART1.F2.peso[i,j]:=(L/(L-1+M))-lbajo;
Result:=rART1;
end;
{imprimir pesos}
function mostrarPesos(rART1: ART1; MProcesamiento :
TMemo):TMemo;
var i,j:Integer;
begin
MProcesamiento.Lines.Add('');
MProcesamiento.Lines.Add('Pesos F1:');
MProcesamiento.Lines.Add('-----------------');

152

for i:= Low(rART1.F1.peso)to High(rART1.F1.peso) do


begin
for j:= Low(rART1.F2.peso)to High(rART1.F2.peso)do
MProcesamiento.Text:=MProcesamiento.Text +'
'+
FloatToStr(rART1.F1.peso[i,j]);
MProcesamiento.Lines.Add('');
end;
MProcesamiento.Lines.Add('');
MProcesamiento.Lines.Add('Pesos F2:');
MProcesamiento.Lines.Add('-----------------');
for i:= Low(rART1.F2.peso)to High(rART1.F2.peso) do
begin
for j:= Low(rART1.F1.peso)to High(rART1.F1.peso)do
MProcesamiento.Text:=MProcesamiento.Text +'
'
+FloatToStr(rART1.F2.peso[i,j]);
MProcesamiento.Lines.Add('');
end;
Result:=MProcesamiento;
end;
{toma valores del glyph en el vector de entrada}
function cargarVectorEntrada (MGlyphCodificado : TMemo;
vectorEntrada:entrada; M:Integer): entrada;
var ayuda :string;
i: Integer;
begin
SetLength(vectorEntrada.neurona, M);
ayuda:=Trim(MGlyphCodificado.Lines[MGlyphCodificado.Lines
.Count-1]);
for i:=0 to StrLen(PChar(string(ayuda)))-1 do
vectorEntrada.neurona[i]:=StrTofloat(ayuda[i+1]);
Result:=vectorEntrada;
end;
function propagarF1 (rART1:ART1; vectorEntrada :entrada)
:ART1;
var i: Integer;
begin
for i:=Low(rART1.F1.salida)to High(rART1.F1.salida)do
begin
rART1.F1.salida[i]:=vectorEntrada.neurona[i]/(1+rART1.A1*
(vectorEntrada.neurona[i]+rART1.B1)+rART1.C1);
if rART1.F1.salida[i]>0 then
rART1.F1.salida[i]:=1
else

153

rART1.F1.salida[i]:=0;
end;
Result:=rART1;
end;
function propagarF2 (rART1:ART1; M:Integer) :ART1;
var i,j: Integer;
ganadora: Integer;
mayor: Real;
suma:Real;
begin
ganadora:=0;
mayor:=-100;
for i:= Low(rART1.F2.salida)to High(rART1.F2.salida) do
rART1.F2.salida[i]:=0;
for i:= Low(rART1.F2.salida)to High(rART1.F2.salida) do
begin
suma:=0;
for j:=0 to M-1 do
suma:=suma+(rART1.F1.salida[j]*rART1.F2.peso[i,j]);
suma:=suma*rART1.INH[i];
if(suma>mayor) and (rART1.INH[i]=1) then
begin
ganadora:=i;
mayor:=suma;
end;
end;
rART1.F2.salida[ganadora]:=1;
rART1.GF2:=ganadora;
result:=rART1;
end;
function propagacionVuelta (rART1:ART1; vectorEntrada:
Entrada) :ART1;
var i:Integer;
nuevaEntrada: Real; //X
begin
for i:=Low(rART1.F1.salida)to High(rART1.F1.salida)do
begin
nuevaEntrada:=(vectorEntrada.neurona[i]+(rART1.D1*rART1.F
1.peso[i,rART1.GF2])rART1.B1)/(1+(rART1.A1*(vectorEntrada.neurona[i]+(rART1.D
1*rART1.F1.peso[i,rART1.GF2])))+rART1.C1);
if (nuevaEntrada >0) then
rART1.F1.salida[i]:=1
else

154

rART1.F1.salida[i]:=0;
end;
Result:=rART1;
end;
function moduloDeX (rART1:ART1; vectorEntrada:Entrada)
:ART1;
var i: Integer;
moduloX: Real;
begin
moduloX:=0;
for i:= Low(rART1.F1.salida)to High(rART1.F1.salida)do
begin
moduloX:=moduloX+rART1.F1.salida[i];
end;
rART1.modX:=moduloX;
Result:=rART1;
end;
function coincidencia (rART1: ART1; moduloX:Real;
vectorEntrada:Entrada) :Real;
var i: Integer;
moduloEntrada: Real;
begin
moduloEntrada:=0;
for i:= Low(rART1.F1.salida)to High(rART1.F1.salida)do
begin
moduloEntrada:=moduloEntrada+vectorEntrada.neurona[i];
end;
Result:=(moduloX/moduloEntrada);
end;
function actualizarPesos (rART1:ART1) :ART1;
var i: Integer;
begin
for i:= Low(rART1.F1.salida)to High(rART1.F1.salida)do
rART1.F2.peso[rART1.GF2,i]:=(rART1.L/(rART1.L1+rART1.modX))*rART1.F1.salida[i];
for i:= Low(rART1.F1.salida)to High(rART1.F1.salida)do
rART1.F1.peso[i,rART1.GF2]:=rART1.F1.salida[i];
Result:=rART1;
end;
function eliminarInhibicion (rART1:ART1) :ART1;
var i: Integer;
begin

155

for i:= Low(rART1.INH)to High(rART1.INH)do


rART1.INH[i]:=1;
Result:=rART1;
end;
function coincidenciasMasCercanas (rART1: ART1 ;
vectorEntrada:Entrada; CBResultados:TComboBox) :
TComboBox;
var suma,mayor:Real;
i,j,k : Integer;
vectorSumas: array of Real;
textoSalida: String;
begin
mayor:=-100;
k:=0;
rART1:=eliminarInhibicion(rART1);
SetLength(vectorSumas,(High(rART1.F2.salida)+1));
for i:= Low(rART1.F2.salida)to High(rART1.F2.salida)do
begin
suma:=0;
for j:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
suma:=suma+(vectorEntrada.neurona[j]*rART1.F2.peso[i,j]);
vectorSumas[k]:=suma;
k:=k+1;
end;
for i:= Low(rART1.F2.salida)to High(rART1.F2.salida)do
if vectorSumas[i]>mayor then
mayor:=vectorSumas[i];
for i:= Low(rART1.F2.salida)to High(rART1.F2.salida)do
if vectorSumas[i]=mayor then
begin
textoSalida:='';
for j:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
textoSalida:=textoSalida +
FloatTostr(rART1.F1.peso[j,i]);
CBResultados.Items.Add(textoSalida);
end;
CBResultados.Text:=CBResultados.Items.Strings[0];
Result:=CBResultados;
end;
procedure TART1Lab.BtnCrearRedClick(Sender: TObject);

156

begin
F1:=crearF1(M,N);
F2:=crearF2(N,M);
rART1:=crearRed(F1,F2,A1,B1,C1,D1,L,rho,N);
inicializarPesos(rART1, B1,D1,L,M);
MProcesamiento.Lines.Add('PESOS INICIALES:');
self.MProcesamiento:=mostrarPesos(rART1,self.MProcesamien
to);
self.BtnCrearRed.Enabled:=false;
self.BtnEjecutar.Enabled:=true;
self.BLimpiarGlyph.Enabled:=true;
end;
procedure TART1Lab.BtnEjecutarClick(Sender: TObject);
var i:Integer;
textoVectorEntrada: String;
textoSalidaF1: String;
textoSalidaF2: String;
textoNuevaSalidaF1:String;
textoTramaResultante:String;
resultadoCoincidencia:Real;
procesado: Integer;
intentos: Integer;
errorCodificacion: Boolean;
begin
if(self.M=35)then
glyphCodificado:=codificarGlyph35(self.PBGlyph);
if(self.M=63)then
glyphCodificado:=codificarGlyph63(self.PBGlyph);
errorCodificacion:= false;
if(self.M=35)then
if(glyphCodificado='00000000000000000000000000000000000')
then
begin
ShowMessage ('El glyph no puede estar vaco');
errorCodificacion:= true;
end;
if(self.M=63)then
if(glyphCodificado='0000000000000000000000000000000000000
00000000000000000000000000')then
begin
ShowMessage ('El glyph no puede estar vaco');
errorCodificacion:= true;

157

end;
if errorCodificacion= false then
begin
self.LInfResultado.Caption:=' ';
self.CBResultados.Clear;
self.CBResultados.Items.Clear;
if(self.M=35)then
self.MGlyphCodificado.Lines.Add(glyphCodificado)
else
self.MGlyphCodificado.Lines.Add(glyphCodificado);
SetLength(vectorEntrada.neurona,M);
self.MProcesamiento.Lines.Add('');
rART1:=eliminarInhibicion(rART1);
procesado:=0;
intentos:=0;
{El procesamiento inicia desde aqui}
while (procesado=0) and (intentos<N) do
begin
textoVectorEntrada:='';
textoSalidaF1:='';
textoSalidaF2:='';
textoNuevaSalidaF1:='';
self.MProcesamiento.Lines.Add('');
vectorEntrada:=cargarVectorEntrada
(self.MGlyphCodificado , vectorEntrada, M);
for i:= 0 to M-1 do
textoVectorEntrada:=textoVectorEntrada+FloatToStr(vectorE
ntrada.neurona[i]);
self.MProcesamiento.Lines.Add('Vector de Entrada:
'+ textoVectorEntrada);
rART1:=propagarF1 (rART1, vectorEntrada);
for i:= 0 to M-1 do
textoSalidaF1:=textoSalidaF1+FloatToStr(rART1.F1.salida[i
]);
self.MProcesamiento.Lines.Add('Salida F1: '+
textoSalidaF1);
rART1:=propagarF2 (rART1, M);

158

self.MProcesamiento.Lines.Add('Neurona Ganadora F2:


'+ FloatToStr(rART1.GF2));
for i:= 0 to N-1 do
textoSalidaF2:=textoSalidaF2+FloatToStr(rART1.F2.salida[i
]);
self.MProcesamiento.Lines.Add('Salida F2: '+
textoSalidaF2);
rART1:=propagacionVuelta (rART1, vectorEntrada);
for i:= 0 to M-1 do
textoNuevaSalidaF1:=textoNuevaSalidaF1+FloatToStr(rART1.F
1.salida[i]);
self.MProcesamiento.Lines.Add('Nueva Salida F1: '+
textoNuevaSalidaF1);
rART1:=moduloDeX (rART1, vectorEntrada);
resultadoCoincidencia:=coincidencia (rART1,
rART1.modX, vectorEntrada);
self.MProcesamiento.Lines.Add('Coincidencia entre
trama de salida y trama de entrada: '+
FloatToStr(resultadoCoincidencia));
{Fin del procesamiento}
{Si se encuentra la conicidencia se actualiza los pesos }
if(resultadoCoincidencia>rART1.rho) then
begin
rART1:=actualizarPesos (rART1);
for i:= Low(rART1.F1.peso)to
High(rART1.F1.peso)do
textoTramaResultante:=textoTramaResultante+
FloatToStr(rART1.F1.peso[i,rART1.GF2]);
MProcesamiento.Lines.Add('');
MProcesamiento.Lines.Add('NUEVOS PESOS:');
self.MProcesamiento:=mostrarPesos(rART1,self.MProcesamien
to);
self.CBResultados.Items.Add(textoTramaResultante);
self.CBResultados.Text:=textoTramaResultante;
//'ha sido clasificado');
procesado:=1;
end
else

159

begin
rART1.INH[rART1.GF2]:=0;
intentos:=intentos+1;
end;
{Fin de actualizacin de pesos}
end;
//('ha salido del proceso');
{proceso que inicia la trama con la que ha encontrado la
coincidencia}
if intentos>=N then
begin
self.LInfResultado.Font.Color:= ClRed;
self.LInfResultado.Caption:='Memoria Llena. No se
ha podido crear una nueva clasificacin los patrones ms
parecidos son: ';
self.CBResultados:=coincidenciasMasCercanas(rART1,vectorE
ntrada,self.CBResultados);
end
else
begin
self.LInfResultado.Font.Color:= ClGreen;
self.LInfResultado.Caption:='El patrn se encuentra
dentro de la siguiente clasificacin:';
end;
if(self.M=35)then
self.PBGlyph:=decodificarGlyph(self.PBGlyph,self.M,glyphC
odificado);
if(self.M=63)then
self.PBGlyph:=decodificarGlyph(self.PBGlyph,self.M,glyphC
odificado);
end;
end;
procedure TART1Lab.PBGlyphMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var PX: Integer;
PY: Integer;
begin
PX:=X;

160

PY:=Y;
if(self.M=35)then
PBGlyph:=pintarglyph35(PBGlyph,PX,PY,false);
if(self.M=63)then
PBGlyph:=pintarglyph63(PBGlyph,PX,PY,false);
end;
procedure TART1Lab.MAGuardarClick(Sender: TObject);
var
F: TextFile;
i,j: Integer;
begin
if cuadroSaveDialog.Execute then
begin
cuadroSaveDialog.Options :=
[ofAllowMultiSelect, ofFileMustExist];
cuadroSaveDialog.Filter := 'ART files
(*.art)|*.art'; {Delphi}
cuadroSaveDialog.FilterIndex := 2; { start the
dialog showing all files }
AssignFile(F, cuadroSaveDialog.Filename);
Rewrite(F);
Writeln(F,floatToStr(M));
Writeln(F,floatToStr(N));
Writeln(F,floatToStr(rART1.A1));
Writeln(F,floatToStr(rART1.B1));
Writeln(F,floatToStr(rART1.C1));
Writeln(F,floatToStr(rART1.D1));
Writeln(F,floatToStr(rART1.L));
Writeln(F,floatToStr(rART1.rho));
Writeln(F,floatToStr(rART1.GF2));
Writeln(F,floatToStr(rART1.modX));
for i:= Low(rART1.INH)to High(rART1.INH)do
Writeln(F,floatToStr(rART1.INH[i]));
for i:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
for j:= Low(rART1.F2.salida)to
High(rART1.F2.salida)do
Writeln(F,floatToStr(rART1.F1.peso[i,j]));
for i:= Low(rART1.F2.salida)to
High(rART1.F2.salida)do
for j:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
Writeln(F,floatToStr(rART1.F2.peso[i,j]));
CloseFile(F);
end;
end;

161

procedure TART1Lab.MAAbrirClick(Sender: TObject);


var
i,j,k: integer;
F: TextFile;
line: string;
begin
self.PBGlyph.Canvas.Pen.Color:= clBlack;
self.PBResultado.Canvas.Pen.Color:= clBlack;
self.MGlyphCodificado.Clear;
self.MProcesamiento.Clear;
self.CBResultados.Clear;
self.CBResultados.Items.Clear;
self.LInfResultado.Caption:='';
CuadroOpenDialog.Options := [ofAllowMultiSelect,
ofFileMustExist];
CuadroOpenDialog.Filter := 'Art files (*.art)|*.art';
CuadroOpenDialog.FilterIndex := 2;
if CuadroOpenDialog.Execute then
with CuadroOpenDialog.Files do
for i := 0 to Count - 1 do
begin
AssignFile(F, Strings[I]); Reset(F);
Readln(F, line); {lee la primera lnea del
archivo}
M:=strToInt(line);
LTextM.Caption:= line;
Readln(F, line);
N:=strToInt(line);
LTextN.Caption:= line;
Readln(F, line);
A1:=StrTofloat(line);
LTextA1.Caption:= line;
Readln(F, line);
B1:=StrTofloat(line);
LTextB1.Caption:= line;
Readln(F, line);
C1:=StrTofloat(line);
LTextC1.Caption:= line;
Readln(F, line);
D1:=StrTofloat(line);
LTextD1.Caption:= line;
Readln(F, line);
L:=StrTofloat(line);
LTextL.Caption:= line;
Readln(F, line);
rho:=StrTofloat(line);

162

if self.M=35 then
begin
self.PBGlyph:=construirGlyph35(PBGlyph);
PBResultado:=decodificarResultado(PBResult
ado,self.M,'');
end;
if self.M=63 then
begin
self.PBGlyph:=construirGlyph63(PBGlyph);
PBResultado:=decodificarResultado(PBResult
ado,self.M,'');
end;
F1:=crearF1(M,N);
F2:=crearF2(N,M);
rART1:=crearRed(F1,F2,A1,B1,C1,D1,L,rho,N);
LTextrho.Caption:= line;
Readln(F, line);
rART1.GF2:=StrToInt(line);
Readln(F, line);
rART1.modX:=StrTofloat(line);
for j:= Low(rART1.INH)to High(rART1.INH)do
begin
Readln(F,line);
rART1.INH[i]:=StrTofloat(line)
end;
for j:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
for k:= Low(rART1.F2.salida)to
High(rART1.F2.salida)do
begin
Readln(F,line);
rART1.F1.peso[j,k]:=StrTofloat(line);
end;
for j:= Low(rART1.F2.salida)to
High(rART1.F2.salida)do
for k:= Low(rART1.F1.salida)to
High(rART1.F1.salida)do
begin
Readln(F,line);
rART1.F2.peso[j,k]:=StrTofloat(line);
end;
CloseFile(F);

163

if self.M=35 then
glyphCodificado:=
'00000000000000000000000000000000000';
if self.M=63then
glyphCodificado:=
'0000000000000000000000000000000000000000000000
00000000000000000';
self.MProcesamiento:=mostrarPesos(rART1,self.MP
rocesamiento);
self.BtnParametros.Enabled:=false;
self.BtnCrearRed.Enabled:=false;
self.BtnEjecutar.Enabled:=true;
self.BLimpiarGlyph.Enabled:=true;
end;
end;
procedure TART1Lab.MANuevoClick(Sender: TObject);
begin
if self.M=35 then
glyphCodificado:=
'00000000000000000000000000000000000';
if self.M=63then
glyphCodificado:=
'000000000000000000000000000000000000000000000000000
000000000000';
self.PBGlyph.Canvas.Pen.Color:= clBtnFace;
self.PBGlyph.Canvas.Brush.Color:= clBtnFace;
self.PBGlyph.Canvas.Rectangle(0,0,160,238);
self.PBResultado.Canvas.Pen.Color:= clBtnFace;
self.PBResultado.Canvas.Brush.Color:= clBtnFace;
self.PBResultado.Canvas.Rectangle(0,0,160,238);
self.PBGlyph.Canvas.Pen.Color:= clBlack;
self.PBResultado.Canvas.Pen.Color:= clBlack;
self.MGlyphCodificado.Clear;
self.MProcesamiento.Clear;
self.CBResultados.Clear;
self.CBResultados.Items.Clear;
self.M:=0;
self.BtnEjecutar.Enabled:=false;
self.BLimpiarGlyph.Enabled:=false;
self.BtnParametros.Enabled:=true;
self.LTextM.Caption:='';
self.LTextN.Caption:='';
self.LTextA1.Caption:='';
self.LTextB1.Caption:='';
self.LTextC1.Caption:='';

164

self.LTextD1.Caption:='';
self.LTextL.Caption:='';
self.LTextrho.Caption:='';
self.LInfResultado.Caption:='';
end;
procedure TART1Lab.BMostrarResuladoClick(Sender:
TObject);
var textoCBResultados:String;
begin
if self.LTextM.Caption <> '' then
begin
textoCBResultados:=CBResultados.Text;
PBResultado:=decodificarResultado(PBResultado,self.M,text
oCBResultados);
end;
end;
procedure TART1Lab.BLimpiarGlyphClick(Sender: TObject);
begin
self.LInfResultado.Caption:='';
PBResultado:=decodificarResultado(PBResultado,self.M,'');
self.CBResultados.Clear;
if self.M=35 then
begin
self.PBGlyph:=construirGlyph35(PBGlyph);
glyphCodificado:='00000000000000000000000000000000000';
end;
if self.M=63then
begin
self.PBGlyph:=construirGlyph63(PBGlyph);
glyphCodificado:=
'000000000000000000000000000000000000000000000000000
000000000000';
end;
end;

procedure TART1Lab.FormPaint(Sender: TObject);


begin
if self.M=35 then

165

begin
self.PBGlyph:=construirGlyph35(PBGlyph);
PBResultado:=decodificarResultado(PBResultado,self.M,'');
self.PBGlyph:=decodificarGlyph(self.PBGlyph,self.M,glyphC
odificado);
end;
if self.M=63 then
begin
self.PBGlyph:=construirGlyph63(PBGlyph);
PBResultado:=decodificarResultado(PBResultado,self.M,'');
self.PBGlyph:=decodificarGlyph(self.PBGlyph,self.M,glyphC
odificado);
self.PBGlyph.Canvas.Pen.Color:= clBlack;
self.PBGlyph.Canvas.Rectangle(159,0,165,238);
self.PBGlyph.Canvas.Rectangle(0,237,165,240);
end;
end;
end.

Unidad de parmetros
unit undParametros;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TFrmParametros = class(TForm)
LbD1: TLabel;
LbB1: TLabel;
LbC1: TLabel;
LbA1: TLabel;
LbM: TLabel;
LbN: TLabel;
LbL: TLabel;
Lbrho: TLabel;
BtnOkParametros: TBitBtn;

166

BtnCancelParametros: TBitBtn;
EA1: TEdit;
EB1: TEdit;
EC1: TEdit;
ED1: TEdit;
EL: TEdit;
Erho: TEdit;
EN: TEdit;
PnParametros: TPanel;
BtnReset: TBitBtn;
CBM: TComboBox;
procedure BtnResetClick(Sender: TObject);
procedure BtnOkParametrosClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
correcto: Integer;
end;
var
FrmParametros: TFrmParametros;
implementation
{$R *.dfm}
procedure TFrmParametros.BtnResetClick(Sender: TObject);
begin
self.CBM.ItemIndex:=0;
self.EN.Text:='';
self.EA1.Text:='';
self.EB1.Text:='';
self.EC1.Text:='';
self.ED1.Text:='';
self.EL.Text:='';
self.Erho.Text:='';
self.CBM.SetFocus;
end;
procedure TFrmParametros.BtnOkParametrosClick(Sender:
TObject);
var mayor:Real;
begin
correcto:=0;

167

if ((self.CBM.Text <> '') and (self.EN.Text


<>'')and(self.EL.Text <> '') and (self.Erho.Text <>'')
and
(self.EA1.Text <> '') and (self.EB1.Text
<>'')and(self.EC1.Text <> '') and (self.ED1.Text
<>''))then
if ((StrToInt(self.EN.Text)>0) and
(StrToFloat(self.EA1.Text)>0)and
(StrToFloat(self.EC1.Text)>0)and(StrToFloat(self.ED1.Text
)>0))then
if ((StrToFloat(self.EL.Text)>1) and
(StrToFloat(self.Erho.Text)>0)and
(StrToFloat(self.Erho.Text)<=1))then
begin
if(StrToFloat(self.ED1.Text)>1) then
mayor:=StrToFloat(self.ED1.Text)
else
mayor:=1;
if((StrToFloat(self.EB1.Text)> mayor) and
(StrToFloat(self.EB1.Text)<(StrToFloat(self.ED1.Text)+1))
)then
begin
correcto:=1;
end
else
ShowMessage('Los valores ingresados son
incorrectos, por favor revise la documentacin');
end
else
ShowMessage('Los valores ingresados son
incorrectos, por favor revise la documentacin')
else
ShowMessage('Los valores ingresados son
incorrectos, por favor revise la documentacin')
else
ShowMessage('No puede dejar campos vacos');
end;
end.

168

También podría gustarte