viernes, 29 de agosto de 2014

Redes semánticas

Prolog es un lenguaje muy adaptado para el desarrollo de aplicaciones en Inteligencia Artificial, en las que un problema básico es representar el conocimiento de un dominio concreto de forma que pueda ser interpretado correctamente en la computadora. Uno de los métodos de representación, basado en modelos de psicología cognitiva, son las redes semánticas. Las redes semánticas son grafos orientados que proporcionan una representación declarativa de objetos, propiedades y relaciones. Los nodos se utilizan para representar objetos o propiedades. Los arcos representan relaciones entre nodos del tipo es_un, es_parte_de, etc. El mecanismo de inferencia básico en las redes semánticas es la herencia de propiedades.

Explicación
http://web.ing.puc.cl/~jabaier/iic2612/leng_natural1.pdf

Ejercicios
http://www.nebrija.es/~cmalagon/ia/ejercicios/Ejercicios_redes_semanticas.pdf

jueves, 28 de agosto de 2014

Reconocimiento de voz

Para empezar lo que necesitamos es decirle a nuestra aplicación cuales son los permisos que necesitará desde el AndroidManifest.xml. Para ello debemos añadir la siguiente línea dentro del archivo antes mencionado:
<uses-permission android:name="android.permission.INTERNET" />

Una vez hecho este paso previo vamos a implementar el reconocimiento de voz. Para ello abrimos nuestra activity principal e incluimos el siguiente código:

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
Private Button btnVoice; 
private void inicializarReconocimiento(){
btnVoice = (Button) findViewById(R.id.btnVoice);
PackageManager pm = getPackageManager();         
List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);           
if (activities.size() != 0) { 
btnVoice.setOnClickListener(new OnClickListener() {        
public void onClick(View v) {      
startVoiceRecognitionActivity();      
}     });          }
}
Lo que estamos haciendo aquí es inicializar un botón para poder lanzar el reconocimiento y comprobando que está disponible este servicio en el dispositivo. Vamos a ver que es lo que hace el método startVoiceRecognitionActivity que lanza nuestro botón.
private void startVoiceRecognitionActivity() {        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);         intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,                 RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);         intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "");         startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);     }

El método es muy sencillo . Lo que hace es llamar al intent correspondiente del reconocimiento, abriendo una nueva actividad que devolverá un resultado, en este caso devolverá los posibles resultados. Tambien le pasamos la variable VOICE_RECOGNITION_REQUEST_CODE que luego utilizaremos en el método onActivityResult. Esto veremos ahora para que sirve.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {          if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {             ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);                         final CharSequence[] items = new CharSequence[matches.size()];    for(int i = 0; i < matches.size(); i++){    items[i] = matches.get(i);    }                     AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(selectResult);         builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) {     txtSearch.setText(items[item].toString());             }  });          AlertDialog alert = builder.create();           alert.show();                       }          super.onActivityResult(requestCode, resultCode, data);      }

Lo que estamos haciendo ahora es sobreescribir el método OnActivityResult de nuestro activity. Este método es lanzado cuando una activity secundaria que hemos lanzado desde nuestra activity principal devuelve un resultado . Por ejemplo, después de reconocer lo que hemos dicho, devolverá un resultado con las posibles frases que ha reconocido el servicio.
Lo primero que hacemos es verificar el resultCode que es una especie de identificador para saber de que activity proviene el resultado. Es para esto para lo que utilizamos la variable anterior.
También verificamos que el resultado de nuestra activity secundaria ha sido satisfactorio con resultCode.
Una vez hechas las comprobaciones parseamos los resultados que en este caso va a ser una lista de frases y los cuales podemos mostrar con un AlertDialog por ejemplo. En este seleccionamos un resultado y lo seteamos en un TextView, txtSearch. A partir de aquí el como se utilicen los resultados ya es cosa de cada uno.

Ejemplo
Reconocimiento para hacer llamadas http://www.tutorialeshtml5.com/2013/03/tutorial-simple-reconocimiento-de-voz.html

martes, 26 de agosto de 2014

Aplicaciones de los Sistemas Expertos


Método de encadenamiento hacia atrás o backtracking

Un motor de inferencia de encadenamiento hacia atrás comienza con una hipótesis (objeto) y pide información para confirmarlo o negarlo. A este método se le llama conducido por objetos porque el SE empieza con un objeto e intenta verificarlo. El encadenamiento hacia atrás poda un árbol.

Ejemplos: http://sergioc2005.tripod.com/intart/Pract7SistExpertProlog06.pdf

TAREA:
Hacer mapa conceptual en CmapTools del siguiente artículo: http://teyet-revista.info.unlp.edu.ar/nuevo/files/No11/TEYET11-art10.pdf

miércoles, 20 de agosto de 2014

Sistemas Expertos en Prolog

Repaso Prolog: http://elvex.ugr.es/decsai/intelligent/workbook/ai/PROLOG.pdf
Gráficos en Prolog: http://www.dccia.ua.es/logica/prolog/docs/ProgGUI.pdf

XPCE/Prolog
Se hace uso de la librería XPCE, la cual ha sido desarrollada para el desarrollo en GUI Prolog.
CARGANDO LA LIBRERÍA PCE
Para poder usar predicados para trabajar con gráficos bajo Prolog deberemos cargar la librería PCE.
:- use_module(library(pce)).
Esta línea lo que hace es decirle a Prolog que cargue la librería una vez ha terminado de compilar, antes de que desde el prompt de Prolog se nos deje hacer ninguna consulta. Una vez cargada esta librería, ya disponemos de una serie de predicados para poder crear ventanas, botones, y una gran variedad de objetos.

CREANDO OBJETOS PARA LUEGO INTERACTUAR
Con la librería PCE se trabaja con un esquema orientado a objetos, en  donde podremos crear clases y trabajar con diferentes objetos, pudiendo llamar a métodos de dichos objetos (pasándoles los correspondientes parámetros) o llamar a métodos que nos devuelvan algún valor, y obviamente si creamos objetos, también podremos destruirlos.
Existen 4 predicados con los que se puede trabajar con XPCE/Prolog. Estos predicados sirven para crear objetos, enviar mensajes a objetos, recibir mensajes de objetos y liberar la memoria de los objetos.
·         new(?Reference, +NewTerm): Este predicado recoge dos parámetros, el primero recogería la referencia que se le asigna al nuevo objeto, ya que new se usa para crear objetos. El segundo parámetro le indicaría el objeto que se quiere crear.
·         send(?Receiver, +Selector(...Args...)): El primer parámetro del predicado es una referencia al objeto al que deseemos enviarle un mensaje. El segundo parámetro indicará el método al que queremos invocar, lo cual indicaremos junto a los argumentos que queremos enviarle al método.
·         get(?Receiver, +Selector(+Argument...), -Result): Los dos primeros parámetros tienen el mismo significado que para send, sin embargo el último parámetro sirve para recoger el valor que nos devuelva el método que hallamos invocado.
·         free(?Reference): libera la memoria asociada al objeto que se le indica en el primer parámetro.
Las referencias se usan para saber a que objeto nos referimos, así pues cada objeto que creemos deberá tener su propia referencia, ya que después toda memoria que  reservemos con new, será conveniente liberarla con free. Las variables de referencia deben crearse con el símbolo @ y el nombre de la VAR. Posteriormente se liberara con free.
MANOS A LA OBRA: Crear un dialogo que contenga un botón y que al pulsar sobre el mismo cierre esa ventana.
:- use_module(library(pce)).
ejemplo:-
/*
* Crea el objeto dialogo en la variable D
*/
new(D,dialog('Nombre del Dialogo')),
/*
* Crea el objeto boton almacenandolo en la variable @boton de tal forma
* que al pulsar sobre el boton libere la memoria y cierre la ventana)
*/
new(@boton, button('Cerrar Dialogo',
and(message(D, destroy),message(D, free),message(@boton, free)))),
/*
* Inserta el botón en el diálogo
*/
send(D, append(@boton)),
/*
* Le envia el mensaje open al dialogo para que cree y muestre la ventana.
*/
send(D, open).

Diagnosticar enfermedades: https://www.youtube.com/watch?v=xzmiO72G9mE

domingo, 17 de agosto de 2014

Agentes

http://www.hipertexto.info/documentos/robot_agent.htm

Robótica

Analizar el siguiente video y hacer la base de conocimientos:
Hasta ahora los robots, incluyendo los industriales, han sido capaces de realizar tareas muy concretas con rapidez y precisión, sin embargo, cuando el entorno cambia un poco, se les hace complicado responder. Este robot almacena conocimientos básicos y los puede aplicar a situaciones inmediatas. Si no "sabe" lo suficiente, se detiene e indica que no puede ejecutarlo porque no sabe cómo, por tanto, si le vamos enseñando cosas, las irá incorporando como nuevos conocimientos y, encajando cada pieza, podría resolver un problema mayor.
Si trasladamos la inteligencia artificial al mundo real, es evidente que los entornos reales son muchísimo más complejos y cambian rápidamente. Por tanto, es necesario incluir un mecanismo de aprendizaje que haga que el autómata se adapte a la situación. Además, debido a que los entornos son cambiantes, los robots deben tener la capacidad de seguir aprendiendo y obteniendo nueva información sobre el terreno. Para lograr todo esto hemos implementado un algoritmo de redes neuronales con SOINN que, además de ser bastante ligero en la computación, elimina cualquier ruido procedente de la nueva información que entra en juego.

Supongamos que el robot tuviese que preparar té y nadie le hubiese enseñado y que, además, se enviase el robot a asistir a una persona mayor que vive sola. Si esta persona pidiese una taza de té verde, el robot no sabía cómo hacerlo y, por tanto, consulta a través de Internet con otros robots para que le transfieran los conocimientos necesarios para hacerlo. Imaginemos que un robot en Reino Unido le transifere cómo hacer té pero al estilo británico, creemos que este robot sería capaz de adaptarse a las condiciones de contorno y adaptar la preparación a una tetera japonesa.

Sistemas expertos

Los sistemas expertos se basan en la simulación del razonamiento humano. El razonamiento humano tiene para ellos, un doble interés: por una parte, el del análisis del razonamiento que seguiría un experto humano en la materia a fin de poder codificarlo mediante el empleo de un determinado lenguaje informático; por otra, la síntesis artificial, de tipo mecánico, de los razonamientos de manera que éstos sean semejantes a los empleados por el experto humano en la resolución de la cuestión planteada. Estos dos campos de interés han conducido a los investigadores que trabajan en el campo de la inteligencia artificial (de la cual los sistemas expertos son un campo preferente) a intentar establecer una metodología que permita verificar el intercambio con los expertos humanos y aislar los diversos tipos de razonamiento existentes(inductivo, deductivo, formal, etc.), así como construir los elementos necesarios para modelarlos.

Los sistemas expertos son,por lo tanto, intermediarios entre el experto humano, que transmite sus conocimientos al sistema, y el usuario de dicho sistema, que lo emplea para resolver los problemas que se le plantean con la competencia de un especialista en la materia y que, además, puede adquirir una destreza semejante a la del experto gracias a la observación del modo de actuar de la máquina. Los sistemas expertos son, pues, simultáneamente,un sistema de ejecución y un sistema de transmisión del conocimiento.Asimismo, los sistemas expertos se definen mediante su arquitectura; obtienen,por lo tanto, una realidad palpable. Mientras que en las operaciones de programación clásicas se diferencia únicamente entre el propio programa y los datos, en el caso de los sistemas expertos se diferencian tres componentes principales. Son los siguientes:

Fases en la adquisición del conocimiento:
  • identificación del problema.
  • Estructuración del conocimiento.
  • La arquitectura del sistema y la maqueta.
  • El prototipo y terminación del sistema.

Clasificación de campos de la IA

Programación automática: Verificación y síntesis.
  • Razonamiento automático.
  • Representación del conocimiento.
  • Metodología de la programación en IA.
  • Aprendizaje.
  • Procesamiento del lenguaje natural.
  • Resolución de problemas, métodos de control y búsqueda.
  • Robótica.
  • Interpretación de imágenes y visión artificial.
  • Inteligencia artificial distribuida.
Aplicaciones de la IA:
  • Tareas de la vida diaria:
    • Percepción: visión y habla.
    • Lenguaje natural: comprensión, generación y traducción.
    • Sentido común.
    • Control de robot.
  • Tareas formales:
    • Juegos: damas, ajedrez, go, ...
    • Matemáticas: cálculo simbólico, demostración de teoremas.
    • Computación: verificación de programas, aprendizaje automático.
  • Tareas de expertos:
    • Ingeniería: diseño, detección de fallos, planificación de manufacturación.
    • Análisis científico.
    • Diagnóstico y tratamiento médico.
    • Análisis financiero.