Saltar al contenido principal

Mapas autoorganizativos: Una guía intuitiva con ejemplos en Python

Comprende los conceptos básicos de los Mapas Autoorganizativos y aprende a implementarlos en Python utilizando MiniSom.
Actualizado 20 dic 2024  · 40 min de lectura

Los mapas autoorganizados (SOM) son un tipo dered neuronal artificialque se utiliza para tareas de aprendizaje no supervisado, como la agrupación. Dado un conjunto de puntos de datos, el modelo aprende a dividir los datos en clusters. Los SOM proyectan datos multidimensionales complejos en una cuadrícula de dimensiones inferiores (normalmente, de 2 dimensiones). Esto facilita la visualización. Por tanto, los SOM también se utilizan para visualizar datos de alta dimensión. 

En este tutorial, exploramos los conceptos básicos de los SOM, su proceso de aprendizaje y sus casos de uso típicos. Explicamos cómo implementar un SOM en Python utilizando la biblioteca MiniSom y cómo representar los resultados visualmente. Por último, hablamos de hiperparámetros importantes en el entrenamiento de modelos SOM y de cómo afinarlos. 

Comprender los mapas autoorganizativos (SOM)

En esta sección, presentamos los conceptos básicos de los SOM, su proceso de aprendizaje y sus casos de uso. 

Conceptos básicos de los SOM

Los mapas autoorganizados implican una serie de conceptos que es importante comprender.

Neuronas

Un SOM es esencialmente una red de neuronas. Durante el entrenamiento, la neurona cuyo vector de pesos esté más próximo a un punto de datos de entrada ajusta sus pesos y los de sus vecinas para ajustarse aún más al punto de datos de entrada. A lo largo de muchas iteraciones, grupos de neuronas vecinas mapean puntos de datos relacionados. El resultado es la agrupación del conjunto de datos de entrada. 

Estructura reticular

Las neuronas de un SOM se organizan en forma de rejilla. Las neuronas vecinas mapean puntos de datos similares. Los conjuntos de datos más grandes necesitan una cuadrícula mayor. Normalmente, esta cuadrícula es bidimensional. La estructura de rejilla sirve como espacio de baja dimensión en el que se mapean los datos de alta dimensión. La cuadrícula ayuda a visualizar los patrones y agrupaciones de datos. 

Mapear puntos de datos

Cada punto de datos se compara con todas las neuronas utilizando una métrica de distancia. La neurona cuyo vector de pesos más se aproxime al punto de datos de entrada es la Unidad de Mejor Correspondencia (BMU) para ese punto de datos .

Una vez identificada la BMU, se actualizan los pesos de la BMU y de sus neuronas vecinas. Esta actualización acerca aún más la BMU y las neuronas vecinas al punto de datos de entrada. Este mapeo preserva la topología de los datos, garantizando que los puntos de datos similares se mapeen a neuronas cercanas. 

Proceso de aprendizaje de los SOM

El entrenamiento SOM se considera no supervisado porque no se basa en conjuntos de datos etiquetados. El objetivo del entrenamiento de los SOM es ajustar iterativamente los vectores de peso de las neuronas para que los puntos de datos similares se asignen a neuronas cercanas. 

Aprendizaje competitivo

Los SOM utilizan el aprendizaje competitivo (en lugar del descenso de gradiente y la retropropagación). Las neuronas compiten por convertirse en la Mejor Unidad de Emparejamiento (BMU) para cada punto de datos de entrada. Se determina que la neurona más cercana a un punto de datos es su BMU. La BMU y sus neuronas vecinas se actualizan para disminuir aún más su distancia al punto de datos. Las neuronas vecinas mapean los puntos de datos relacionados. Esto conduce a la especialización entre las neuronas y a la agrupación de los puntos de datos de entrada. 

Funciones de distancia 

Los SOM utilizan una función de distancia para medir la distancia entre las neuronas y los puntos de datos. Esta distancia se utiliza para determinar la BMU de cada punto de datos. MiniSom tiene cuatro funciones de distancia para elegir: 

Función vecinal

Tras identificar la BMU de un punto de datos, la BMU y sus neuronas vecinas se actualizan en la dirección de ese punto de datos. La función de vecindad garantiza que el SOM mantenga las relaciones topológicas de los datos de entrada. La función de vecindad decide:

  • Qué neuronas se consideran vecinas de la BMU
  • El grado de actualización de las neuronas vecinas. En general, las neuronas más cercanas a la BMU reciben un ajuste mayor que las más alejadas

MiniSom viene con tres funciones de barrio: 

  • Gaussiano (por defecto). 
  • Burbuja 
  • Sombrero mexicano
  • Triangle

Proceso iterativo

El proceso de aprendizaje en los SOM se produce a lo largo de varias iteraciones. En cada iteración, el SOM procesa muchos puntos de datos de entrada. Esquematizamos el proceso de aprendizaje en los siguientes pasos:

  • Cuando comienza el entrenamiento, se inicializan (aleatoriamente) los pesos de todas las neuronas. 
  • Dado un punto de datos de entrada, cada neurona calcula su distancia a la entrada.
    • La neurona con la distancia más pequeña es declarada la BMU. 
  • Los pesos de la BMU y sus vecinas se ajustan para acercarse al vector de entrada. El alcance de este ajuste se decide mediante:
    • Una función de vecindad: Las neuronas más alejadas de la BMU se actualizan menos que las más cercanas a la BMU. Esto preserva la estructura topológica de los datos. 
    • Ritmo de aprendizaje: Una tasa de aprendizaje más alta conlleva actualizaciones mayores. 

Estos pasos se repiten durante muchas iteraciones, pasando por muchos puntos de datos de entrada. Los pesos se actualizan gradualmente para que el mapa se autoorganice y capte la estructura de los datos. 

La tasa de aprendizaje y el radio de vecindad suelen disminuir con el tiempo, lo que permite al SOM afinar los pesos gradualmente. Más adelante en el tutorial, implementamos los pasos del proceso de entrenamiento iterativo utilizando código Python. 

Casos de uso típicos de los SOM

Dada su arquitectura única, los SOM tienen varias aplicaciones típicas en el aprendizaje automático, el análisis y la visualización.

Agrupación

Los SOM se utilizan para agrupar datos de alta dimensión en clusters de puntos de datos similares. Esto ayuda a identificar las estructuras inherentes a los datos. Cada neurona mapea puntos de datos estrechamente relacionados y los puntos de datos similares se mapean a la misma neurona o a neuronas vecinas, formando así clusters distintos. 

Por ejemplo, en marketing, los SOM pueden agrupar a los clientes en función de su comportamiento de compra. Esto permitiría a una marca adaptar las estrategias de marketing a diferentes segmentos de clientes (clusters).

Reducción de la dimensionalidad

Los SOM pueden mapear datos de alta dimensión con muchos vectores de características en una cuadrícula con menos dimensiones (normalmente, una cuadrícula de 2 dimensiones). Como este mapeo conserva las relaciones entre los puntos de datos, la dimensionalidad reducida facilita la visualización de conjuntos de datos complejos sin una pérdida significativa de información.

Además de facilitar las tareas de visualización y análisis, los SOM también pueden reducir la dimensionalidad de los datos antes de aplicar otros algoritmos de aprendizaje automático. Los SOM también se utilizan en el procesamiento de imágenes para reducir el número de características agrupando píxeles o regiones con características similares, lo que hace más eficaces las tareas de reconocimiento y clasificación de imágenes. 

Detección de anomalías

Durante el proceso de entrenamiento, la mayoría de los puntos de datos se asignan a neuronas específicas. Las anomalías (puntos de datos que no encajan bien en ningún conglomerado) suelen asignarse a neuronas distantes o menos pobladas. Estos valores atípicos no encajan bien en los conglomerados aprendidos y se asignan a neuronas alejadas de la BMU de puntos de datos normales.

Por ejemplo, mapear las transacciones financieras en una cuadrícula SOM nos permite identificar actividades inusuales (valores atípicos) que pueden indicar una actividad potencialmente fraudulenta. 

Visualización de datos

La visualización de datos es uno de los casos de uso más comunes de los SOM. Los datos de alta dimensión son difíciles de visualizar. Los SOM facilitan la visualización reduciendo la dimensionalidad de los datos y proyectándolos en una cuadrícula bidimensional. Esto también puede ayudar a detectar agrupaciones en los datos y puntos de datos anómalos que sería complicado descubrir en los datos originales. 

Por ejemplo, la visualización de datos facilita el análisis de datos de población de alta dimensión. Mapear los datos en una cuadrícula 2D ayudaría a detectar similitudes y diferencias entre los distintos grupos de población.  

Tras exponer los conceptos básicos y los casos de uso de los SOM, en los siguientes apartados mostraremos cómo implementarlos utilizando el paquete MiniSom de Python. 

Puedes acceder al código completo y ejecutarlo en este cuaderno DataLab.

Desarrolla habilidades de aprendizaje automático

Eleva tus habilidades de aprendizaje automático al nivel de producción.
Empieza a aprender gratis

Configurar el entorno para SOM

Antes de construir el SOM, tenemos que preparar el entorno con los paquetes necesarios. 

Instalar bibliotecas Python 

Necesitamos estos paquetes: 

  • MiniSom es una herramienta de Python basada en NumPy que crea y entrena SOMs. 
  • NumPy se utiliza para acceder a funciones matemáticas como dividir matrices, obtener valores únicos, etc. 
  • matplotlib se utiliza para trazar diversos gráficos y diagramas para visualizar los datos. 
  • El paquete datasets de sklearn se utiliza para importar conjuntos de datos sobre los que aplicar el SOM .
  • El paquete MinMaxScaler de sklearn normaliza el conjunto de datos .

El siguiente fragmento de código importa estos paquetes: 

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

Preparar el conjunto de datos

En este tutorial, utilizamos MiniSom para construir un SOM y luego lo entrenamos con el conjunto de datos canónico IRIS. Este conjunto de datosconsta de 3 clases de plantas de iris. Cada clase tiene 50 instancias. Para preparar los datos, seguimos estos pasos: 

  • Importa el conjunto de datos Iris de sklearn,
  • Extrae los vectores de datos y los escalares objetivo. 
  • Normaliza los vectores de datos. En este tutorial, utilizamos el MinMaxScaler de scikit-learn
  • Declara un conjunto de etiquetas para cada una de las tres clases de plantas Iris. 

El siguiente código implementa estos pasos: 

dataset_iris = datasets.load_iris()
data_iris = dataset_iris.data
target_iris = dataset_iris.target
data_iris_normalized = MinMaxScaler().fit_transform(data_iris)
labels_iris = {1:'1', 2:'2', 3:'3'}
data = data_iris_normalized
target = target_iris

Implementación de mapas autoorganizativos (SOM) en Python

Para implementar un SOM en Python, definimos e inicializamos la malla antes de entrenarla con el conjunto de datos. A continuación, podemos visualizar las neuronas entrenadas y el conjunto de datos agrupados. 

Definir la malla SOM

Como ya se ha explicado, un SOM es una red de neuronas. Con MiniSom podemos crear cuadrículas bidimensionales. Las dimensiones X e Y de la cuadrícula son el número de neuronas a lo largo de cada eje. Para definir la malla SOM, también tenemos que especificar:

  • Las dimensiones X e Y de la cuadrícula
  • El número de variables de entrada: es el número de filas de datos. 

Declara estos parámetros como constantes de Python:

SOM_X_AXIS_NODES  = 8
SOM_Y_AXIS_NODES  = 8
SOM_N_VARIABLES  = data.shape[1]

El código de ejemplo que aparece a continuación ilustra cómo declarar la rejilla utilizando MiniSom:

som = MiniSom(SOM_X_AXIS_NODES, SOM_Y_AXIS_NODES, SOM_N_VARIABLES)

Los dos primeros parámetros son el número de neuronas a lo largo de los ejes X e Y, y el tercer parámetro es el número de variables. 

Declaramos otros parámetros e hiperparámetros al crear la malla SOM. Los explicaremos más adelante en el tutorial. De momento, declara estos parámetros como se muestra a continuación: 

ALPHA = 0.5
DECAY_FUNC = 'linear_decay_to_zero'
SIGMA0 = 1.5
SIGMA_DECAY_FUNC = 'linear_decay_to_one'
NEIGHBORHOOD_FUNC = 'triangle'
DISTANCE_FUNC = 'euclidean'
TOPOLOGY = 'rectangular'
RANDOM_SEED = 123

Crea un SOM utilizando estos parámetros:

som = MiniSom(
        SOM_X_AXIS_NODES,
        SOM_Y_AXIS_NODES,
        SOM_N_VARIABLES,
        sigma=SIGMA0,
        learning_rate=ALPHA,
        neighborhood_function=NEIGHBORHOOD_FUNC,
        activation_distance=DISTANCE_FUNC,
        topology=TOPOLOGY,
        sigma_decay_function = SIGMA_DECAY_FUNC,
        decay_function = DECAY_FUNC,
        random_seed=RANDOM_SEED,
        )

Inicializar las neuronas

El comando anterior crea un SOM con pesos aleatorios para todas las neuronas. Inicializar las neuronas con pesos extraídos de los datos (en lugar de números aleatorios) puede hacer que el proceso de entrenamiento sea más eficaz. 

Cuando se utiliza MiniSom para crear un Mapa Autoorganizado (SOM), hay dos formas de inicializar los pesos de las neuronas en función de los datos:

  • Inicialización aleatoria: Los pesos iniciales de las neuronas se extraen aleatoriamente de los datos de entrada. Para ello, aplicamos la función .random_weights_init() al SOM .
  • Inicialización del PCA: La inicialización del Análisis de Componentes Principales (ACP) utiliza los componentes principales de los datos de entrada depara inicializar los pesos. Los pesos iniciales de las neuronas abarcan los dos primeros componentes principales. Esto suele conducir a una convergencia más rápida. 

En esta guía, utilizamos la inicialización PCA. Para aplicar la inicialización PCA a los pesos SOM, utiliza la función .pca_weights_init() como se muestra a continuación:

som.pca_weights_init(data)

Entrenamiento del SOM

El proceso de entrenamiento actualiza los pesos del SOM para minimizar la distancia entre las neuronas y los puntos de datos. 

A continuación, explicamos el proceso de entrenamiento iterativo:

  • Inicialización: Los vectores de peso de todas las neuronas se inicializan, normalmente con valores aleatorios. También es posible inicializar los pesos muestreando la distribución de los datos de entrada.
  • Selección de entrada: Se selecciona (aleatoriamente) un vector de entrada del conjunto de datos de entrenamiento.
  • Identificación de la BMU: La neurona con el vector de pesos más cercano al vector de entrada se identifica como la BMU. 
  • Actualización del barrio: La BMU y sus neuronas vecinas actualizan sus vectores de peso. El ritmo de aprendizaje y la función de vecindad deciden qué neuronas se actualizan y en qué medida. En el paso de iteración tdado el vector de entrada xel vector peso de la neurona i como wila tasa de aprendizaje (t)y la función de vecindad hbi (esta función cuantifica el grado de actualización de la neurona i dada la neurona BMU b), la fórmula de actualización del peso de la neurona i se expresa como
  • Tasa de decaimiento de la tasa de aprendizaje y radio de vecindad: Tanto la velocidad de aprendizaje como el radio de vecindad disminuyen con el tiempo. En las primeras iteraciones, el proceso de entrenamiento realiza ajustes mayores en un vecindario más amplio. Las iteraciones posteriores ayudan a afinar los pesos realizando cambios más pequeños en los pesos de las neuronas adyacentes. Esto permite que el mapa se estabilice y converja. 

Para entrenar el SOM, presentamos el modelo con los datos de entrada. Podemos elegir uno de los dos enfoques para hacerlo: 

  • Elige muestras al azar de los datos de entrada. La función .train_random() pone en práctica esta técnica .
  • Recorre secuencialmente los vectores de los datos de entrada. Esto se hace utilizando la función .train_batch().

Estas funciones aceptan como parámetros los datos de entrada y el número de iteraciones. En esta guía utilizamos la función .train_random() . Declara el número de iteraciones como una constante y pásalo a la función de entrenamiento: 

N_ITERATIONS = 5000
som.train_random(data, N_ITERATIONS, verbose=True)  

Tras ejecutar el script y completar el entrenamiento, aparece un mensaje con el error de cuantización:

quantization error: 0.05357240680504421 

El error de cuantización indica la cantidad de información que se pierde cuando el SOM cuantiza (reduce la dimensionalidad) los datos. Un error de cuantización grande indica una mayor distancia entre las neuronas y los puntos de datos. También significa que la agrupación es menos fiable. 

Visualización de las neuronas SOM 

Ahora tenemos un modelo SOM entrenado. Para visualizarlo, utilizamos un mapa de distancias (también conocido como U-matrix). El mapa de distancias muestra las neuronas del SOM como una cuadrícula de celdas. El color de cada célula representa su distancia a las neuronas vecinas. 

El mapa de distancias es una cuadrícula con las mismas dimensiones que el SOM. Cada celda del mapa de distancias es la suma normalizada de las distancias (euclidianas) entre una neurona y sus vecinas. 

Accede a SOM distance map utilizando la función .distance_map(). Para generar la matriz U, seguimos estos pasos:

  • Utiliza pyplot para crear una figura con las mismas dimensiones que el SOM. En este ejemplo, las dimensiones son 8x8. 
  • Traza el mapa de distancias con matplotlib utilizando la función .pcolor(). En este ejemplo, utilizamos gist_yarg como esquema de color
  • Muestra el colorbar, un índice que asigna diferentes colores a diferentes valores escalares. En este caso, como las distancias están normalizadas, los valores escalares de distancia van de 0 a 1. 

El código siguiente implementa estos pasos: 

# create the grid
plt.figure(figsize=(8, 8))
#plot the distance map
plt.pcolor(som.distance_map().T, cmap='gist_yarg') 
# show the color bar
plt.colorbar()
plt.show()

En este ejemplo, la matriz U utiliza un esquema de colores monótono. Se puede entender siguiendo estas pautas:

  • Los tonos más claros representan neuronas muy próximas entre sí, y los más oscuros, neuronas más alejadas unas de otras. 
  • Los grupos de tonos más claros pueden interpretarse como agrupaciones. Los nodos oscuros entre los conglomerados pueden interpretarse como los límites entre conglomerados. 

Figura 1: Matriz en U del conjunto de datos Iris

Figura 1: Matriz U del SOM entrenado en el conjunto de datos Iris (imagen del autor)

Evaluación de los resultados de la agrupación SOM

La figura anterior ilustraba gráficamente las neuronas del SOM. En esta sección, mostramos cómo visualizar la forma en que el SOM agrupó los datos. 

Identificación de agrupaciones

Superponemos marcadores sobre la matriz en U anterior para denotar qué clase de planta Iris representa cada célula (neurona). Para ello:

  • Como antes, crea una figura de 8x8 utilizando pyplot, traza el mapa de distancias y muestra la barra de colores .
  • Especifica una matriz de tres marcadores matplotlib, uno para cada clase de planta Iris. 
  • Especifica una matriz de tres códigos de color matplotlib, uno para cada clase de planta Iris.
  • Traza iterativamente la neurona ganadora para cada punto de datos:
    • Determina la (coordenadas de la) neurona ganadora para cada punto de datos utilizando la función .winner(). 
    • Traza la posición de cada neurona ganadora en el centro de cada celda de la cuadrícula. w[0] y w[1] dan las coordenadas X e Y de la neurona, respectivamente. Se añade un valor de 0,5 a cada coordenada para trazarla en el centro de la celda. 

El código siguiente muestra cómo hacerlo:

# plot the distance map
plt.figure(figsize=(8, 8))
plt.pcolor(som.distance_map().T, cmap='gist_yarg') 
plt.colorbar()
# create the markers and colors for each class
markers = ['o', 'x', '^']
colors = ['C0', 'C1', 'C2']
# plot the winning neuron for each data point
for count, datapoint in enumerate(data):
    # get the winner
    w = som.winner(datapoint)  
    # place a marker on the winning position for the sample data point
    plt.plot(w[0]+.5, w[1]+.5, markers[target[count]-1], markerfacecolor='None',
             markeredgecolor=colors[target[count]-1], markersize=12, markeredgewidth=2)
plt.show()

La imagen resultante se muestra a continuación: 

Matriz U superpuesta con marcadores de clase

Figura 2: Matriz U superpuesta con marcadores de clase (imagen del autor)

Según la documentación del conjunto de datos Iris, "una clase es linealmente separable de las otras 2; estas últimas no son linealmente separables entre sí". En la matriz U anterior, estas tres clases están representadas por tres marcadores: triángulo, círculo y cruz. 

Observa que no hay un límite claro entre los círculos azules y las cruces naranjas. Además, en muchas células se superponen dos clases en la misma neurona. Esto significa que la neurona es equidistante de ambas clases. 

Visualizar el resultado de la agrupación

Un SOM es un modelo de agrupación. Los puntos de datos similares se asignan a la misma neurona. Los puntos de datos de la misma clase se asignan a un grupo de neuronas vecinas. Trazamos todos los puntos de datos en la cuadrícula SOM para estudiar mejor el comportamiento de agrupación. 

Los pasos siguientes describen cómo crear este gráfico de dispersión:

  • Obtén las coordenadas X e Y de la neurona ganadora para cada punto de datos. 
  • Traza el mapa de distancias, como hicimos para la figura 1.
  • Utiliza plt.scatter() para hacer un diagrama de dispersión de todas las neuronas ganadoras para cada punto de datos. Añade un desplazamiento aleatorio a cada punto para evitar solapamientos entre puntos de datos dentro de la misma celda.

Ejecutamos estos pasos en el código siguiente: 

# get the X and Y coordinates of the winning neuron for each data pointw_x, w_y = zip(*[som.winner(d) for d in data])
w_x = np.array(w_x)
w_y = np.array(w_y)
# plot the distance map
plt.figure(figsize=(8, 8))
plt.pcolor(som.distance_map().T, cmap='gist_yarg', alpha=.2)
plt.colorbar()
# make a scatter plot of all the winning neurons for each data point
# add a random offset to each point to avoid overlaps
for c in np.unique(target):
    idx_target = target==c
    plt.scatter(w_x[idx_target]+.5+(np.random.rand(np.sum(idx_target))-.5)*.8,
                w_y[idx_target]+.5+(np.random.rand(np.sum(idx_target))-.5)*.8,
                s=50, 
                c=colors[c-1], 
                label=labels_iris[c+1]
                )
plt.legend(loc='upper right')
plt.grid()
plt.show()

El siguiente gráfico muestra el diagrama de dispersión de salida:

Diagrama de dispersión de los puntos de datos dentro de las celdas Figura 3: Diagrama de dispersión de los puntos de datos dentro de las celdas (imagen del autor)

En el diagrama de dispersión anterior, observa que 

  • Algunas células contienen puntos azules y naranjas. 
  • Los puntos verdes están claramente separados del resto de los datos, pero los puntos azules y naranjas no están claramente separados. 
  • Las observaciones anteriores coinciden con el hecho de que sólo uno de los tres grupos del conjunto de datos Iris tiene un límite claro. 
  • En Figura 1los nodos oscuros entre los conglomerados (que pueden interpretarse como los límites entre conglomerados) coinciden con las celdas vacías del diagrama de dispersión.

Puedes acceder al código completo y ejecutarlo en este cuaderno DataLab

Ajuste del modelo SOM

Las secciones anteriores mostraban cómo crear y entrenar un modelo SOM y cómo estudiar los resultados visualmente. En esta sección, tratamos cómo ajustar el rendimiento de los modelos SOM. 

Hiperparámetros clave a ajustar

Como ocurre con cualquier modelo de aprendizaje automático, los hiperparámetros influyen considerablemente en el rendimiento del modelo. 

Algunos de los hiperparámetros importantes en el entrenamiento de los SOM son:

  • El tamaño de la cuadrícula decide el tamaño del mapa. El número de neuronas de un mapa con un tamaño de cuadrícula de AxB es A*B. 
  • La tasa de aprendizaje decide cuánto cambian los pesos en cada iteración. Fijamos la tasa de aprendizaje inicial, y ésta disminuye con el tiempo según la función de decaimiento. 
  • La función de decaimiento decide en qué medida disminuye el ritmo de aprendizaje en cada iteración posterior.
  • La función de vecindad es una función matemática que especifica qué neuronas deben considerarse vecinas de la BMU.
  • La desviación típica especifica la dispersión de la función de vecindad. Por ejemplo, una función de vecindad gaussiana con una desviación típica elevada tendrá una vecindad mayor que la misma función con una desviación típica menor. Fijamos la desviación típica inicial, que disminuye con el tiempo según la función de decaimiento sigma. 
  • El decaimiento sigma controla cuánto se reduce la desviación típica en cada iteración posterior.
  • El número de iteraciones de entrenamiento decide cuántas veces se actualizan los pesos. En cada iteración de entrenamiento, los pesos de las neuronas se actualizan una vez. 
  • La función distancia es una función matemática que calcula la distancia entre neuronas y puntos de datos.
  • La topología decide la disposición de la estructura de la rejilla. Las neuronas de la rejilla pueden disponerse en forma rectangular o hexagonal. 

En la siguiente sección, discutiremos las directrices para establecer los valores de estos hiperparámetros. 

Impacto del ajuste de los hiperparámetros

Los valores de los hiperparámetros deben decidirse en función del modelo y del conjunto de datos. Hasta cierto punto, determinar estos valores es un proceso de ensayo y error. En esta sección, damos pautas para afinar cada hiperparámetro. Junto a cada hiperparámetro, mencionamos (entre paréntesis) las respectivas constantes Python utilizadas en el código de ejemplo.

  • Tamaño de la cuadrícula (SOM_X_AXIS_NODES y SOM_X_AXIS_NODES): El tamaño de la cuadrícula depende del tamaño del conjunto de datos. La regla general es que, dado un conjunto de datos de tamaño N, la cuadrícula debe contener aproximadamente 5*sqrt(N) neuronas. Por ejemplo, si el conjunto de datos tiene 150 muestras, la cuadrícula debe contener 5*sqrt(150) = aproximadamente 61 neuronas. En este tutorial, el conjunto de datos Iris tiene 150 filas y utilizamos una cuadrícula de 8x8. 
  • Tasa de aprendizaje inicial (ALPHA): Una tasa más alta acelera la convergencia, mientras que las tasas más bajas se utilizan para ajustes más finos después de las primeras iteraciones. La tasa de aprendizaje inicial debe ser lo suficientemente grande como para permitir una adaptación rápida, pero no tanto como para sobrepasar los valores óptimos de peso. En este artículo, la tasa de aprendizaje inicial es 0,5. 
  • Desviación típica inicial (SIGMA0): Determina el tamaño inicial o la extensión del barrio. Un valor mayor considera patrones más globales. En este ejemplo, utilizamos una desviación típica inicial de 1,5. 
  • Para la tasa de desintegración (DECAY_FUNC ) y la tasa de decaimiento sigma (SIGMA_DECAY_FUNC ), podemos elegir entre uno de los tres tipos de funciones de decaimiento :
    • Decaimiento inverso: Esta función es adecuada si los datos tienen patrones tanto globales como locales. En estos casos, necesitamos una fase más larga de aprendizaje general antes de centrarnos en los patrones locales. 
    • Decaimiento lineal: Esto es bueno para conjuntos de datos en los que queremos una reducción constante y uniforme del tamaño del vecindario o de la tasa de aprendizaje. Esto es útil si los datos no necesitan mucho ajuste.
    • Decaimiento asintótico: Esta función es útil si los datos son complejos y de alta dimensión. En estos casos, es mejor dedicar más tiempo a la exploración global antes de pasar gradualmente a detalles más finos. 
  • Función de vecindad (NEIGHBORHOOD_FUNC): La elección por defecto de la función de vecindad es la función gaussiana. También se utilizan otras funciones, como se explica a continuación. 
    • Gaussiano (por defecto): Se trata de una curva en forma de campana. El grado de actualización de una neurona disminuye suavemente a medida que aumenta su distancia a la neurona ganadora. Proporciona una transición suave y continua y preserva la topología de los datos. Es adecuado para la mayoría de los fines generales debido a su comportamiento estable y predecible.
    • Burbuja: Esta función crea un barrio de anchura fija. Todas las neuronas dentro de este vecindario se actualizan por igual, y las neuronas fuera de este vecindario no se actualizan (para un punto de datos dado). Es computacionalmente más barato y más fácil de aplicar. Es útil para mapas más pequeños en los que los límites nítidos de los vecindarios no comprometen una agrupación eficaz. 
    • Sombrero mexicano: Tiene una región central positiva rodeada de una región negativa. Las neuronas cercanas a la BMU se actualizan para acercarse al punto de datos, y las neuronas más alejadas se actualizan para alejarse del punto de datos. Esta técnica mejora el contraste y hace más nítidas las características del mapa. Como hace hincapié en los clusters distintos, es eficaz en tareas de reconocimiento de patrones en las que se desea una separación clara de los clusters.
    • Triángulo: Esta función define el tamaño del vecindario como un triángulo, en el que la BMU tiene la mayor influencia. Disminuye linealmente con la distancia a la BMU. Se utiliza para agrupar datos con transiciones graduales entre conglomerados o características, como datos de imágenes, voz o series temporales, en los que se espera que los puntos de datos vecinos compartan características similares. 
  • Función de distancia (DISTANCE_FUNC): Para medir la distancia entre las neuronas y los puntos de datos, podemos elegir entre 4 métodos:
    • Distancia euclidiana (opción por defecto): Útil cuando los datos son continuos y queremos medir la distancia en línea recta. Se adapta a la mayoría de las tareas generales, especialmente cuando los puntos de datos están distribuidos uniformemente y relacionados espacialmente.
    • Distancia coseno: Buena elección para texto o datos dispersos de alta dimensión en los que el ángulo entre vectores es más importante que la magnitud. Es útil para comparar la direccionalidad de los datos.
    • Distancia a Manhattan: Ideal cuando los puntos de datos están en una rejilla o celosía (por ejemplo, manzanas de una ciudad). Es menos sensible a los valores atípicos que la distancia euclidiana.
    • Distancia de Chebyshev: Adecuado para situaciones en las que el movimiento puede producirse en cualquier dirección (por ejemplo, distancias de tablero de ajedrez). Es útil para espacios discretos en los que queremos priorizar la máxima diferencia de ejes.
  • Topología (TOPOLOGY): En una rejilla, las neuronas pueden disponerse en una estructura hexagonal o rectangular: 
    • Rectangular (por defecto): cada neurona tiene 4 vecinas inmediatas. Es la opción adecuada cuando los datos no tienen una relación espacial clara. También es computacionalmente más sencillo. 
    • Hexagonal: cada neurona tiene 6 vecinas. Ésta es la opción preferida si los datos tienen relaciones espaciales mejor representadas con una rejilla hexagonal. Éste es el caso de las distribuciones de datos circulares o angulares.
  • Número de iteraciones de entrenamiento (N_ITERATIONS): En principio, tiempos de entrenamiento más largos conducen a errores más bajos y a una mejor alineación de los pesos con los datos de entrada. Sin embargo, el rendimiento del modelo aumenta asintóticamente con el número de iteraciones. Así, tras un cierto número de iteraciones, el aumento de rendimiento de las interacciones posteriores es sólo marginal. Decidir el número correcto de iteraciones requiere cierta experimentación. En este tutorial, entrenamos el modelo durante 5000 iteraciones. 

Para determinar la configuración adecuada de los hiperparámetros, recomendamos experimentar con varias opciones en un subconjunto más pequeño de datos.

Conclusión

Los mapas autoorganizados son una herramienta robusta para el aprendizaje no supervisado. Se utilizan para la agrupación, la reducción de la dimensionalidad, la detección de anomalías y la visualización de datos. Como conservan las propiedades topológicas de los datos de alta dimensión y los representan en una cuadrícula de dimensión inferior, los SOM facilitan la visualización e interpretación de conjuntos de datos complejos. 

Este tutorial trata los principios subyacentes de los SOM y muestra cómo implementar un SOM utilizando la biblioteca MiniSom Python. También demostró cómo analizar visualmente los resultados y explicó los hiperparámetros importantes utilizados para entrenar los SOM y ajustar su rendimiento.

Conviértete en un Científico ML

Mejora tus conocimientos de Python para convertirte en un científico del aprendizaje automático.

Preguntas frecuentes

¿El entrenamiento de SOM implica retropropagación?

Un SOM es una red neuronal artificial, pero su entrenamiento no se basa en la corrección de errores. Por tanto, no utiliza la retropropagación con descenso de gradiente. En cambio, los SOM se entrenan mediante aprendizaje competitivo.

¿Cuál es la necesidad de las funciones de decaimiento?

Al principio del proceso de entrenamiento, el modelo necesita explorar el paisaje global de los datos. Por lo tanto, la tasa de aprendizaje debe ser alta, y la función de vecindad debe extenderse ampliamente. Las iteraciones de entrenamiento posteriores realizan ajustes más finos en los pesos basándose en las neuronas adyacentes. A medida que avanza el entrenamiento, las funciones de decaimiento reducen la velocidad de aprendizaje y el radio de vecindad.

¿Cuál es la diferencia entre la inicialización por defecto (aleatoria) y la inicialización aleatoria basada en los datos de entrada?

En la inicialización por defecto, los pesos se inicializan con números aleatorios arbitrarios.

En la inicialización aleatoria basada en los datos de entrada, los pesos se inicializan con muestras elegidas al azar de los datos de entrada.

¿Pueden los SOM captar relaciones no lineales en los datos?

Sí, los SOM capturan patrones no lineales en los datos utilizando diversas funciones de vecindad. Un solo punto de datos puede afectar a los valores de muchas neuronas (en la vecindad). Esto permite a los SOM captar relaciones complejas en los datos.

¿Cuál es la diferencia entre SOM y los métodos de agrupación tradicionales?

Los SOM mapean datos de alta dimensión a una cuadrícula de menor dimensión, preservando las relaciones espaciales. Por otra parte, las técnicas tradicionales de agrupación, como K-Means, crean grupos basándose en métricas de distancia, sin tener necesariamente en cuenta la topología de los datos o las relaciones espaciales. 

Ten en cuenta que, en el análisis de datos, las relaciones topológicas o espaciales se refieren a cómo se sitúan los puntos de datos entre sí en un espacio multidimensional.


Arun Nanda's photo
Author
Arun Nanda
LinkedIn

Arun es un antiguo fundador de startups que disfruta construyendo cosas nuevas. Actualmente explora los fundamentos técnicos y matemáticos de la Inteligencia Artificial. Le encanta compartir lo que ha aprendido, así que escribe sobre ello.

Además de en DataCamp, puedes leer sus publicaciones en Medium, Airbyte y Vultr.

Temas

¡Aprende más sobre aprendizaje automático y Python con estos cursos!

curso

Machine Learning with Tree-Based Models in Python

5 hr
97.1K
In this course, you'll learn how to use tree-based models and ensembles for regression and classification using scikit-learn.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

tutorial

Aprendizaje automático de datos categóricos con el tutorial de Python

Aprenda los trucos más comunes para manejar datos categóricos y preprocesarlos para construir modelos de aprendizaje automático.
Moez Ali's photo

Moez Ali

28 min

tutorial

Tutorial de comprensión del diccionario Python

¡Aprende todo sobre la comprensión de diccionarios en Python: cómo puedes utilizarla para crear diccionarios, para sustituir los for loops (anidados) o las funciones lambda por map(), filter() y reduce(), ...!
Sejal Jaiswal's photo

Sejal Jaiswal

14 min

tutorial

Introducción al Q-Learning: Tutorial para principiantes

Conozca el algoritmo de aprendizaje por refuerzo sin modelos más popular con un tutorial de Python.
Abid Ali Awan's photo

Abid Ali Awan

16 min

tutorial

Una Introducción al Subproceso Python: Conceptos básicos y ejemplos

Explora nuestra guía paso a paso para ejecutar comandos externos utilizando el módulo de subprocesos de Python, completa con ejemplos.
Moez Ali's photo

Moez Ali

15 min

tutorial

Tutorial de minería de reglas de asociación en Python

Descubrir patrones ocultos en Python con minería de reglas de asociación
Moez Ali's photo

Moez Ali

14 min

tutorial

Tutorial del Optimizador Adam: Intuición e implementación en Python

Comprender y aplicar el optimizador Adam en Python. Aprende la intuición, las matemáticas y las aplicaciones prácticas del aprendizaje automático con PyTorch
Bex Tuychiev's photo

Bex Tuychiev

14 min

See MoreSee More