Algoritmo del vecino más cercano aplicado a la web

Transcription

Algoritmo del vecino más cercano aplicado a la web
Algoritmo del vecino más cercano aplicado a la web
Filmaffinity.com
Filippo Chieco
Carlos Pérez Pérez
Joana Rodríguez Luque
Ingeniería Espacial
“Sapienza” Università di Roma
Universidad Carlos III de Madrid
Ingeniería Telecomunicaciones
Universidad de Las Palmas de G.C.
Universidad Carlos III de Madrid
Ingeniería Técnica Industrial
(Electrónica Industrial)
Universidad Carlos III de Madrid
Av. de la Universidad, 30 28911 Leganés
(Madrid)
Estudiante Erasmus
Av. de la Universidad, 30 28911
Leganés (Madrid)
Estudiante Séneca
Av. de la Universidad, 30 28911
Leganés (Madrid)
[email protected]
[email protected] [email protected]
RESUMEN
Algoritmo del vecino más cercano aplicado a la web
filmaffinity.com para ver la compatibilidad de los gustos
cinematograficos.
Términos generales
Algoritmo, factores humanos, realizable
Palabras clave
Aprendizaje, algoritmo k-nn, aprendizaje inductivo supervisado,
vecino más cercano.
1. INTRODUCCIÓN
El aprendizaje es el proceso a través del cual se adquieren
nuevas habilidades, destrezas, conocimientos, conductas o valores
como resultado del estudio, la experiencia, la instrucción, el
razonamiento y la observación. Este proceso puede ser analizado
desde distintas perspectivas, por lo que existen distintas teorías
del aprendizaje. El aprendizaje es una de las funciones mentales
más importantes en humanos, animales y sistemas artificiales.
El aprendizaje humano está relacionado con la educación y
el desarrollo personal. Debe estar orientado adecuadamente y es
favorecido cuando el individuo está motivado. El estudio acerca
de cómo aprender interesa a la neuropsicología, la psicología
educacional y la pedagogía.
El aprendizaje como establecimiento de nuevas relaciones
temporales entre un ser y su medio ambiental ha sido objeto de
diversos estudios empíricos, realizados tanto en animales como en
el hombre.
Midiendo los progresos conseguidos en cierto tiempo se obtienen
las curvas de aprendizaje, que muestran la importancia de la
repetición de algunas predisposiciones fisiológicas, de «los
ensayos y errores», de los períodos de reposo tras los cuales se
aceleran los progresos, etc. Muestran también la última relación
del aprendizaje con los reflejos condicionados.
La idea del aprendizaje consiste en utilizar las percepciones no
sólo para actuar, sino también para mejorar la habilidad del agente
para actuar en el futuro. El aprendizaje entra en juego cuando el
agente observa sus interacciones con el mundo y sus procesos de
toma de decisiones. Puede ir desde la trivial memorización de las
experiencias, hasta la creación de teorías científicas.
2. FORMAS DE APRENDIZAJE
Un agente de aprendizaje puede ser diseñado con un elemento de
acción, que decide qué acciones llevar a cabo y con un elemento
de aprendizaje, que modifica el elemento de acción para poder
tomar memore decisiones. Los investigadores en el campo del
aprendizaje han creado una gran variedad de elementos de
aprendizaje. El diseño de un elemento de aprendizaje se va
afectado mayoritariamente por tres aspectos:
● Qué componentes del elemento de acción tienen que aprenderse
● Què realimentación está disponibile para aprender dichos
componentes.
● Qué tipo de representación se usa para los componentes.
A continuación se van a analizar cada uno de estos aspectos.
Existen mucca formas de construir el elemento de acción de un
agente. Los components de estos agentes incluyen los siguente:
1.
2.
3.
Una proyección directa de las condiciones del estado
actual a las acciones.
Un método para inferir las propiedades relevantes del
mundo a partir de una secuencia de percepciones.
Información sobre cómo evoluciona el mundo y sobre
los resultados de las posibles acciones que el agente
puede llevar a cabo.
4.
5.
6.
Información de utilidad, que indica los deseables que
son los estrado.
Información acción-valor, que indica los deseables que
son las acciones.
Metas que describen las clases de estados que
maximizan la utilidad del agente.
Cada uno de estos componentes puede aprenderse con una
realimentación apropiada. Consideremos, por ejemplo, un agente
enrtenándose para convertirse en un taxista. Cada vez que el
instructor grite ‹‹¡Frene!››, el agente puede aprender una regla
condición-acción que le indique cuándo frenar (componente 1).
Informando el agente de que certa imágenes de cámaras contienen
autobuses, puede aprender a reconocerlo (2). Realizando acciones
y observando sus resultados (por ejemplo frenar bruscamenteen
pavimento mojado) puede aprender las consecuencias de sus
acciones (3). Además, si no recibe propina de pasajeros tras una
conducción brusca, puede aprender una componente útil de su
función de utilidad (4).
El tipo de realimentación disponible para el aprendizaje
normalmente es el factor más importante a la hora de determinar
la naturaleza del problema de aprendizaje que tiene que afrontar el
agente. Se distinguen tres distintos tipos de aprendizaje:
supervisado, no supervisado y por refuerzo.
2.1 Aprendizaje supervisado
El problema de aprendizaje supervisado consiste en aprender
una función a partir de ejemplos de sus entradas y sus salidas. Los
casos (1), (2) y (3) son ejemplos de problemas de aprendizaje
supervisado. En el caso (1) el agente aprende la regla condiciónacción para frenar, esto es, una función que a partir del estado
genera una salida booleana (frenar o no frenar). En el caso (2), el
agente aprende una función que a partir de una imagen genera una
salida booleana (si la imagen contiene o no un autobús). En el
caso (3), aprende una función que a partir del estado y las
acciones para frenar, genera la distancia de parada expresada en
pies. Nótese que tanto en los casos (1) y (2), un profesor
suministra el valor correcto de la salida de cada ejemplo; en el
tercero, el valor de la salida proviene de lo que el agente percibe.
Figura 1. Estructura del aprendizaje supervisado (a) y no
supervisado (b). En el aprendizaje supervisado hay un
conjunto de observaciones, llamado inputs, que genera un otro
conjunto de observaciones, llamado outputs. En el aprendizaje
no supervisado todas las observaciones son generado de un
conjunto de variables latentes.
2.2
Aprendizaje no supervisado
El problema de aprendizaje no supervisado consiste en aprender
a partir de patrones de entradas para los que no se especifican los
valores de sus salidas. Por ejemplo, un agente taxista debería
desarrollar gradualmente los conceptos de ‹‹días de tráfico
bueno›› y de ‹‹días de tráfico malo››, sin que le hayan sido dados
ejemplos etiquetados de ello. Un agente de aprendizaje
supervisado puro no puede aprender que hacer, porque no tiene
información de lo que es una acción correcta o un estado
deseable. Principalmente se estudia el aprendizaje no supervisado
en el contexto de los sistemas de razionamento probabilístico.
En entorno totalmente observables, el agente siempre puede
observar los efectos de sus acciones, y por lo tanto, puede utilizar
metódos de aprendizaje supervisado para aprender a predecirlos.
En entornos que son parcialmente observables, el problema es
más difícil, ya que los efectos más inmediatos pueden ser
invisibles.
Figura 2. El aprendizaje no supervisado se puede usar para
colmar la distancia entre las observaciones de los inputs y de
los outputs. Las variables latentes del nivel de arriba generan
ambas las observaciones y median la dependencia entre inputs
y outputs.
2.3
Aprendizaje por refuerzo
El problema de aprendizaje por refuerzo, es el más general de la
tres categorías. En vez de que un profesor indique al agente qué
hacer, el agente de aprendizaje por refuerzo debe aprender a
partir del refuerzo. Por ejemplo, la falta de propina al final del
viaje (o una gran factura por golpear la parte trasera del coche de
delante) da al agente algunas indicaciones de que su
comportamento no es el deseable. El aprendizaje por refuerzo
típicamente incluye el subproblema de aprender cómo se
comporta el entorno.
El factor más importante en el diseño de sistemas de aprendizaje
es la disponibilidad de conocimiento a priori. La mayoría de los
investigadores de apredizaje en IA, ingeniería informática, y
psicología han estudiado el caso en el que el agente comienza sin
información sobre lo que está intentendo aprender. Sólo tiene
acceso a los ejemplos de sus experiencias. Aunque es un caso
importante, no es por término medio el caso más general. La
mayoría del aprendizaje humano tiene lugar en un contexto con
bastante conocimiento de base. Algunos psicólogos y linguistas
reinvendican que incluso los niños recién nacidos poseen
conocimiento del mundo. Verdad o no, no hay duda de que el
conocimiento previo puede ayudar en gran medida en el
aprendizaje. Un físico examinando una pila de fotografías de una
cámera de burbujas (bubble-chamber), podría ser capaz de inferir
una teoría que afirmara la existencia de una nueva partícula con
una cietra masa y una cierta carga; sin embargo un crítico de arte
que examina la misma pila podría aprender únicamente que el
artista debe pertenecer a alguna clase de impresionismo abstracto.
aproximarla. Siendo más formales, se dice que un ejemplo es un
par (x, f(x)), donde x es la entrada y f(x) es la salida de la función f
aplicada a x. La tarea de la inferencia inductiva pura (o
inducción) es la siguente:
Dada una colección de ejemplos de f, devolver una función h
que aproxime a f.
La función h se denomina hipótesis. La razón por la cual el
aprendizaje es dificíl, desde un punto de vista conceptual, es que
no es fácil determinar si una función h es una buena aproximación
de f. Una buena hipótesis estará bien generalizada si puede
predecir ejemplos que no se conocen. Éste es un problema de
inducción fundamental. Un ejemplo típico es ajustar una función
de una única variable a una serie de puntos dados. Los ejemplos
son pares (x, f(x)), donde tanto x como f(x) son números reales. Se
elige el espacio de hipótesis H (el conjunto de hipótesis que se
van a considerar) como el conjunto de polinomios de grado
2
17
3
inferior o igual a k, por ejemplo 3x +2, x -4x . Se pueden
ajustar algunos datos de forma exacta como una linea recta (la
linea se denomina hipótesis consistente ya que verifica todos los
datos) o como un polinomio de mayor grado que también es
consistente con los mismos datos. Esto ilustra la primera cuestión
del aprendizaje inductivo: ¿Cómo elegir entre múltiples hipótesis
consistentes? La respuesta es que es preferible la hipótesis
consistente con los datos que sea más sencilla. Intuitivamente,
tiene sentido, ya que las hipótesis que no son tan sencillas como
los datos van a fallar a la hora de extraer cualquier patrón de los
mismos. Definir qué es sencillo no es fácil, pero parece razonable
decir que un polinomio de grado 1 es más sencillo que uno de
grado 12.
En un conjunto de datos más complejo puede serr que no existe
una línea recta consistente; de hecho este conjunto requiere un
polinomio de grado mayor. Si por ejemplo el polinomio es de
grado 6, los datos están formados por siete puntos, así que el
polinomio tiene tantos parámetros como puntos forman los datos;
por ello, no parece encontrarse ningún patrón en los datos y no
esperariamos una buena generalización. Sería mejor ajustar con
una línea recta, que no sea exactamente consistente, pero que
permita hacer predicaciones razonables. Esto equivale a aceptar la
posibilidad de que la función verdadera sea no determínistica (o
algo similar, que las entradas reales no han sido observadas en su
totalidad).
Figura 3. El objecivo del agente es adaptar su comportamento
de manera de maximizar la suma de los refuerzos que espera
obtener en el futuro.
3. APRENDIZAJE INDUCTIVO
Un algoritmo de aprendizaje supervisado determinístico recibe
como entrada el valor correcto para determinados valores de una
función desconocida y debe averiguar cuál es la función o
Para funciones no deterministicas, existe un inevitable
compromiso entre la complejidad de la hipótesis y el grado de
adecuación de los datos.
Se debe tener en cuenta que la posibilidad o la imposibilidad de
encontrar una hipótesis consistente y sencilla depende en gran
medida del espacio de hipótesis elegido. Uno espacio de hipótesis
formado por polinomios de grado finito no puede, por ejemplo, re
presentar funciones sinusoidales con precisión, así que no se
puede aprender con este espacio de hipótesis a partir de datos
sinusoidales. Se dice que un problema de aprendizaje es
realizable si el espacio de hipótesis contiene a la función
verdadera; en otro caso, se dice que es irrealizable.
Desgraciadamente, no siempre se puede determinar si un
problema de aprendizaje es realizable, ya que la función verdadera
no se conoce. Una forma de evitar este problema es usar
conocimiento a priori para eligir un espacio de hipótesis en el que
sabemos que se encuentra la función verdadera.
Otro enfoque es utilizar un espacio de hipótesis tan grande como
sea posible. Por ejemplo, ¿por qué no permitir que H sea el
conjunto de todas las máquinas de Turing? Déspues de todo, toda
función computable puede ser representada por una máquina de
Turing. El problema de este enfoque es que no tiene en cuenta la
complejidad computacional del aprendizaje.
Existe un compromiso entre la expresividad del espacio de
hipótesis y la complejidad de encontrar hipótesis sencillas y
consistentes dentro de este espacio.
Por ejemplo, ajustar líneas rectas a los datos es muy sencillo;
ajustar polinomios de grado alto es más complicado; y ajustar
máquinas de Turing es muy complicado, ya que dada una máquina
de Turing, determinar si es consistente con los datos no es un
problema, en general, decidible. Una segunda razón para preferir
espacios de hipótesis simples es que la hipótesis resultante será
sencilla de utilizar, es decir, será más rápido computar h(x)
cuando h sea una función lineal que cuando sea un programa de
cualquier máquina de Turing.
Por estas razones, la mayoría de los trabajos en aprendizaje se han
enfocado hacia representaciones relativamente simples.
En el reconocimiento de patrones, el algoritmo k-nn es usado
como método de clasificación de objetos (elementos) basado en
un entrenamiento mediante ejemplos cercanos en el espacio de los
elementos. k-nn es un tipo de "Lazy Learning", donde la función
se aproxima solo localmente y todo el cómputo es diferido a la
clasificación.
Los ejemplos de entrenamiento son vectores en un espacio
característico multidimensional, cada ejemplo está descrito en
términos
de p atributos
considerando q clases
para
la
clasificación. Los valores de los atributos del i-esimo ejemplo
(donde
dimensional
)
se
representan
por
el
vector p-
El espacio es particionado en regiones por localizaciones y
etiquetas de los ejemplos de entrenamiento. Un punto en el
espacio es asignado a la clase C si esta es la clase más frecuente
entre los k ejemplos de entrenamiento más cercano. Generalmente
se usa la Distancia euclideana.
La fase de entrenamiento del algoritmo consiste en almacenar los
vectores característicos y las etiquetas de las clases de los
ejemplos de entrenamiento. En la fase de clasificación, la
evaluación del ejemplo (del que no se conoce su clase) es
representada por un vector en el espacio característico. Se calcula
la distancia entre los vectores almacenados y el nuevo vector, y se
seleccionan los k ejemplos más cercanos. El nuevo ejemplo es
clasificado con la clase que más se repite en los vectores
seleccionados.
Este método supone que los vecinos más cercanos nos dan la
mejor clasificación y esto se hace utilizando todos los atributos; el
problema de dicha suposición es que es posible que se tengan
muchos atributos irrelevantes que dominen sobre la clasificación:
dos atributos relevantes perderían peso entre otros veinte
irrelevantes.
Figura 4. Taxonomia del aprendizaje.
4. K-NN
En el método k-nn (K nearest neighbors Fix y Hodges, 1951) es
un método de aprendizaje inductivo supervisado que sirve para
estimar la función de densidad F(x / Cj) de las predictoras x por
cada clase Cj.
Este es un método de clasificación no paramétrico, que estima el
valor de la función de densidad de probabilidad o directamente
la probabilidad a posteriori de que un elemento x pertenezca a la
clase Cj a partir de la información proporcionada por el conjunto
de prototipos. En el proceso de aprendizaje no se hace ninguna
suposición acerca de la distribución de las variables predictoras.
Para corregir el posible sesgo se puede asignar un peso a las
distancias de cada atributo, dándole así mayor importancia a los
atributos más relevantes. Otra posibilidad consiste en tratar de
determinar o ajustar los pesos con ejemplos conocidos de
entrenamiento. Finalmente, antes de asignar pesos es
recomendable identificar y eliminar los atributos que se
consideran irrelevantes.
la clasificación, pero crean límites entre clases parecidas. Un
buen kpuede ser seleccionado mediante una optimización de uso.
El caso especial en que la clase es predicha para ser la clase más
cercana al ejemplo de entrenamiento (cuando k = 1) es
llamada Nearest Neighbor Algorithm, Algoritmo del vecino más
cercano.
Figura 5. Ejemplo del algoritmo Knn. El ejemplo que se
desea clasificar es el circulo verde. Para k = 3 este es
clasificado con la clase triángulo, ya que hay solo un cuadrado
y 2 triángulos, dentro del circulo que los contiene. Si k = 5 este
es clasificado con la clase cuadrado, ya que hay 2 triángulos y 3
cuadrados, dentro del circulo externo.
En síntesis, el método k-nn se resume en dos algoritmos:
La exactitud de este algoritmo puede ser severamente degradada
por la presencia de ruido o características irrelevantes, o si las
escalas de características no son consistentes con lo que uno
considera importante. Muchas investigaciones y esfuerzos fueron
puestos en la selección y crecimiento de características para
mejorar las clasificaciones. Particularmente una aproximación en
el uso de algoritmos que evolucionan para optimizar
características de escalabilidad. Otra aproximación consiste en
escalar características por la información mutua de los datos de
entrenamiento con las clases de entrenamiento.
4.3 Vecinos más cercanos con distancia
ponderada
Se puede ponderar la contribución de cada vecino de acuerdo a la
distancia entre él y el ejemplar a ser clasificado xq, dando mayor
peso a los vecinos más cercanos. Por ejemplo podemos ponderar
el voto de cada vecino de acuerdo al cuadrado inverso de sus
distancias
4.1.1 Algoritmo de entrenamiento
Para cada ejemplo < x,f(x) > ,donde
, agregar el
ejemplo a la estructura representando los ejemplos de aprendizaje.
donde
4.1.2 Algoritmo de clasificación
Dado
un
ejemplar xq que
debe
ser
clasificado,
sean x1,...,xk los k vecinos más cercanos a xq en los ejemplos de
aprendizaje, regresar
donde
δ(a,b) = 1 si a = b; y 0 en cualquier otro caso.
el valor f(xq) devuelto por el algoritmo como un estimador
de f(xq) es solo el valor más común de f entre los k vecinos más
cercanos a xq. Si elegimos k = 1; entonces el vecino más cercano
a xi determina su valor.
4.2 Elección del k
La mejor elección de k depende fundamentalmente de los datos;
generalmente, valores grandes de k reducen el efecto de ruido en
De esta manera se ve que no hay riesgo de permitir a todos los
ejemplos entrenamiento contribuir a la clasificación de xq, ya que
al ser muy distantes no tendrían peso asociado. La desventaja de
considerar todos los ejemplos seria su lenta respuesta (método
global). Se quiere siempre tener un método local en el que solo
los vecinos más cercanos son considerados.
Esta mejora es muy efectiva en muchos problemas prácticos. Es
robusto ante los ruidos de datos y suficientemente efectivo en
conjuntos de datos grandes. Se puede ver que al tomar promedios
ponderados de los k vecinos más cercanos el algoritmo puede
evitar el impacto de ejemplos con ruido aislados.
5. APLICACIÓN A FILMAFFINITY
En este programa lo que hemos hecho ha sido intentar copiar un
algoritmo que usa la pagina www.filmaffinity.com, una
página creada en Mayo de 2002 dedicada a dar e intercambiar
información sobre películas, directores, actores, etc., y que
además permite a sus usuarios registrados, poner una nota a las
películas que hayan visto. De esta forma, podemos ver, para cada
pelicula, la votacion media que ha obtenido de todos los usuarios
de la comunidad, de esta forma, podremos saber de antemano si
una pelicula es buena o no.
Actualmente FilmAffinity no es sólo una de las mayores bases de
datos de cine en nuestro idioma, sino también una de las webs de
todo el mundo que atesora una mayor cantidad de votaciones de
cada una de sus películas, gracias a su gran número de usuarios de
tantos países diferentes.
Figura 6. Ejemplo de algoritmo K-NN para los K=4 vecinos
más cercanos.
Figura 7. Aqui vemos una impresion de pantalla del apartado “Almas Gemelas” donde podemos ver el porcentaje de afinidad con
los usuarios de la comunidad, ademas de mostrarnos el numero de votaciones coincidentes con las nuestras
En particular, nuestro algoritmo se centra en un apartado llamado
“Almas Gemelas”, que elabora, a partir de las votaciones de los
usuarios, una lista con los que son más afines, una forma de saber
que películas que yo no he visto me podrían gustar, ya que mis
almas gemelas tendrán gustos muy parecidos a los míos.
6. CÓDIGO
En nuestro algoritmo, desarrollado en Matlab, hemos tomado
como base de datos, nuestros propias votaciones, además de unas
votaciones ficticias, propias de ciertos personajes famosos.
Obviamente, dichas votaciones no serán nada coherentes, y es
difícil que alguien obtenga como resultado ser el alma gemela de
alguno de ellos. Lo ideal sería tener una base de datos grande,
como podria ser la que tiene la propia pagina, donde digamos que
los vectores de cada usuario serán muchisimo mas grandes de las
apenas 15 peliculas que hemos puesto nosotros por usuario. Con
esto, conseguiriamos que un usuario que realmente tiene unas
votaciones similares a las nuestras, teniendo un gran número de
películas calificadas, realmente fuera nuestra verdadera almagemela y alguien de cuyos gustos podriamos fiarnos a la hora de
aceptar una recomendacion.
En la parte más matemática, deberemos usar esta expresion para
realizar el k-nn, ya que tenemos varios casos para comparar:
num_user=numel(puntuacion_peliculas)/num_pel
ic;
vec_nom=zeros(1,num_pelic);
voto=0;
%llamamos
a
un
script
que
toma
las
votaciones por pantalla, además de mostrar
los carteles de las películas a votar, y las
almacena en un vector que luego se comparará
con la base de datos
votar;
for i=1:num_user
for colum=1:num_pelic
%si el valor leído es ‘11’, no hace la
comparación, ya que uno de los dos no ha
visto la pelicula
load puntuacion-peliculas.txt;
%no carga las letras, por eso uso ‘11’ como
valor de no-votación, esto es, para la
película que no hayamos visto
int
int
int
int
int
int
int
int
var;
colum;
i;
error;
coinc;
comp;
num_user;
num_pelic;
%variables para guardar los errores mínimos,
las coincidencias con ese usuario, y la
posición del usuario en la matriz
int
int
int
int
minres;
minreserror;
minrescoinc;
mincomp;
%variables para guardar los errores máximos,
las coincidencias con ese usuario, y la
posición del usuario en la matriz, para
hallar el anti-alma gemela
int maxres;
int maxreserror;
int maxrescoinc;
int maxcomp;
int voto;
double vec_nom;
error=0;
coinc=0;
colum=0;
var=0;
i=0;
comp=0;
mincomp=0;
maxcomp=0;
minres=0;
maxres=0;
minreserror=10^10;
maxreserror=0;
num_pelic=length(puntuacion_peliculas);
if vec_nom(colum) ~=11
if
puntuacion_peliculas(i,colum)~=11
%aquí es donde realmente usamos el algoritmo
del vecino más cercano, restando los valores
de dos votaciones y elevando al cuadrado
var=abs(puntuacion_peliculas(i,colum)vec_nom(colum));
var=var^2;
error=error + var;
comp=comp+1;
if
puntuacion_peliculas(i,colum)==
vec_nom(colum)
coinc=coinc+1;
end
end
end
end
%guardamos
el
numero
de
coincidencias,
errores
y
comparaciones
para al final
ofrecer un porcentaje de afinidad. Aquí
hemos hecho que solo si son estrictamente
iguales
sume
uno
el
contador
de
coincidencias, pero en la pagina le da un
intervalo, digamos, si las votaciones están
uno o dos puntos por encima o por debajo,
las considera como iguales
error=sqrt(error);
if error < minreserror
minreserror=error;
minrescoinc=coinc;
minres=i;
mincomp=comp;
end
if error > maxreserror
maxreserror=error;
maxrescoinc=coinc;
maxres=i;
maxcomp=comp;
end
error=0;coinc=0;comp=0;
end
disp ('Tu alma gemela es: ')
dato=minres;
%función que hará un switch para saber, a
partir
del
numero
de usuario obtenido
arriba, que imagen le corresponde mostrar
switch12(dato);
disp('El numero de coincidencias fue: ')
disp(minrescoinc);
disp(minrescoinc/mincomp*100);
minres=0;minrescoinc=0;minreserror=0;
disp ('Tu anti-alma gemela es: ')
dato=maxres;
switch12(dato)
disp('El numero de coincidencias fue: ')
disp(minrescoinc);
disp(minrescoinc/mincomp*100);
minres=0;minrescoinc=0;minreserror=0;
Figura 8. Aqui vemos como, al llamar al script ‘votar.m’, nos pedirá la votación de la película además de mostrarnos el cartel de la
misma, algo bastante útil para que la imagen nos ayude a recordar la película
SWITCH12.m
function switch12(dato)
switch (dato)
case 1
disp('Carlos')
case 2
disp('Joana')
case 3
disp('Filippo')
case 4
disp('Cristiano Ronaldo')
cargaimagen('cristiano.jpg')
case 5
disp('Belen Esteban')
cargaimagen('esteban.jpg')
case 6
disp('George Bush')
cargaimagen('bush.jpg')
case 7
disp('Sara Carbonero')
cargaimagen('carbonero.jpg')
case 8
disp('Mr. Bean')
cargaimagen('bean.jpg')
case 9
disp('Rafa Nadal')
cargaimagen('rafa.jpg')
case 10
disp('Carmen Mairena')
cargaimagen('mairena.jpg')
case 11
disp('Kobe Bryant')
cargaimagen('bryant.jpg')
case 12
disp('Lady Gaga')
cargaimagen('ladygaga.jpg')
otherwise
disp('Sin Coincidencias')
end
function cargaimagen(dato)
[IM map]=imread(dato);
figure;
colormap(map);
image(IM);
CARGAIMAGEN.m
%función que tomará el fichero que debe
abrir y lo mostrará por pantalla, aquí hemos
incluido un “figure” para que al cargar dos
imagenes seguidas, la segunda no pise a la
otra, y asi poder visualizar bien las dos.
Figura 9. En esta imagen podemos ver el resultado final, que nos ofrece nuestra alma gemela, nuestra anti-alma gemela, además de
indicarnos el numero de coincidencias obtenidas, y el porcentaje de las mismas. Por último, nos mostrará sus fotos.
VOTAR.m
%script que guardará en el vector vec_nom
las votaciones que introduzca el usuario,
para
luego
ejecutar
el
bloque
de
comparaciones (en el programa principal)
i=1;
voto=input('Votaciòn para Kill Bill Vol.1:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Náufrago: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación
para
2
Policías
Rebeldes: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Cadena Perpetua:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación
para
Gladiator:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Kung Fu Panda:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para American Pie:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para El Código Da
Vinci: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación
para
Torrente
2:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Solo en Casa:
','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Camino: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Grease: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para American History
X: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación
para
El
Guardaespaldas: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
voto=input('Votación para Resacón en Las
Vegas: ','s');
vec_nom(i)=str2double(voto);
i=i+1;
7. FUTURAS MEJORAS
En una version posterior podríamos hacer algunas mejoras,
como podría ser que las votaciones que se fueran introduciendo,
y que no estuvieran ya en los vectores a comparar, fueran
almacenandose automaticamente en el fichero que estamos
usando como base de datos, esto haria, que entre más personas
diferentes lo usaran, mayor posibilidad de encontrar alguien con
gustos similares a los nuestros. Esto implicaría cambiar muchas
cosas del código, ya que por ejemplo, no podríamos usar un
“switch” para imprimir por pantalla las imagenes (fotos) como
lo hemos estado haciendo hasta ahora. En su lugar deberíamos
implementar algo asi como un vector que almacenara los
nombres de los usuarios que van votando y que se renovara cada
vez que se introdujera alguno nuevo.
Otra cosa que se podría cambiar a mejor seria el hecho de que
las comparaciones pudieran no ser tan estrictas, es decir, tener
dos niveles de afinidad, uno que fuera estrictamente igual, con
lo que nos daria menos personas con las que ser afines, pero con
las que tendríamos grandes similitudes (es el caso que hemos
implementado) y otro nivel en el que si las votaciones fueran 1 o
2 puntos por encima o por debajo las considerara como una
coincidencia. Con esto conseguiríamos que nos devolviera una
lista amplia de usuarios con gustos parecidos con peliculas, que
quizas no hayamos visto y que nos pueden sorprender
gratamente
8. VISUALIZACIÓN DEL CÓDIGO
A continuación vamos a mostrar gráficamente el proceso y
orden que sigue el código para un mayor entendimiento del
desarrollo del estudio.
8.1 Orden de votación de las películas
El primer paso es que las personas que van a participar hagan
una lista, en el mismo orden que se indica, de sus votaciones
sobre estas películas que se muestran a continuación. Para un
mayor cercioramiento de las películas que son por parte de los
participantes, se mostrarán el cartel de las mismas para tener
unas votaciones/resultados lo más fiables posibles.
8.1.1 Película número 1:Kill Bill
Figura 10. Película número 1: Kill Bill.
8.1.2 Película número 2: Naúfrago
Figura 11. Película número 2: Naúfrago
8.1.3 Película número 3: Dos policias rebeldes 2
Figura 12. Película número 3: Dos policias rebeldes 2
8.1.4 Película número 4:Cadena perpetua
Figura 13. Película número 4: Cadena Perpetua.
8.1.5 Película número 5: Gladiator
Figura 14. Película número 5: Gladiator
8.1.6 Película número 6: Kung Fu Panda
Figura 15. Película número 6: Kun Fu Panda
8.1.7 Película número 7: American Pie
Figura 16. Película número 7: American Pie
8.1.8 Película número 8: El Código Da Vinci
Figura 17. Película número 8: El Código Da Vinci
8.1.9 Película número 9: Torrente 2
Figura 18. Película número 9: Torremte 2
8.1.10 Película número 10: Sólo en Casa
Figura 19. Película número 10: Sólo en casa
8.1.11 Película número 11: Camino
Figura 20. Película número 11: Camino
8.1.13 Película número 13: American History X
Figura 14. Película número 13: American History X
8.1.14 Película número 14: El Guardaespaldas
Figura 15. Película número 14: El Guardaespaldas
8.1.15 Película número 15: Resacón en Las Vegas
Figura 16. Película número 15: Resacón en Las Vegas
8.1.12 Película número 12: Grease
8.3 Recopilación de datos y muestra de
resultados
A continuación de procederá a la recopilación e introducción de
votaciones y el código mostrará :
-El alma gemela de la persona analizada junto con el número de
coincidencias entre ambos.
-El anti-alma gemela de la persona analizada junto con el
número de coincidencias entre ambos.
Figura 21. Película número 12: Grease
Para que el programa fuese más entendible visualmente, además
de introducir las votaciones de los autores de este proyecto, nos
hemos inventado las votaciones de varios personajes famosos
que son conocidos por la mayoría de los participantes. Los
mostramos a continuación en el mismo orden que están en el
código:
Figura 21. Mr. Been (Actor)
Figura 17. Cristiano Ronaldo (Futbolista)
Figura 22. Rafa Nadal (Tenista)
Figura 18. Belén Esteban (Tertuliana televisiva)
Figura 23. Carmen de Mairena (Tertuliana televisiva)
Figura 19. George Bush (Ex-Presidente EEUU)
Figura 24. Kobe Bryant (Jugador de Baloncesto)
Figura 20. Sara Carbonero (Periodista)
[1] Russell, Stuart J. (Stuart Jonathan) 2004
Inteligencia artificial : un enfoque moderno 2ª ed.
Pearson Prentice Hall
[2] Rich, Elaine 1994
Inteligencia artificial 2ª ed McGraw-Hill
[3]
Figura 25. Lady Gaga (Cantante)
Como se puede ver hemos escogido famosos de distintos
ámbitos para que sean conocidos por el mayor número de
participantes posible.
9. REFERENCIAS
Mira, J. (José Mira Mira) 1995
Aspectos básicos de la inteligencia artificial
ed. Sanz y Torres
[4] Apuntes asignatura “Inteligencia en Redes de
Comunicaciones”.
Ingeniería de Telecomunicación, 5º
Universidad Carlos III de Madrid
[5] Es.wikipedia.org
http://es.wikipedia.org/wiki/
[6] www.lawebdelprogramador.com
[7] www.mathworks.com