Рубрики
Без рубрики

Breve resentucción A Algoritmos Genéticos – Parte 2

EN La Primera Parte Vimos Que Eran Los Algoritmos Genéticos Y Cómo Applicarlos Para Encontrar El Máxim … Tagged с машинным обучением, Python, наукой данных.

EN La Primera Parte Vimos Qué Eran Los Algoritmos Genéticos y Cómo Applearlos Para Encontrar El Máximo (O El Mínimo) de Una Función. SIN EMBARGO, EL EJEMPLO Que Dimos Era Una Función Continua, Differenciable Y Con On Máximo Muy Carro:

y -2x ^ 2

Veremos en este post cómo Applicar EL MISMO ALGORITMO PERO PARA BUSCAR EL RESSUSTADO OPTIMO de Una Función No Bontua Más Compleja, Como Ser el Sourtunto de Ecuaciones que endól el ministro de educación hace unas semanas:

Определение эль-Система де Эквации

Los Algoritmos Genéticos Intentan Aproximarse A La Solución De ООН проблемный дадо. Hacen Esto Tratando de Minimizar O Maximizar Una Función. ¿ Cómo Podemos Репрезентар Este Flancea Como Algo Minimizar?

Una Forma Bosible Es La Siguiente:

def f(xyz):

  # calculator => x
  # book => y
  # computer => z

  x,y,z = xyz

  # 1
  s_1 = x + x + x
  s_2 = x + y + y
  s_3 = y - z * 2

  # 2
  err_1 = np.abs(s_1 - 30)
  err_2 = np.abs(s_2 - 18)
  err_3 = np.abs(s_3 - 2)

  # 3
  return np.sum([err_1, err_2, err_3])
  1. Escribimos LAS 3 ECUACIONES EN BASE LOS ARGENGOS x, y, z , que serán los que nuestro algoritmo genético produzca

  2. Calculamos El “Ошибка” de cada Ecuación, ES DECIR, Qué Tan Lejos Está La Suma Con Los Parámetros que Rense Del Resuldado Esperado

  3. Эль “Фитнес” de nuestro x, y, z Es la suma de todos los ошибок. Sta es es la función que Intentaremos минимизар

Поблачион

Al Igual Que en El Post Antiory Creamos Una Población Ишенский, Перо ESTA VEZ:

  1. Los Sideuos de la Población Son Tres Valores en vez de uno (x, y, z)

  2. Asumimos Que Las Soluciones Están Entry 1000 Y -1000

np.random.seed(1234) # make results reproducible.


def _r():
  return np.random.random() * 2000 - 1000


def random_individual(): 
  return np.array([_r(), _r(), _r()])


initial_generation_size = 1000
first_generation = [random_individual() for _ in range(initial_generation_size)]
pop = Population(chromosomes=first_generation, eval_function=f, maximize=False)

Esta Vez Seteamos максимизировать = Ложь Порка Queremos Minimizar, O Sea Hacer EL Ошибка lo más pequeño

Disteniendo La Evolución.

Prevaide Hicimos Todos Los Pasos de uno para que mas fácil entender el preceso pero la Либлируриа Эвол Tiene Una Función Para defire de Forma Más Concisa El Pippire De Evolución, El Objeto Эволюция :

def pick_parents(population):
  mom, dad = np.random.choice(population, size=2)
  return mom, dad


def make_child(mom, dad):
  mom_p = np.random.random() # percent of mom contribution
  dad_p = 1 - mom_p # percent of dad contribution
  mom_x, mom_y, mom_z = mom
  dad_x, dad_y, dad_z = dad
  x = mom_x * mom_p + dad_x * dad_p
  y = mom_y * mom_p + dad_y * dad_p
  z = mom_z * mom_p + dad_z * dad_p
  return np.array([x, y, z])


# add gaussian noise with mean zero.
def random_noise(individual, sigma):
  noise = np.random.normal(loc=0, scale=sigma, size=3)
  return individual + noise


best_of = []

def add_best_of(population):
  b = population.current_best
  best_of.append((b.chromosome, f(b.chromosome)))

evo = (Evolution()
      .survive(fraction=0.1)
      .breed(parent_picker=pick_parents, combiner=make_child)
      .mutate(mutate_function=random_noise, sigma=2)
      .callback(add_best_of))

Algunos разветвляет que valen la pena mencionar:

  • La Función make_child EN VEZ de Tomar El Promedio Elige Un Valor Al Azar Entre 0 Y 1, Toma El Porcentaje de la Madre Y Restante del Padre.

  • УСАМОС ООН AR ( Best_of ) y el крюк Перезвоните del objeto Эволюция Para Ir Acumulando Los Mejores Croomosomas de Cada Generación.

CON EL COPINE LISTO, Sólo Es Cuestión de Pasar La Población Eniacy y Pehirle Cuántas Generaciones Queremos:

new_generation = pop.evolve(evolution=evo, n=25)

ЛИСТО! ya tenemos en Best_of Los Mejores Exponentes de Cada Generación Y SU Valor de “Fitness”, Es Decir, Qué Tanto Minimizan EL Error de nuestra función y por lo tanto Энтуадран Мейор En El Sistema de Ecuaciones.

COMO La última VEZ, Suremos Cómo SE Увеличение EL Error A Els El Medida Que Se Van Creando Neevas Generaciones.

Томамо вендует COMO солюцион Los Valores de la última Generación:

x,y,z = best_of[-1][0]

10.155879542288524, 4.02024292752548, 0.92945755333642

Перо Ла Солуцион нет es la óptima 🤨

Нет, No Lo Es, El Algoritmo Peede No Encontrar El Mínimo (O Máximo) Global. En Este Caso, COMO Indea El Ministro La Respuesta Reventa Era:

x,, .

Sin Embargo, дифренчание де ESTE Sistema Sencillo de Ecuaciones, Hay Otros Donde La Respuesta 100% корректируют Нет Es edhia.

Nuestro Algoritmo Puede Генерализатор Bien A Estos Otros Проблема COMO Veremos A Continuación.

Modififando On Poco La Ecuación.

COMO TOUSOS CONOCERAN, ESTE ENUNCIADO FUE BLANCO DE CRITICAS POR quienes Pensaban Que la última Ecuación No Es Y – Z * 2 Sino Y – Z ^ z:

Para Resolver ESTA Variante Sólo TeneMos que Cambiar La Función A Minimizar Y Correr EL Programa Otra Vez:

def f2(xyz):

  # calculator => x
  # book => y
  # computer => z

  x,y,z = xyz

  # 1
  s_1 = x + x + x
  s_2 = x + y + y
  s_3 = y - z ** z # no longer y - 2 * z

  # 2
  err_1 = np.abs(s_1 - 30)
  err_2 = np.abs(s_2 - 18)
  err_3 = np.abs(s_3 - 2)

  # 3
  return np.sum([err_1, err_2, err_3])

initial_generation_size = 1000
first_generation = [random_individual() for _ in range(initial_generation_size)]
pop2 = Population(chromosomes=first_generation, eval_function=f2, maximize=False)

new_generation = pop2.evolve(evolution=evo, n=100)

Analizamos los Происхождение:

COMO WEMO, LOS Оширки Нет Converoded Esta Vez de Forma Tan Directa. SIN EMBARGO MUSTAS HUSTACHIONS ESTAN CON ООН ОШИБКА БАДЕ. Nos quedamos con los valores que tienen el mejor fit:

fits = [b[1] for b in best_of]
best_fit = np.argmin(fits)
x,y,z = best_of[best_fit][0]

x = 10.60, y = 9.13, z = 2.27
error: 15.27

Ошибка ООН DE “SOLAMESE” 15 puntos.

Выводит

  • Pudimos Adaptar Nuestro Algoritmo de Optimización A Una Nueva Función де Манера тривиаль

  • Estos Algoritmos No Llegan Siempre. Аль óptimo Global Sino Que Intentan Aproximarse A UNA Solución «достаточно хорошо»

  • ES Bosible Iterar La Solución. EN Ambos Casos Al Ver Los ResultdoS Nos Damos Cuenta de que nuestra intuición Генерал-дель-Ранго-де-Валорес óptimos (-1.000, 1.000) Era Exagerada. Podríamos Volver A Intentar Con Rango Más Razonable, de Hecho ES Bosible Lleger A Ошибка ООН MUY BAJO, DE CASI 1 PUNTO , Томандо ООН Ранго Мас Акотадо (ESTO Queda Como Ejercicio Para El Lecor)

Оригинал: “https://dev.to/fernandezpablo/breve-introduccion-a-algoritmos-geneticos-parte-2-2m7n”