Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Práctica 3:
Enfriamiento Simulado, Búsqueda Local Reiteraday Evolución Diferencial para el
Problema del Aprendizaje de Pesos en Características
1
Índice
Referencias ………………..………………..…………... 13
2
Descripción del problema
• Tiempo se calcula como la media del tiempo de ejecución empleado por el algoritmo
para resolver cada caso del problema (cada conjunto de datos). Es decir, en nuestro
caso es la media del tiempo empleado por las 5 ejecuciones.
3
Descripción detallada de los algoritmos
Anteriores
k-NN (1-NN)
Si etiqueta_elem_test == etiqueta_elem_train
resultado_elemento = 1
En caso contrario
resultado_elemento = 0
Lo único que hace el algoritmo es usar un doble bucle for, para buscar el elemento
más cercano de training a cada uno de los de test.
Teniendo ya este resultado, el algoritmo guarda un 1 si las etiquetas de ambos
elementos coinciden, y un 0 en caso contrario.
Al final, devolvemos un vector con las soluciones de cada elemento.
Cabe destacar que este método ha sido generalizado para actuar también con pesos
y poder usarse en los otros algoritmos, y por tanto contiene un par más de parámetros
con ese fin.
4
Local Search
return pesos
Como se puede observar, lo único que hace este algoritmo es, partiendo de una
solución inicial aleatoria, crea vecinos de esta solución mediante mutaciones
aleatorias de valores de la solución hasta encontrar una mejor.
5
Una vez que encontramos una mejor, volvemos al principio pero partiendo de dicha
solución.
Nota: Se marca en rojo una de las condiciones que se estipulan para esta práctica.
Nuevos
Simulated Annealing
sol_actual ← sol_inicial
mejor_sol ← sol_inicial
if aceptamos vecino
exitos += 1
sol_actual = vecino
return mejor_sol
6
Iterative Local Search
mejor_sol ← sol_inicial
for I en max_iterations
vecino ← mutation(mejor_sol)
retun mejor_sol
Differential Evolution
CR = 0.5
poblacion ← poblacion inicial
for g en generaciones
for individuo_index en poblacion
padres_aleatorios = {p1, p2, p3}
k_aleatoria = {k1}
7
Nota: Se hace referencia en el pseudo-codigo a la funcion Funcion_Mutacion, que no
existe y que pretende denotar el uso de cualquiera de las dos funciones de
mutacionion que se usan en esta practica.
Simulated Annealing
initialTemp(…)
Calcula la temperatura inicial segun la formula:
coolingScheme(…)
Determina como enfria la temperatura segun la siguiente formula:
Genera_Vecino (…)
Tal y como indica su nombre, genera -a partir de una solucion actual-, una nueva
solucion vecina mediante una mutacion normal aleatoria.
metrop (de, t)
Define el criterio de aceptacion de soluciones. Acepta cuando la nueva solucion es
mejor o si un valor aleatorio entre 0 y 1 es menor que e−de/ t , con “de” diferencia entre
evaluaciones de ambas soluciones y “t” temperatura.
mutation(…)
Genera una solucion vecina generando aleatoriamente un numero de posiciones de
cromosomas y realizandoles mutaciones normales:
vecino = solucion_actual.copy()
for k en pos:
8
vecino[k] += random.normal(sigma = 0.4)
DE_Rand_1(…)
Genera el vector vecino segun la siguiente formula:
DE_currentToBest_1(…)
Genera el vector vecino segun la siguiente formula:
Generales
evaluateAccuracy(…)
Devuelve el valor de la tasa-clas entre 0 y 1 según los resultados obtenidos del k-NN
(teniendo en cuenta el umbral establecido para la simplicidad).
evaluateSimplicity(...)
Devuelve el valor de la tasa-red entre 0 y 1 según un valor de umbral dado para el
cual los pesos no se deberían de tener en cuenta.
evaluationFunction(...)
Devuelve el valor de la agr. (función evaluación) entre 0 y 1 según un α dado. Es
unicamente hacer la media de accuracy y simplicity.
StratifiedKFold (…)
Haciendo uso de la libreria sklearn, divide el conjunto de datos en tantas partas
iguales como queramos de forma que las proporciones se mantienen.
Una vez se hace esto, va intercambiando los conjuntos de entranamiento y test para
hacer validación cruzada, y usando dichos conjuntos en el algoritmo que se está
evaluando.
9
Análisis de los resultados
Para la obtención de los datos adjuntos se han usado los siguientes parámetros:
· Semilla aleatoria: 0
· Número de splits (cross-validation): 5
· Threshold o umbral de descarte de pesos: 0.2
· Sigma: 0.3 (0.4 para mutaciones en ILS)
Podemos ver cómo los algoritmos greedy de la primera práctica (fuera de la región
marcada en rojo) se van quedando muy por debajo de las soluciones de los
algoritmos mas sofisticados como los usados en esta practica. Esto se debe
principalmente a que, mientras que los greedy se centran principalmente en encontrar
la mejor solución en una región del espacio de soluciones reducido, todos estos
algoritmos intentan diversificar y explorar distintas regiones de dicho espacio.
Esta diversificación nos ayuda a salir de ciertos óptimos locales con mayor facilidad al
mismo tiempo que nos acercamos a una buena solución.
10
Aun asi, cabe destacar que pequeno cambios en la forma de determinar la
temperatura inicial o el esquema de enfriamiento pueden significar cambios
sustanciales en la calidad de este algoritmo.
Por otro lado, Iterative Local Search no deja de ser una Local Search que se repite y
“escala” las colinas hacia su pico, y por lo tanto es relativamente facil para este
algoritmo llegar a comportamientos parecidos a la Local Search simple y quedarse en
optimos locales.
Para intentar paliar algo este comportamiento, se anaden las mutaciones normales de
sigma = 0.4 en cada iteracion, pero como se puede observar en la tabla no llegan a
ser suficientes, siendo ILS el que peor resultados de agregado nos proporciona en
cualquier caso.
Por ultimo, Differential Evolution salta ya a tiempos bastante mas altos para todos los
casos, lo que no es de extranar si estamos evaluando generaciones enteras de
poblaciones repetidamente. DE es capaz de diversificar e intensificar a la vez de
forma muy efectiva. Es evidente que este comportamiento y extensivo analisis de
espacio de soluciones (con las mutaciones descritas) hacen que lleguemos las
soluciones de mayor calidad encontradas hasta ahora.
A efectos de esto ultimo, se ha hecho uso extensivo de numpy para tratar de hacer las
cosas de forma matricial (n-dimensional) y la libreria numba, que realiza una especie
de compilacion de ciertas funciones (@jit).
11
Utilización del código y organización de ficheros
El código, para esta práctica, se ha dividido en tres archivos distintos (uno por cada
algoritmo).
Tan sólo se deberá abrir el código fuente del algoritmo que se quiere probar y cambiar
los parámetros que se quieran.
Referencias
12