**IAIC 2024-25** Inteligencia Artificial - Ing. de Computadores $\mathbf{24/25}$ Dpto. Ciencias de la Computación e Inteligencia Artificial - Universidad de Sevilla
!!!ejemplo: 🄋 Introducción 0. [Presentación](.\Temas\Introduccion_a_la_IA\) 1. [Historia de la IA](.\Temas\Historia_de_la_IA\) !!!ejemplo: ➀ Representación, Búsqueda y Optimización 1. [Lógica](.\Temas\Logica\) 3. [Satisfacción de Restric­cio­nes](.\Temas\Satisfaccion_de_Restricciones\) 4. [Espacios de Estados](.\Temas\Espacios_de_Estados\) 5. [Optimización](.\Temas\Optimizacion\) 6. [Tratamiento de la Incertidumbre](.\Temas\Incertidumbre\) $\quad$ !!!ejemplo: ➁ Machine Learning 1. [Fundamentos de Machine Learning](.\Temas\Fundamentos_de_ML\) 1. [Flujo de Trabajo ML](.\Temas\Flujo_ML\) 8. [Redes Neuronales](.\Temas\Redes_Neuronales\) 9. [Clustering](.\Temas\Clustering\) 10. [Árboles de Decisión](.\Temas\Arboles_de_Decision\) !!!ejemplo: ⌨ Recursos * [Ejercicios Propuestos](.\Compl\Ejercicios) * [Códigos y Ejemplos](.\Practicas\)
!!!alg: ♾ Material complementario 1. [IA: Una Ciencia empírica](https://www.cs.us.es/~fsancho/Blog/posts/IA_una_ciencia_empirica.md.html) 1. [Introducción a la Lógica Difusa](https://www.cs.us.es/~fsancho/Blog/posts/Introduccion_logica_Difusa.md.html) 1. [Planificación](https://www.cs.us.es/~fsancho/Blog/posts/Planificacion/) 1. [Algoritmos Genéticos](https://www.cs.us.es/~fsancho/Blog/posts/Algoritmos_Geneticos.md.html) 1. [Mapas Auto-organizados](https://www.cs.us.es/~fsancho/Blog/posts/SOM.md.html) 1. [Videos de Redes Neuronales](https://www.youtube.com/playlist?list=PLIb_io8a5NB0CP5ktJE9qaLd6GOfh1Z9m) 1. [Modelos Fundacionales](https://www.cs.us.es/~fsancho/Blog/posts/Modelos_Fundacionales/) 1. [¿Pueden los LLMs razonar y planificar?](.\Compl\Pueden_Razonar_Planificar_LLM\)
El objetivo general del curso es **introducir al estudiante en técnicas avanzadas de Inteligencia Ar­ti­fi­cial** (**IA**), reali­zando un recorrido desde las técnicas más clásicas hasta las más novedosas, con el fin de que el alumno sea capaz de explicarlas, analizarlas e implementarlas en sus proyectos futuros, ya sean pro­fe­siona­les o académicos. Sin embargo, y por encima de las técnicas individuales que podamos ver, se espera que el alumno adquiera una visión en conjunto de qué es la IA, cuáles son sus principales características, y por qué es de facto una de las áreas fundamentales de la Computación y, en general, de la Ciencia e Ingeniería del S. XXI. Tras haber realizado este curso con aprovechamiento, se espera que el estudiante sea capaz de: * **Describir y reconocer** un buen número de las principales técnicas de IA, tanto en términos ge­ne­ra­les como en detalle. * **Representar formalmente** un problema para poder ser abordado por técnicas de IA. * **Conocer los fundamentos matemáticos** que están detrás de las técnicas de IA. * **Aplicar técnicas** concretas de IA a problemas concretos. * **Combinar** diferentes técnicas de IA, tanto desde un punto de vista teórico como práctico. * **Comparar y evaluar** la idoneidad de diversas técnicas de IA. * **Reconocer las dificultades** generales y los errores más habituales en el uso práctico de IA. * **Explorar la literatura** relevante de proyectos de IA específicos de manera independiente. * **Implementar** técnicas no triviales de IA en un sistema de computación. * **Definir y ejecutar experimentos** que pongan a prueba distintas implementaciones. * **Escribir informes científico-técnicos** con la documentación relativa a sistemas de IA, re­fle­jan­do tanto sus implementaciones como las teorías subyacentes.
| | | |-----------------------------|----------------------------------------------------------------------------------------------------------------------| |**Profesores** | [Fernando Sancho Caparrini](http://www.cs.us.es/~fsancho)| |**Contacto** | fsancho@us.es | |**Aula** | H1.10 | |**Horario** | Miércoles: 8:30-10:20 y Viernes: 10:40-12:30 | |**Calendario** | 9 sep 2024 - 20 dic 2024 |
La asignatura tiene un marcado carácter práctico y de motivación del descubrimiento. Para ello, a pesar de las limitaciones reales que el sistema educativo español impone (como el tamaño de los grupos, o la mala dis­tri­bución de la carga de trabajo de las asignaturas), intentar cubrir nuestros objetivos impone algunos con­di­cio­nantes que deben ser reconocidos, y asumidos, previamente por parte de profesor y alumnos: 1. Todo el **contenido estará dis­po­ni­ble de forma abierta** en este mismo sitio web con antelación suficiente para que el alumno lo pueda revisar antes de las sesiones presenciales (una versión inicial de todo el contenido estará dis­po­ni­ble desde el primer día, pero podrá sufrir ligeras modificaciones durante la ejecución del curso). 1. El alumno ha de ser capaz de **prever y seguir una planificación adecuada** del esfuerzo a rea­li­zar en el curso para llevar un ritmo constante pero sin sobresaltos (es un área que lleva muy mal los esfuerzos puntuales y recompensa el trabajo continuo). 2. El [contenido](#Contenido) se articula alrededor de una serie de sesiones (teórico-prácticas) que marcan un ritmo continuo y común al conjunto de la clase. 3. Una **sesión** estándar consta de (puede haber diferencias notables entre las diversas sesiones): * **Breve resumen del contenido teórico**, centrado en los puntos prin­ci­pales del mismo, sin entrar en detalles que ya han estado a disposición del alumno. * **Resolución de dudas concretas** planteadas por los alumnos, que pueden realizar en ese momento, o plantear pre­via­mente por los medios disponibles. * **Planteamiento y resolución de problemas relacionados** con el con­te­ni­do que ayuden a aclarar los conceptos fundamentales y a mostrar las ca­rac­te­rís­ti­cas particulares de las distintas técnicas analizadas. * **Análisis de ejemplos resueltos** en el sistema de implementación elegido y/o en la pizarra. 5. Siguiendo el sistema de créditos ECTS, las sesiones tendrán un desarrollo paralelo (e im­pres­cin­dible) tanto dentro del aula (lecciones y trabajo colaborativo) como fuera de ella (trabajo personal).
El curso está programado para el **Primer Cua­tri­mes­tre del curso 3º del Grado de Ingeniería In­for­má­ti­ca - Ingeniería de Com­pu­ta­do­res** y, por tanto, hace uso de los conocimientos que los alumnos han debido adquirir en asignaturas de cursos anteriores, entre las que se incluyen: Álgebra Lineal y Numérica, Cálculo Infinitesimal y Numérico, Estadística, Ma­te­má­ti­ca Discreta, Análisis y Diseño de Datos y Algoritmos, y Fundamentos de Programación (es importante destacar el amplio contenido matemático en el que se basa). Aunque muchos de los conceptos necesarios de estas otras asignaturas pueden ser superficialmente re­cor­da­dos durante la exposición del contenido de Inteligencia Artificial, debe quedar claro que el objetivo que se per­si­gue no es explicarlos de nuevo aquí, sino destacar su importancia para los resultados que proporcionan en esta área y ponerlos en el contexto adecuado para su correcta aplicación. En consecuencia, es responsabilidad del alumno realizar un repaso de aquellos contenidos explicados en asig­na­tu­ras previas y de los que haremos uso a lo largo de este curso. Muy especialmente, debe quedar claro que **no es res­pon­sa­bi­lidad de esta asignatura enseñar a pro­gra­mar en ningún lenguaje de programación**, y que se entiende que el nivel que se requiere para la comprensión y resolución de las aproximaciones que veremos se ha adquirido con creces en los cursos an­te­rio­res, inde­pen­dien­te­mente de si el lenguaje de pro­gra­ma­ción coincide o no con los usados en dichos cursos.
Junto a los contenidos de carácter teórico, pre­sen­taremos implementaciones de las estructuras y métodos para facilitar el aprendizaje. Para ello, se ha buscado un lenguaje de alto nivel, de orientación científica y que tenga una sintaxis clara y cercana a la formalización matemática. Siguiendo estas directrices, se ha elegido **Julia** como lenguaje de programación del curso. !!!ejemplo: Julia y la Programación Científica ![](img/logo.svg align="right" width="150px")[**Julia**](https://julialang.org/) es un lenguaje de programación **homoicónico** (palabra rebuscada para decir que la representación pri­ma­ria de los programas escritos en Julia es también una estructura de datos en un tipo primitivo del lenguaje), **multi­plataforma**, **multiparadigma** (se adapta al estilo del usuario y la necesidad del problema, pudiendo mostrar características de programación funcional, im­pe­ra­tiva, declarativa, etc.), de **tipado dinámico** (aunque puede pasarse a un tipado estático si se considera más adecuado), de **alto nivel** y alto desempeño para la **computación genérica, téc­nica y científica**, con una sintaxis similar a la de otros entornos de computación similares. Dispone de un compilador avanzado con ejecución principalmente en modo **JIT** (Just in Time), mecanismos para la ejecución paralela y distribuida, además de una extensa biblioteca de funciones ma­te­má­ticas. La biblioteca, desarrollada fun­da­mental­mente en Julia, también contiene código desarrollado en C o Fortran, proporcionando librerías para el álgebra lineal, álgebra abstracta, cálculo real, generación de números aleatorios, procesamiento de señales, aprendizaje automático, ciencia de datos, procesamiento de cadenas, pro­gra­ma­ción paralela, etc. Adicionalmente, la comunidad de desarrolladores de Julia contribuye con la creación y distribución de paquetes externos a un paso acelerado a través del [gestor de paquetes](https://juliapackages.com/) integrado en Julia. Además, hay muchos entornos de programación (como [VSCode](https://code.visualstudio.com/), [Atom](https://atom.io/), etc.) que proporcionan ex­ten­sio­nes específicas para facilitar el trabajo con Julia, así como sistemas de notebooks que permiten usar Julia como lenguaje de desarrollo ([Jupyter­/Jupyter­Lab](https://jupyter.org/), y [Pluto](https://www.juliapackages.com/p/pluto)) o entornos in­ter­ac­tivos como [IJulia](https://juliapackages.com/p/ijulia). !!!alg: Algunos recursos para Julia * [Instalación y Ecosistema de Julia: `juliaup`](Practicas\installJulia.md.html) * [Paquetes y Entornos de Julia](Practicas\PkgEnv.md.html) * [Manual Rápido de Programación](Practicas\Julia.md.html) * [Manual de Julia Plots](Practicas\Plots.md.html) * [Colección: Beautiful Algorithms](https://github.com/mossr/BeautifulAlgorithms.jl)
El alumno tiene dos vías para poder superar la asignatura: la **Evaluación Continua**, y las diversas **Convocatorias Oficiales** del curso académico. !!!ejemplo:Evaluación Continua La **Evaluación Continua** del curso está regida por las siguientes condiciones: 1. El contenido se divide en dos bloques eva­lua­bles: $0\leq E_1, E_2\leq 10$. 1. La calificación de la Evaluación Continua será: $E=\frac{1}{2}(E_1+ E_2)$ si cada $E_i\geq 3$. La pruebas de ambos bloques se harán en horario lectivo, la primera tras haber completado su contenido (en fecha que será comunicada con suficiente antelación), y la segunda en la última sesión lectiva del cuatrimestre. !!!ejemplo:Convocatorias Oficiales Las **Convocatorias Oficiales** (noviembre, enero y julio) son independientes, y la prueba se realizará en la fecha publicada por la E.T.S.I.I. A las convocatorias oficiales solo podrán presentarse los alumnos que no hayan superado la Evaluación Continua del curso correspodiente. Excepcionalmente, a la con­vo­ca­toria de enero podrán presentarse alumnos que, habiendo superado la Evaluación Continua, quieran subir nota (previo visto bueno del profesor).