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.