Saltar al contenido
Aprendizaje Automático No Supervisado

Mapas auto-organizativos (SOM)

Introducción

Los mapas auto-organizativos (SOM, por sus siglas en inglés) son una técnica de aprendizaje automático no supervisado que tiene como objetivo encontrar patrones a partir de datos no etiquetados. Los SOM son redes neuronales artificiales que aprenden de manera no supervisada, es decir, sin la necesidad de tener etiquetas o categorías previas de los datos. Los SOM se utilizan comúnmente para visualizar y explorar grandes conjuntos de datos, y para clasificarlos mediante agrupamiento o clusterización. Una vez entrenado el SOM, cada neurona de la red representa una parte del espacio de entrada, y los patrones de entrada similares se representan en regiones cercanas en el mapa neuronales.

Los SOM son capaces de encontrar correlaciones y patrones subyacentes en los datos, lo que los hace útiles en tareas como la segmentación de usuarios, la identificación de relaciones entre variables o el análisis de series temporales. Además, la interpretación visual de los mapas neuronales puede ayudar a entender mejor la estructura y complejidad de los datos.

Resumen

Los mapas auto-organizativos (SOM, por sus siglas en inglés) son una técnica de aprendizaje automático no supervisado utilizada para agrupar datos en categorías o regiones en un espacio bidimensional o multidimensional. También son conocidos como mapas de Kohonen, en honor a su creador, Teuvo Kohonen. SOM funciona mediante la creación de un mapa de nodos que representan las categorías o grupos a los que se desea agrupar los datos. Cada nodo está asociado a un vector de peso, que representa una ubicación en el espacio multidimensional. En la fase de entrenamiento, los datos son introducidos al SOM y cada nodo se ajusta para aproximarse al grupo de datos que representa. Los nodos cercanos a los datos de entrada se ajustan más que los nodos más alejados. El proceso de entrenamiento se realiza iterativamente y es dividido en dos fases principales: una de propagación hacia adelante (feedforward) y otra de retropropagación (backpropagation).

En la fase de propagación hacia adelante, se calcula la distancia entre el vector de entrada y los vectores de peso de cada nodo y se selecciona el nodo que mejor se ajusta. En la fase de retropropagación, se ajustan los pesos de los nodos cercanos al nodo seleccionado para mejorar su aproximación. SOM se utiliza en una variedad de aplicaciones, como análisis de datos, clasificación y organización de información, y reconocimiento de patrones. Es especialmente útil en casos donde los datos no tienen etiquetas o información previa sobre categorías o grupos, ya que puede agruparlos de manera automática.

Aplicación teórica

Los mapas auto-organizativos (SOM, por sus siglas en inglés) son una técnica comúnmente utilizada en el aprendizaje no supervisado para visualizar patrones en conjuntos de datos complejos. Un ejemplo práctico de SOM podría ser el análisis de datos de ventas de una empresa. Supongamos que tenemos datos sobre el historial de ventas de varios productos en distintas regiones del país. Al aplicar SOM a estos datos, podríamos visualizar patrones en los hábitos de compra de los clientes en diferentes regiones, y agrupar los productos según las preferencias de los consumidores.

Usando esta información, nosotros podríamos adaptar nuestra estrategia de marketing para mejorar los resultados de ventas en cada región. Si descubrimos que ciertos productos son más populares en una región en particular, podemos concentrar nuestros esfuerzos de ventas e incluso considerar la posibilidad de ofrecer descuentos o promociones especiales para productos específicos. En esencia, la técnica SOM nos permite descubrir patrones complejos en nuestros datos y utilizar esa información para tomar mejores decisiones comerciales y ofrecer un mejor servicio al cliente.

Aplicación práctica

Un ejemplo práctico en Python utilizando la librería MiniSom. Primero te explico un poco sobre los Mapas Auto-Organizativos (SOM). Los SOM son una técnica de Aprendizaje No Supervisado que se utilizan para clasificar y visualizar datos complejos en un espacio-dimensional menor. El algoritmo SOM logra esto organizando las muestras de entrada en una red de neuronas interconectadas, donde las neuronas en la red tienen asociado un "vecino" de neuronas que influyen en ellas. En resumen, se trata de una herramienta de visualización y clustering de datos. Aquí tienes un ejemplo utilizando un dataset de 150 flores de iris, y reducirlos a 2 dimensiones y visualizarlos en un mapa som (6x6), lo que nos permitirá ver las clusters (o agrupaciones) en un espacio 2D.


import numpy as np
from sklearn import datasets
from minisom import MiniSom
import matplotlib.pyplot as plt

# Cargar los datos
iris = datasets.load_iris()
X = iris.data  # todas las características de la flor
y = iris.target  # las etiquetas o clases de la flor

# Normalizar los datos (entre 0 y 1)
X = np.apply_along_axis(lambda x: x/np.linalg.norm(x), 1, X)

# Definir el mapa SOM
som_map = MiniSom(x=6, y=6, input_len=4, sigma=1.0, learning_rate=0.5)

# Inicializar los pesos aleatoriamente
som_map.random_weights_init(X)

# Entrenar el mapa SOM
som_map.train_random(data=X, num_iteration=100)

# Visualizar los datos
plt.figure(figsize=(8, 8))
plt.pcolor(som_map.distance_map().T, cmap='gray_r')  # distancia de las neuronas en el SOM
plt.colorbar()

# Asignar las etiquetas a cada neurona en el mapa SOM
target = np.zeros(len(X), dtype=int)
for idx, val in enumerate(X):
    w = som_map.winner(val)
    target[idx] = y[w[0], w[1]]

# Visualización final
ttl = ('Mapa SOM para la clasificación de flores de iris\n'
       'Las etiquetas se representan como números\n'
       '0-Iris Setosa, 1-Iris Versicolour, 2-Iris Virginica')

markers = ['o', 's', 'D']
colors = ['r', 'g', 'b']
for cnt, xx in enumerate(X):
    w = som_map.winner(xx)  # posición de la neurona ganadora
    # 'o' en los marcadores - Iris Setosa
    # 's' en los marcadores - Iris Versicolour
    # 'D' en los marcadores - Iris Virginica
    plt.plot(w[0]+.5, w[1]+.5, markers[target[cnt]], markerfacecolor='None', markeredgecolor=colors[target[cnt]], markersize=12, markeredgewidth=2)

plt.axis([0, som_map.get_weights().shape[0], 0, som_map.get_weights().shape[1]])
plt.title(ttl, fontsize=14)
plt.show()
    

Este es solo un ejemplo básico de cómo se puede utilizar los mapas SOM en Python. La idea es que explores y experimentes con diferentes parámetros para lograr resultados más precisos en la visualización y clustering de tus datos.