"El aprendizaje es un proceso mediante el cual se construye activamente el conocimiento a través de la interacción del individuo con su entorno físico y social."
"El aprendizaje es un proceso social en el que los individuos adquieren conocimientos y habilidades a través de la interacción con otros miembros de su entorno cultural."
"El aprendizaje es el proceso de adquirir nuevas conductas o modificar conductas existentes a través de la asociación entre estímulos y respuestas, reforzadas por consecuencias."
¿Que es el aprendizaje? | ¿Cómo aprendo? |
---|---|
|
Responde lo siguiente
"El aprendizaje de símbolos es el proceso mediante el cual un sistema cognitivo adquiere y utiliza representaciones simbólicas para representar el conocimiento y realizar tareas cognitivas complejas."
Allen Newell y Herbert A. Simon
"El aprendizaje de símbolos es el proceso de adquirir, manipular y utilizar representaciones simbólicas para resolver problemas y realizar tareas cognitivas complejas."
John R. Anderson
"El aprendizaje de símbolos es el proceso de adquirir el conocimiento y la capacidad para manipular y combinar símbolos de manera significativa, lo cual permite el razonamiento y la comprensión de conceptos abstractos."
Douglas Hofstadter
Construyendo tu definición de concepto.
De acuerdo a tus definiciones anteriores y de expertos, ahora ¿qué sería el aprendizaje mecánico?
"Un programa de computadora se dice que aprende de una experiencia E con respecto a alguna tarea T y alguna medida de rendimiento P, si su rendimiento en T, medido por P, mejora con la experiencia E."
Tom M. Mitchell
Arthur Samuel
"El campo del aprendizaje mecánico se ocupa de desarrollar algoritmos que permiten a las computadoras aprender a partir de los datos, sin ser explícitamente programadas."
Tom Dietterich
"El aprendizaje mecánico se refiere al diseño y desarrollo de algoritmos que permiten a las computadoras aprender automáticamente a partir de los datos."
¿Qué es para tí un aprendizaje mecánico basado en símbolos?
Construyendo nuestra definción
Es un enfoque educativo y de aprendizaje que se basa en la idea de que el conocimiento se distribuye a través de conexiones y redes de información.
El conocimiento se ve como una red interconectada de información y experiencias. Los aprendices se conectan con diversas fuentes de información, como libros, videos, sitios web, expertos, compañeros de clase, entre otros, para obtener conocimientos y resolver problemas.
Redes de Conocimiento
El aprendizaje no se limita a un entorno formal de aula, sino que se produce en múltiples contextos y situaciones, tanto dentro como fuera del aula. Los aprendices pueden acceder al conocimiento y aprender de diversas fuentes y plataformas, como redes sociales, comunidades en línea, blogs y más.
Aprendizaje Distribuido
Los aprendices tienen un papel activo en su propio proceso de aprendizaje. Tienen la capacidad de definir sus objetivos, seleccionar las fuentes de información y elegir las actividades que mejor se adapten a sus necesidades y preferencias de aprendizaje.
Aprendizaje Autodirigido
El aprendizaje conectivista promueve la colaboración y el intercambio de conocimientos entre los aprendices. Los estudiantes pueden trabajar juntos, discutir temas, compartir recursos y ayudarse mutuamente a construir una comprensión más profunda del contenido.
Colaboración y Compartir
El aprendizaje no se limita a un momento específico en el tiempo o a un conjunto de temas. Los aprendices están en constante proceso de aprendizaje y adquisición de nuevos conocimientos a lo largo de su vida, adaptándose a las demandas y cambios en su entorno.
Aprendizaje Permanente
El aprendizaje conectivista se centra en la capacidad de los estudiantes para resolver problemas de la vida real y aplicar el conocimiento de manera efectiva en situaciones prácticas.
Enfoque en la Resolución de Problemas
Dado que los aprendices tienen un mayor control sobre su proceso de aprendizaje, el aprendizaje conectivista permite una mayor personalización para adaptarse a estilos de aprendizaje individuales y preferencias.
Aprendizaje Personalizado
Se basa en la idea de que la información está en constante cambio y que el aprendizaje se realiza de manera colaborativa y continua a través de conexiones y redes de conocimiento. Es un enfoque que abarca la era digital y las oportunidades que ofrece la tecnología para acceder a una gran cantidad de información y conectar con personas de todo el mundo.
Importante
Responde a lo siguiente:
¿Cuál sería tu definición de un aprendizaje mecánico conectivista?
Se recomienda revisar tus notas anteriores para llegar a una excelente definición
Algoritmo de aprendizaje automático y una arq. de red neuronal artificial
Resuelve problemas de clasificación binaria
Frank Rosenblatt en 1957
Fundamentales en el aprendizaje profundo y las redes
neuronales.
Inspirado en el funcionamiento del sistema nervioso humano
Diseñado para simular una sola neurona artificial
Objetivo es aprender a realizar una tarea de clasificación binaria
Recibe múltiples entradas numéricas, cada una multiplicada por un peso asociado. Los pesos representan la importancia relativa de cada entrada para el proceso de clasificación.
Entradas y pesos
Después de ponderar las entradas con los pesos, la suma ponderada se pasa a través de una función de activación que determina si la neurona se activa o no. La función de activación más comúnmente utilizada en el perceptrón es la función escalón o función de Heaviside, que devuelve 1 si la suma ponderada es mayor o igual que un umbral, y 0 en caso contrario.
Función de activación
Se entrena mediante el aprendizaje supervisado. Durante el entrenamiento, se proporcionan ejemplos etiquetados (conocidos) al perceptrón, y el algoritmo ajusta los pesos para minimizar el error entre las predicciones del perceptrón y las etiquetas correctas.
Aprendizaje supervisado
El algoritmo de entrenamiento del perceptrón ajusta los pesos de manera iterativa en función del error cometido en las predicciones. En cada iteración, el perceptrón realiza predicciones, compara con las etiquetas reales y actualiza los pesos para reducir el error.
Entrenamiento
incapacidad para resolver problemas no lineales. Solo puede separar clases que sean linealmente separables, lo que significa que los ejemplos de cada clase pueden ser divididos por una línea recta o un hiperplano en el espacio de características.
Limitaciones
En el desarrollo histórico de las redes neuronales y ha allanado el camino para modelos más complejos y poderosos, como las redes neuronales multicapa y los algoritmos de aprendizaje profundo, que han demostrado ser altamente eficaces en una amplia gama de tareas de aprendizaje automático y procesamiento de datos.
Importante
Que tenemos un conjunto de datos de entrenamiento con dos características (x1, x2) y dos clases (0 y 1). El objetivo es aprender un modelo de perceptrón que pueda separar las dos clases.
import numpy as np
class Perceptron:
def __init__(self, learning_rate=0.1, epochs=100):
self.learning_rate = learning_rate
self.epochs = epochs
self.weights = None
self.bias = None
def fit(self, X, y):
num_features = X.shape[1]
self.weights = np.zeros(num_features)
self.bias = 0
for _ in range(self.epochs):
for i in range(X.shape[0]):
prediction = self.predict(X[i])
error = y[i] - prediction
self.weights += self.learning_rate * error * X[i]
self.bias += self.learning_rate * error
def predict(self, x):
linear_output = np.dot(x, self.weights) + self.bias
return 1 if linear_output >= 0 else 0
# Datos de entrenamiento
X_train = np.array([[2, 3], [1, 5], [3, 2], [5, 1]])
y_train = np.array([0, 0, 1, 1])
# Crear el modelo del perceptrón
perceptron = Perceptron(learning_rate=0.1, epochs=100)
# Entrenar el modelo
perceptron.fit(X_train, y_train)
# Datos de prueba
X_test = np.array([[4, 4], [1, 1]])
# Realizar predicciones
predictions = [perceptron.predict(x) for x in X_test]
print(predictions) # Salida: [1, 0] (Clase 1, Clase 0)
https://www.academiajournals.com/tlahuac-registro
De tu proyecto:
Es un algoritmo ampliamente utilizado en el entrenamiento de redes neuronales artificiales, especialmente en redes neuronales multicapa.
Es un proceso iterativo de ajuste de los pesos y sesgos de las neuronas en la red para minimizar el error entre las salidas predichas por la red y los valores reales de entrenamiento.
Es fundamental en el aprendizaje supervisado en redes neuronales
Permite que la red "aprenda" a partir de los datos de entrenamiento y ajuste sus parámetros para realizar predicciones más precisas en el futuro.
Backpropagation fue desarrollado en la década de 1970.
Formalizado en un artículo en 1986 por David E. Rumelhart, Geoffrey E. Hinton y Ronald J. Williams titulado "Learning representations by back-propagating errors" (Aprendiendo representaciones mediante la retropropagación de errores)
import numpy as np
# Función de activación sigmoide y su derivada
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# Datos de entrenamiento
X = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
y = np.array([[0],
[1],
[1],
[0]])
# Inicialización de pesos y sesgos aleatorios
np.random.seed(1)
input_layer_size = X.shape[1]
hidden_layer_size = 4
output_layer_size = 1
weights_input_hidden = np.random.uniform(size=(input_layer_size, hidden_layer_size))
bias_hidden = np.random.uniform(size=(1, hidden_layer_size))
weights_hidden_output = np.random.uniform(size=(hidden_layer_size, output_layer_size))
bias_output = np.random.uniform(size=(1, output_layer_size))
# Parámetro de aprendizaje
learning_rate = 0.1
# Entrenamiento del modelo
epochs = 10000
for epoch in range(epochs):
# Fase de propagación hacia adelante
hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output
output_layer_output = sigmoid(output_layer_input)
# Cálculo del error
error = y - output_layer_output
# Fase de retropropagación del error
output_error = error * sigmoid_derivative(output_layer_output)
hidden_error = np.dot(output_error, weights_hidden_output.T) * sigmoid_derivative(hidden_layer_output)
# Actualización de pesos y sesgos
weights_hidden_output += np.dot(hidden_layer_output.T, output_error) * learning_rate
bias_output += np.sum(output_error, axis=0, keepdims=True) * learning_rate
weights_input_hidden += np.dot(X.T, hidden_error) * learning_rate
bias_hidden += np.sum(hidden_error, axis=0, keepdims=True) * learning_rate
# Predicción con el modelo entrenado
predictions = np.round(output_layer_output)
print("Predicciones finales:")
print(predictions)
Supongamos lo siguiente:
Tienes un conjunto de datos que contiene información sobre transacciones, como el monto de la transacción, la ubicación, el tipo de tarjeta utilizada, entre otros atributos.
El objetivo del proyecto es clasificar las transacciones como "fraudulentas" o "no fraudulentas" con base en estos atributos
La red neuronal aprenderá a asignar una probabilidad a cada transacción, (un valor entre 0 y 1) que representa la probabilidad de que la transacción sea fraudulenta.
Una transacción con una probabilidad de 0.8 podría interpretarse como una alta probabilidad de que sea fraudulenta, mientras que una transacción con una probabilidad de 0.2 podría interpretarse como una baja probabilidad de que sea fraudulenta.
Supongamos lo siguiente:
Tienes un conjunto de datos que contiene información sobre transacciones, como el monto de la transacción, la ubicación, el tipo de tarjeta utilizada, entre otros atributos.
El objetivo del proyecto es clasificar las transacciones como "fraudulentas" o "no fraudulentas" con base en estos atributos
Se establece un umbral (por ej, 0.5) clasificar las transacciones con una probabilidad mayor o igual al umbral como "fraudulentas" y en caso contrario "no fraudulentas".
Una transacción con una probabilidad de 0.8 podría interpretarse como una alta probabilidad de que sea fraudulenta, mientras que una transacción con una probabilidad de 0.2 podría interpretarse como una baja probabilidad de que sea fraudulenta.
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
# Datos de ejemplo: atributos de transacciones y etiquetas (0 para no fraudulenta, 1 para fraudulenta)
X = np.array([[2.3, 4.5], [3.1, 5.2], [1.8, 3.9], [4.2, 6.5]])
y = np.array([0, 0, 1, 1])
# Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Definir la arquitectura de la red neuronal
model = tf.keras.Sequential([
tf.keras.layers.Dense(8, activation='relu', input_shape=(2,)),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# Compilar el modelo
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Entrenar la red neuronal
model.fit(X_train, y_train, epochs=100, batch_size=1)
# Evaluar el modelo en el conjunto de prueba
loss, accuracy = model.evaluate(X_test, y_test)
print("Precisión en el conjunto de prueba:", accuracy)
# Realizar predicciones en nuevas transacciones
new_data = np.array([[2.0, 4.3], [3.5, 6.0]])
predictions = model.predict(new_data)
print("Predicciones:", predictions)
Técnica de entrenamiento utilizada en redes neuronales y modelos de I.A. para inducir la competencia entre unidades o neuronas en el proceso de aprendizaje.
Implica ajustar los pesos de las conexiones de la red para minimizar una función de pérdida global,
Se basa en la competencia entre unidades para activarse y aprender.
La unidad que se activa más fuertemente frente a una entrada particular "gana" la competencia y se activa
unidades se inhiben o reducen su activación
Representación dispersa de la información, donde solo algunas unidades específicas responden a estímulos particulares.
Aplicaciones, como la clasificación y agrupación de datos, la selección de características y la búsqueda de patrones.
Mapas auto-organizados (Self-Organizing Maps - SOM)
Redes neuronales competitivas
Redes de winner-take-all
Son redes neuronales que utilizan el aprendizaje competitivo para clasificar entradas en diferentes categorías.
Son una clase de redes neuronales competitivas utilizadas para el agrupamiento y visualización de datos multidimensionales.
Son modelos en los que solo la unidad más activa o "ganadora" se activa, mientras que las demás unidades se inhiben.
Supongamos que tienes un conjunto de datos con características numéricas que representan diferentes propiedades de ciertas flores, como longitud del sépalo, longitud del pétalo, ancho del sépalo y ancho del pétalo. Queremos agrupar estas flores en diferentes categorías (por ejemplo, diferentes especies) utilizando un SOM.
consiste en una red bidimensional de nodos o neuronas, donde cada neurona tiene un vector de pesos que es inicializado de manera aleatoria. Cada neurona representa una ubicación en el mapa y está asociada con un vector de características del mismo tamaño que los datos de entrada.
El proceso de aprendizaje competitivo se realiza iterativamente para cada ejemplo de entrenamiento
A medida que se presentan más ejemplos de entrenamiento, las neuronas aprenden a representar diferentes regiones o grupos de datos en el mapa. Finalmente, el SOM organiza los datos en un mapa bidimensional donde los ejemplos similares se agrupan juntos.
El proceso de aprendizaje competitivo se realiza iterativamente para cada ejemplo de entrenamiento
Este proceso de aprendizaje competitivo y organización topológica permite visualizar y comprender la estructura subyacente de los datos de entrada de manera eficiente. Los SOM son especialmente útiles para la visualización de grandes conjuntos de datos en espacios de alta dimensión y para la exploración de patrones y relaciones entre los datos.
A medida que se presentan más ejemplos de entrenamiento, las neuronas aprenden a representar diferentes regiones o grupos de datos en el mapa. Finalmente, el SOM organiza los datos en un mapa bidimensional donde los ejemplos similares se agrupan juntos.
import numpy as np
import random
class SelfOrganizingMap:
def __init__(self, input_dim, map_shape, learning_rate=0.1, epochs=100):
self.input_dim = input_dim
self.map_shape = map_shape
self.learning_rate = learning_rate
self.epochs = epochs
# Inicializar los pesos de las neuronas aleatoriamente
self.weights = np.random.rand(map_shape[0], map_shape[1], input_dim)
def find_best_matching_unit(self, example):
# Calcular las distancias euclidianas entre el ejemplo y los pesos de todas las neuronas
distances = np.linalg.norm(self.weights - example, axis=2)
# Obtener las coordenadas de la neurona ganadora
winner_coords = np.unravel_index(np.argmin(distances), distances.shape)
return winner_coords
def update_weights(self, example, winner_coords, iteration):
# Calcular la tasa de aprendizaje para esta iteración
learning_rate = self.learning_rate * (1 - iteration / self.epochs)
# Actualizar los pesos de las neuronas cercanas a la ganadora
for i in range(self.map_shape[0]):
for j in range(self.map_shape[1]):
distance_to_winner = np.linalg.norm(np.array([i, j]) - np.array(winner_coords))
influence = np.exp(-distance_to_winner / (2 * learning_rate**2))
self.weights[i, j, :] += learning_rate * influence * (example - self.weights[i, j, :])
def train(self, data):
for epoch in range(self.epochs):
for example in data:
winner_coords = self.find_best_matching_unit(example)
self.update_weights(example, winner_coords, epoch)
def get_map(self):
return self.weights.reshape(self.map_shape[0] * self.map_shape[1], self.input_dim)
# Ejemplo de datos de flores (longitud del sépalo, longitud del pétalo, ancho del sépalo, ancho del pétalo)
data = np.array([
[5.1, 3.5, 1.4, 0.2],
[4.9, 3.0, 1.4, 0.2],
[5.8, 2.6, 4.0, 1.2],
[6.7, 3.0, 5.2, 2.3],
# Agrega más ejemplos aquí
])
# Normalizar los datos para que estén en el rango [0, 1]
data = (data - data.min(axis=0)) / (data.max(axis=0) - data.min(axis=0))
# Definir las dimensiones de entrada y el tamaño del mapa SOM (por ejemplo, 3x3)
input_dim = data.shape[1]
map_shape = (3, 3)
# Crear e entrenar el SOM
som = SelfOrganizingMap(input_dim, map_shape)
som.train(data)
# Obtener el mapa resultante
map_result = som.get_map()
print(map_result)
Regla de Hebb o aprendizaje hebbiano
propuesta por el psicólogo Donald Hebb en 1949
Es importante en neurociencia y se ha utilizado para explicar cómo las sinapsis (conexiones entre neuronas) se fortalecen o debilitan en función de la actividad neuronal repetida.
"Las células que se disparan juntas, se conectan juntas"
Si una neurona A dispara una señal y, a continuación, otra neurona B también dispara una señal, entonces la conexión sináptica entre A y B se fortalece.
ΔW_ij = η * output_i * output_j
Supongamos que queremos crear una red neuronal simple que pueda asociar una serie de patrones de entrada con patrones específicos de salida. Asumiremos que tanto los patrones de entrada como los de salida son matrices binarias.
import numpy as np
# Función para aplicar la regla de Hebb y aprender la asociación entre patrones
def hebbian_learning(input_patterns, output_patterns):
num_patterns = len(input_patterns)
input_size = len(input_patterns[0])
output_size = len(output_patterns[0])
# Inicializar una matriz de pesos sinápticos con ceros
weights = np.zeros((input_size, output_size))
# Aplicar la regla de Hebb para cada par de patrones de entrada y salida
for i in range(num_patterns):
input_pattern = input_patterns[i]
output_pattern = output_patterns[i]
weights += np.outer(input_pattern, output_pattern)
# Normalizar los pesos para evitar saturación
weights = weights / num_patterns
return weights
# Ejemplo de patrones de entrada y salida
input_patterns = np.array([[1, 0, 1],
[0, 1, 0],
[1, 1, 1]])
output_patterns = np.array([[1, 1],
[0, 0],
[1, 0]])
# Aplicar la regla de Hebb para aprender la asociación entre los patrones
learned_weights = hebbian_learning(input_patterns, output_patterns)
# Ejemplo de entrada para recuperar el patrón de salida asociado
input_example = np.array([1, 0, 1])
output_associated = np.dot(input_example, learned_weights)
print("Pesos sinápticos aprendidos:")
print(learned_weights)
print("\nPatrón de salida asociado al patrón de entrada:")
print(output_associated)
Redes neuronales atractoras o redes dinámicas atractoras
Campo de la neurociencia computacional modelado Sys dinámicos
Propiedad de converger hacia estados estables llamados "atractores" en respuesta a diferentes patrones de entrada o condiciones iniciales.
Las neuronas interactúan entre sí y se influencian mutuamente a lo largo del tiempo mediante conexiones recurrentes.
A medida que la red procesa la información en el tiempo, tiende a converger hacia uno o varios estados estables.
Los estados estables son los atractores y representan patrones específicos o configuraciones de activación que la red puede mantener indefinidamente una vez que ha convergido hacia ellos.
Redes neuronales recurrentes, modela sistemas de comportamientos dinámicos complejos, (reconocimiento de patrones, memoria asociativa y procesamiento secuencial)
Atractores Punto
Atractores Ciclo:
Representan estados estables donde solo una combinación específica de activación neuronal es estable y cualquier pequeña perturbación en el sistema llevará a la red hacia ese estado particular. Son análogos a los puntos fijos en sistemas dinámicos.
Representan estados estables donde la red entra en un ciclo recurrente de activaciones neuronales que se repite de manera periódica. Estos ciclos pueden ser de diferentes longitudes, lo que significa que la red puede estabilizarse en diferentes secuencias de activación recurrente. Son análogos a los ciclos límite en sistemas dinámicos.
Utilizando una red atractora basada en las redes de Hopfield. Crearemos una red que puede recordar y recuperar patrones de entrada
import numpy as np
class HopfieldNetwork:
def __init__(self, num_neurons):
self.num_neurons = num_neurons
self.weights = np.zeros((num_neurons, num_neurons))
def train(self, patterns):
for pattern in patterns:
pattern_matrix = np.array(pattern).reshape(-1, 1)
self.weights += np.dot(pattern_matrix, pattern_matrix.T)
np.fill_diagonal(self.weights, 0)
def recall(self, input_pattern, max_iterations=10):
output_pattern = np.copy(input_pattern)
for _ in range(max_iterations):
new_output = np.dot(self.weights, output_pattern)
new_output[new_output >= 0] = 1
new_output[new_output < 0] = -1
if np.array_equal(new_output, output_pattern):
break
output_pattern = new_output
return output_pattern
# Ejemplo de patrones que la red aprenderá a recordar y recuperar
patterns = [
[1, -1, 1],
[-1, 1, -1],
[1, 1, 1],
]
# Creamos y entrenamos la red de Hopfield
hopfield_net = HopfieldNetwork(len(patterns[0]))
hopfield_net.train(patterns)
# Patrón de entrada para recuperar
input_pattern = np.array([1, -1, 1])
# Recuperamos el patrón y lo mostramos
recovered_pattern = hopfield_net.recall(input_pattern)
print("Patrón de entrada original: ", input_pattern)
print("Patrón recuperado: ", recovered_pattern)
patterns
.En el ejemplo anterior, se ha entrenado la red con tres patrones. si pruebas diferentes patrones de entrada se notará cómo la red recupera los patrones aprendidos.
Recuerda que la capacidad de almacenamiento y recuperación de patrones de una red de Hopfield puede depender de la cantidad y complejidad de los patrones utilizados durante el entrenamiento.
Algoritmos genéticos.
Vida artificial y aprendizaje social.
Relacionados con el aprendizaje en sistemas distribuidos o poblaciones de agentes que interactúan entre sí para resolver problemas de manera colectiva y adaptativa.
Inspirada en observaciones de comportamientos sociales y de enjambres en la naturaleza.
proceso de aprendizaje en el que los agentes individuales en un sistema distribuido observan y aprenden de las acciones o comportamientos de otros agentes en su entorno social.
Aprendizaje Mecánico Social
Los agentes pueden aprender directamente de la información que reciben de otros, imitando sus acciones o tomando decisiones basadas en la retroalimentación social.
Mejorar la eficiencia y la adaptabilidad del sistema. Usado aplicaciones donde la colaboración y la comunicación entre agentes son esenciales para alcanzar objetivos complejos.
Proceso en el que un comportamiento o conocimiento más complejo y sofisticado emerge en un sistema colectivo sin que exista una instrucción explícita o una autoridad central que lo dicte.
Aprendizaje Emergente
En lugar de ser programados o diseñados específicamente para realizar una tarea, los agentes individuales aprenden y adaptan su comportamiento a través de interacciones con el entorno y otros agentes.
Surge de la interacción y la autoorganización de los agentes individuales (patrones, estructuras y estrategias complejas que no eran previsibles inicialmente)
Útil en sistemas complejos donde no es posible anticipar todos los escenarios posibles o diseñar algoritmos precisos para cada situación.
Aprendizaje Emergente
Los agentes individuales aprenden y adaptan su comportamiento a medida que interactúan con su entorno y otros agentes, lo que lleva a un comportamiento emergente del sistema en su conjunto.
Se enfoca en cómo los agentes aprenden de otros en su entorno social
Aprendizaje Mecánico social
Se enfoca en cómo el comportamiento colectivo más complejo y sofisticado surge de la interacción y adaptación individual.
Aprendizaje Emergente
Son una técnica de optimización y búsqueda basada en la teoría de la evolución y la selección natural.
Inspirados en el proceso de selección natural que ocurre en la evolución biológica.
Algoritmo Genético (AG)
se utilizan para encontrar soluciones aproximadas a problemas de optimización y búsqueda en diversos campos.
Utilizado con éxito para resolver problemas de optimización, como la búsqueda de la mejor solución en un espacio de posibles soluciones muy grande y complejo
aplican en diversas áreas, como la ingeniería, la informática, la economía, la ciencia, entre otros.
útiles cuando no es posible encontrar una solución óptima en un tiempo razonable, y se busca una solución aproximada que sea suficientemente buena.
Representación del individuo
Selección
Etapas(AG)
Evaluación de la aptitud (fitness)
Operadores genéticos:
Reemplazo
Convergencia
Representación del individuo
Etapas(AG)
Cada solución potencial a un problema se representa como un "individuo" en una población. La representación puede ser una cadena de bits, una cadena de números, un vector, etc., dependiendo del problema en cuestión.
Evaluación de la aptitud (fitness)
Etapas(AG)
Cada individuo en la población se evalúa mediante una función de aptitud (también conocida como función de fitness). Esta función mide qué tan buena es cada solución para resolver el problema en cuestión. Los individuos con una mayor aptitud (valores más altos de la función de aptitud) se consideran más "aptos"
Selección
Etapas(AG)
Los individuos con una mayor aptitud tienen más probabilidades de ser seleccionados para formar parte de la próxima generación. La idea es que los individuos más aptos sean más propensos a transmitir sus características favorables a la siguiente generación, al igual que en la selección natural.
Operadores genéticos
Etapas(AG)
Se aplican operadores genéticos a los individuos seleccionados para simular procesos biológicos como la recombinación genética (crossover) y la mutación. La recombinación implica combinar características de dos individuos para crear nuevos descendientes, y la mutación implica cambiar aleatoriamente alguna característica en un individuo.
Reemplazo
Etapas(AG)
Después de aplicar los operadores genéticos, se forma una nueva población de individuos para la siguiente generación. Los individuos menos aptos pueden ser reemplazados por los nuevos descendientes más aptos, manteniendo el tamaño de la población constante.
Convergencia
Etapas(AG)
El proceso de selección, reproducción y reemplazo se repite durante varias generaciones. Con el tiempo, se espera que la población evolucione hacia soluciones cada vez mejores para el problema.
El agente viajero (TSP por sus siglas en inglés, Traveling Salesman Problem) es uno de los problemas clásicos que se pueden resolver utilizando algoritmos genéticos. El TSP es un problema de optimización combinatoria que busca encontrar la ruta más corta que visite todas las ciudades una vez y regrese a la ciudad de origen, pasando por cada ciudad exactamente una vez.
Los algoritmos genéticos son especialmente útiles para abordar problemas de optimización como el TSP, donde se necesita encontrar una solución entre un gran número de posibilidades y no hay un algoritmo determinístico y eficiente que pueda encontrar una solución óptima en tiempo polinómico.
Representación del individuo
Etapas(AG)
Cada individuo en la población se representa como una secuencia de ciudades, que representa el orden en el que el agente visitará las ciudades.
Preparando el AG
Función de aptitud:
Etapas(AG)
La función de aptitud evalúa qué tan corta es la distancia total de la ruta del agente viajero. En el TSP, la aptitud de un individuo está inversamente relacionada con la distancia total recorrida. Es decir, cuanto más corta sea la ruta, mayor será la aptitud del individuo.
Preparando el AG
Inicialización de la población
Etapas(AG)
Se crea una población inicial de individuos, donde cada individuo representa una ruta potencial del agente viajero.
Preparando el AG
Selección
Etapas(AG)
Los individuos se seleccionan para la reproducción en función de su aptitud. Los individuos más aptos tienen más probabilidades de ser seleccionados.
Preparando el AG
Operadores genéticos
Etapas(AG)
Se aplican operadores genéticos como el cruce (crossover) y la mutación para crear una nueva generación de individuos. En el cruce, se combinan partes de dos individuos para crear nuevos descendientes. La mutación introduce pequeños cambios aleatorios en los individuos para aumentar la diversidad de la población.
Preparando el AG
Reemplazo
Etapas(AG)
La nueva generación reemplaza a la generación anterior, y el proceso de selección, cruce y mutación se repite durante varias generaciones hasta que se alcance una condición de parada, como un número máximo de generaciones o un criterio de convergencia.
Preparando el AG
aunque los algoritmos genéticos pueden encontrar soluciones aproximadas al TSP,
no garantizan encontrar la solución óptima en todos los casos debido a su naturaleza estocástica.
Con el tiempo, los individuos más aptos en la población evolucionarán hacia rutas más cortas y cercanas a la solución óptima del TSP.
Notas sobre los AG
Sin embargo, son capaces de encontrar buenas soluciones en tiempos razonables, especialmente para instancias de tamaño mediano a grande del problema del agente viajero.
import numpy as np
import matplotlib.pyplot as plt
# Función para calcular la distancia entre dos ciudades
def distance(city1, city2):
return np.sqrt((city1[0] - city2[0])**2 + (city1[1] - city2[1])**2)
# Función de aptitud para el TSP (menor distancia total)
def fitness_function(route, cities):
total_distance = 0
for i in range(len(route) - 1):
total_distance += distance(cities[route[i]], cities[route[i+1]])
total_distance += distance(cities[route[-1]], cities[route[0]])
return 1 / total_distance
# Función para inicializar una población aleatoria de rutas
def initialize_population(population_size, num_cities):
population = []
for _ in range(population_size):
route = np.random.permutation(num_cities)
population.append(route)
return population
# Función para seleccionar individuos para el cruce mediante el método de ruleta
def selection(population, fitness_values):
probabilities = fitness_values / np.sum(fitness_values)
selected_indices = np.random.choice(len(population), size=len(population), p=probabilities)
return [population[index] for index in selected_indices]
# Función de cruce utilizando el operador de orden
def crossover(parent1, parent2):
start = np.random.randint(0, len(parent1))
end = np.random.randint(start + 1, len(parent1) + 1)
child = [-1] * len(parent1)
child[start:end] = parent1[start:end]
remaining_cities = [city for city in parent2 if city not in child]
child[:start] = remaining_cities[:start]
child[end:] = remaining_cities[start:]
return child
# Función de mutación utilizando el intercambio de dos ciudades
def mutation(route):
idx1, idx2 = np.random.choice(len(route), size=2, replace=False)
route[idx1], route[idx2] = route[idx2], route[idx1]
# Función principal del algoritmo genético
def genetic_algorithm(num_cities, population_size, generations):
# Generar ciudades aleatorias (coordenadas x, y)
cities = np.random.rand(num_cities, 2)
# Inicializar población aleatoria
population = initialize_population(population_size, num_cities)
best_fitness = -1
best_route = []
for generation in range(generations):
fitness_values = [fitness_function(route, cities) for route in population]
# Mantener el mejor individuo en cada generación
best_index = np.argmax(fitness_values)
if fitness_values[best_index] > best_fitness:
best_fitness = fitness_values[best_index]
best_route = population[best_index]
# Selección y cruce
parents = selection(population, fitness_values)
children = []
for i in range(0, len(parents), 2):
parent1 = parents[i]
parent2 = parents[i + 1]
child1 = crossover(parent1, parent2)
child2 = crossover(parent2, parent1)
children.extend([child1, child2])
# Mutación
for route in children:
if np.random.rand() < 0.2:
mutation(route)
population = children
# Agregar la ciudad inicial al final de la mejor ruta encontrada para formar un ciclo
best_route.append(best_route[0])
return cities, best_route
# Parámetros del algoritmo genético
num_cities = 15
population_size = 100
generations = 1000
# Ejecutar el algoritmo genético
cities, best_route = genetic_algorithm(num_cities, population_size, generations)
# Visualizar la mejor ruta encontrada
plt.figure(figsize=(8, 6))
plt.scatter(cities[:, 0], cities[:, 1], c='blue', marker='o', label='Ciudades')
plt.plot(cities[best_route, 0], cities[best_route, 1], c='red', marker='o', linestyle='-', label='Mejor Ruta')
plt.plot(cities[best_route[0], 0], cities[best_route[0], 1], c='green', marker='o', linestyle='-', label='Inicio')
plt.xlabel('Coordenada X')
plt.ylabel('Coordenada Y')
plt.title('Problema del Agente Viajero Resuelto por Algoritmo Genético')
plt.legend()
plt.grid(True)
plt.show()
Vida artificial
Campo interdisciplinario que estudia la vida y sistemas biológicos a través de modelos computacionales, simulaciones y experimentos en laboratorios.
Objetivo: comprender mejor la vida, evolución y los principios fundamentales de los sistemas vivos mediante la creación y estudio de sistemas que exhiban propiedades similares a las de estos
Busca crear entidades artificiales con comportamientos autónomos, evolutivos y emergentes, como los seres vivos.
Agentes inteligentes, autómatas celulares, algoritmos genéticos, redes neuronales artificiales, inspirados en la biología
Modelos informáticos para simular sistemas biológicos, creación de robots imitando comportamientos biológicos.
Investigación de algoritmos y técnicas que se inspiran en la naturaleza para resolver problemas complejos.
Aprendizaje Social
Aprendizaje que ocurre a través de la observación y la interacción con otros individuos en un entorno social.
Implica el proceso de adquirir conocimientos, habilidades y comportamientos a través de la observación de los demás, ya sean miembros de la misma especie o de diferentes especies.
Se busca desarrollar algoritmos y modelos que permitan a las máquinas aprender de forma social, ya sea mediante la observación de humanos o de otros agentes robóticos.
desarrollo de sistemas robóticos que puedan interactuar de manera más natural y colaborativa con los seres humanos y otros robots en entornos sociales y cooperativos.
Vida Artificial
Autómatas Celulares:
Vida Artificial
Algoritmos Genéticos:
Vida Artificial
Redes Neuronales Artificiales:
Aprendizaje social
Aprendizaje por Imitación en Robótica
Aprendizaje social
Aprendizaje por Imitación en Robótica
Lista tres diferencias entre la vida artificial y el aprendizaje social.