En el artículo anterior, discutimos el sorprendente comportamiento de los datos en dimensiones superiores. Descubrimos que el volumen tiende a acumularse en las esquinas de los espacios de una manera extraña, y simulamos una hiperesfera inscrita dentro de un hipercubo para investigar esto, observando una interesante disminución en su relación de volumen a medida que crecían las dimensiones. Los ejemplos que demostraron las ventajas del pensamiento multidimensional fueron el experimento del papel DVD y el truco del kernel en máquinas de vectores de soporte (SVM).
Hoy veremos algunos de los aspectos difíciles de los datos de alta dimensión, lo que se conoce como maldición de la dimensionalidad. Nuestro objetivo es tener una comprensión intuitiva de este concepto y sus implicaciones prácticas. El siguiente diagrama describe cómo está estructurado nuestro artículo.
Comprender la maldición de la dimensionalidad
“Maldición de la dimensionalidad” es un término que fue utilizado por primera vez por Richard E. Bellman allá por la década de 1960. Comenzó como una idea de Bellman a partir de la optimización dinámica y resultó ser un concepto fundamental para comprender la complejidad en espacios de alta dimensión.
Bien, pero ¿qué es la “maldición de la dimensionalidad”?
En esencia, son las dificultades y las características únicas que uno enfrenta cuando trabaja con datos en espacios de alta dimensión (en nuestro caso, esto se refiere a tener muchas características, columnas o atributos en los conjuntos de datos). Estos espacios van mucho más allá de nuestra experiencia de la vida cotidiana en un espacio tridimensional.
Cuando aumentamos el número de dimensiones de un conjunto de datos, el volumen que ocupa se expande exponencialmente. Esto podría parecer inicialmente una ventaja: ¿más espacio podría significar más datos y probablemente más conocimientos? Sin embargo, ese no es el caso porque tener muchas dimensiones conlleva una serie de desafíos que cambian la forma en que debemos tratar y comprender estos datos de alta dimensión.
El cambio de datos de baja dimensión a datos de alta dimensión enfrenta varios desafíos difíciles. Hay dos que se destacan porque tienen los efectos más significativos: 1) escasez de datos; 2) el problema con la métrica de distancia. Cada uno de ellos hace que el análisis en dimensiones superiores sea aún más complejo.
Escasez de datos: islas en un océano de vacío
La escasez de datos en espacios altamente dimensionales es como unas pocas islas pequeñas perdidas en un vasto océano. Cuando la dimensionalidad aumenta, los puntos de datos que estaban muy juntos en dimensiones inferiores se vuelven cada vez más separados. Esto se debe al hecho de que la cantidad de espacio se expande exponencialmente con cada nueva incorporación de otra dimensión. Imagínense un cubo convirtiéndose en un hipercubo; sus esquinas se alejan más de su centro y lo hacen más vacío por dentro. Este vacío creciente es lo que llamamos escasez de datos.
Muchas técnicas de análisis de datos luchan contra la escasez. Por ejemplo, muchos algoritmos de agrupación dependen de puntos de datos situados muy cerca para formar agrupaciones significativas. Sin embargo, cuando los puntos de datos se vuelven demasiado dispersos, estos algoritmos enfrentan dificultades.
Problemas de métricas de distancia: cuando la proximidad pierde significado
En espacios de alta dimensión, las métricas de distancia enfrentan desafíos importantes. Métricas como las distancias euclidianas o de Manhattan, que son útiles para medir la proximidad entre puntos de datos en dimensiones inferiores, pierden su eficacia. En estos espacios ampliados, las distancias comienzan a converger. Esto significa que la mayoría de los pares de puntos se vuelven casi equidistantes entre sí y de un punto de referencia. Esta convergencia hace que sea más difícil distinguir entre vecinos cercanos y distantes.
En tareas como la clasificación, donde las mediciones de distancia son cruciales para categorizar nuevos puntos de datos, estas métricas se vuelven menos efectivas. Como resultado, el rendimiento del algoritmo disminuye, lo que genera predicciones y análisis menos precisos.
Para comprender mejor cómo cambia el comportamiento de la distancia en dimensiones superiores, realicemos una simulación simple. Generaremos puntos aleatorios en espacios tanto de baja como de alta dimensión. Esto nos permitirá observar y comparar la distribución de distancias, mostrándonos cómo evolucionan estas distancias a medida que avanzamos hacia dimensiones superiores.
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdistdef generate_points(dimensions, num_points, range_min, range_max):
return np.random.uniform(range_min, range_max, (num_points, dimensions))
def calculate_pairwise_distances(points):
distances = np.sqrt(((points(:, np.newaxis, :) - points(np.newaxis, :, :)) ** 2).sum(axis=-1))
np.fill_diagonal(distances, np.nan) # Ignore self-distances by setting them to NaN
return distances
def calculate_distances_from_reference(points, reference_point):
distances = np.sqrt(((points - reference_point) ** 2).sum(axis=1))
return distances
def calculate_stats_for_dimensions(num_points, dimensions_range, range_min, range_max):
means_pairwise = ()
stds_pairwise = ()
means_ref = ()
stds_ref = ()
for dim in dimensions_range:
points = generate_points(dim, num_points, range_min, range_max)
pairwise_distances = calculate_pairwise_distances(points)
reference_point = generate_points(dim, 1, range_min, range_max)
distances_from_ref = calculate_distances_from_reference(points, reference_point)
means_pairwise.append(np.nanmean(pairwise_distances))
stds_pairwise.append(np.nanstd(pairwise_distances))
means_ref.append(np.mean(distances_from_ref))
stds_ref.append(np.std(distances_from_ref))
return means_pairwise, stds_pairwise, means_ref, stds_ref
def plot_histograms_and_stats(num_points, dimensions_range, range_min, range_max):
fig, axs = plt.subplots(2, 3, figsize=(12, 7), tight_layout=True)
# Plotting histograms for 3D and 100D
for i, dim in enumerate((3, 100)):
points = generate_points(dim, num_points, range_min, range_max)
pairwise_distances = calculate_pairwise_distances(points)
reference_point = generate_points(dim, 1, range_min, range_max)
distances_from_ref = calculate_distances_from_reference(points, reference_point)
axs(i, 0).hist(pairwise_distances(~np.isnan(pairwise_distances)), bins=50, alpha=0.7, color='blue', edgecolor='black')
axs(i, 0).set_title(f'Pairwise Distances in {dim}D')
axs(i, 1).hist(distances_from_ref, bins=30, alpha=0.7, color='green', edgecolor='black', range=(0, max(distances_from_ref)))
axs(i, 1).set_title(f'Distances to Reference in {dim}D')
# Calculating and plotting mean and std deviation trends across dimensions
means_pairwise, stds_pairwise, means_ref, stds_ref = calculate_stats_for_dimensions(num_points, dimensions_range, range_min, range_max)
# Plotting mean and std deviation graphs for pairwise distances
axs(0, 2).plot(dimensions_range, means_pairwise, label='Mean Pairwise', marker='o', color='blue')
axs(0, 2).plot(dimensions_range, stds_pairwise, label='Std Dev Pairwise', marker='x', color='cyan')
axs(0, 2).set_title('Pairwise Distances Stats')
# Plotting mean and std deviation graphs for distances to reference point
axs(1, 2).plot(dimensions_range, means_ref, label='Mean Reference', marker='o', color='green')
axs(1, 2).plot(dimensions_range, stds_ref, label='Std Dev Reference', marker='x', color='lime')
axs(1, 2).set_title('Reference Point Distances Stats')
axs(0, 2).legend()
axs(1, 2).legend()
plt.show()
plot_histograms_and_stats(1000, range(1, 101), 1, 100)
La salida del código muestra cómo cambian las distancias entre dimensiones. En 3D, existen diferentes distancias entre puntos. En 100D, las distancias entre puntos tienden a ser similares. Los gráficos de la derecha también muestran que a medida que aumentan las dimensiones, la distancia media entre puntos aumenta, pero la desviación estándar permanece aproximadamente igual que en el espacio 2D o 3D.
Otra nota aquí es que a medida que aumentan las dimensiones, la distancia media entre puntos aumenta y se acerca a la distancia máxima. Esto sucede porque la mayor parte del espacio se concentra en las esquinas.
Para comprender mejor esto, podemos simular puntos aleatorios en dimensiones de hasta 100D. Esto nos permitirá comparar la distancia promedio con la distancia máxima.
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdistdef generate_points(dimensions, num_points, range_min, range_max):
return np.random.uniform(range_min, range_max, (num_points, dimensions))
def calculate_distances_stats(points):
# Compute pairwise distances
distances = pdist(points)
# Calculate average and maximum distance
average_distance = np.mean(distances)
max_distance = np.max(distances)
return average_distance, max_distance
def plot_normalized_difference(num_points, dimensions_range, range_min, range_max):
normalized_differences = ()
for dim in dimensions_range:
points = generate_points(dim, num_points, range_min, range_max)
average_distance, max_distance = calculate_distances_stats(points)
normalized_difference = (max_distance - average_distance) / max_distance
normalized_differences.append(normalized_difference)
plt.figure(figsize=(8, 6))
plt.plot(dimensions_range, normalized_differences, label='Normalized Difference', marker='o', color='blue')
plt.xlabel('Number of Dimensions')
plt.ylabel('Normalized Difference')
plt.title('Normalized Difference Between Max and Average Distances Across Dimensions')
plt.legend()
plt.show()
plot_normalized_difference(500, range(1, 101), 0, 1)
El gráfico muestra que a medida que avanzamos hacia dimensiones superiores, la distancia promedio se acerca a la distancia máxima. Usamos la normalización aquí para asegurarnos de que las escalas fueran precisas.
Es importante comprender la diferencia entre distancias absolutas y relativas. Si bien las distancias absolutas generalmente aumentan con más dimensiones, son las diferencias relativas las que más importan. Los algoritmos de agrupamiento como K-means o DBSCAN funcionan observando cómo se posicionan los puntos en comparación entre sí, no sus distancias exactas. Esto nos permite encontrar patrones y relaciones que podríamos pasar por alto si solo miráramos las distancias.
Pero esto lleva a una pregunta interesante: ¿por qué los pares de puntos en espacios de alta dimensión tienden a estar aproximadamente a la misma distancia a medida que agregamos más dimensiones? ¿Qué causa que esto ocurra?
Para comprender por qué los pares de puntos en espacios de alta dimensión se vuelven equidistantes, podemos observar la Ley de los Grandes Números (LLN). Este principio estadístico sugiere que a medida que aumentamos el tamaño de nuestra muestra o el número de dimensiones, el promedio de nuestras observaciones se acerca al valor esperado.
Consideremos el ejemplo de lanzar un dado de seis caras. La media esperada de una tirada es 3,5, que es el promedio de todos los resultados posibles. Inicialmente, con sólo unas pocas tiradas, como 5 o 10, el promedio podría ser significativamente diferente de 3,5 debido a la aleatoriedad. Pero a medida que aumentamos el número de rollos a cientos o miles, el valor promedio de los rollos se acerca a 3,5. Este fenómeno, en el que el promedio de muchos ensayos se alinea con el valor esperado, muestra la esencia del LIN. Demuestra que, si bien los resultados individuales son impredecibles, el promedio se vuelve altamente predecible a lo largo de muchos ensayos.
Ahora bien, ¿cómo se relaciona esto con las distancias en espacios de alta dimensión?
La distancia euclidiana entre dos puntos en un espacio de n dimensiones se calcula sumando las diferencias al cuadrado en cada dimensión. Podemos pensar en cada diferencia al cuadrado como una variable aleatoria, similar a una tirada de dados. A medida que aumenta el número de dimensiones (o rollos), la suma de estos 'rollos' se acerca al valor esperado.
Un requisito crucial para el LIN es la independencia de las variables aleatorias. En vectores de alta dimensión, esta independencia podría mostrarse mediante una interesante propiedad geométrica: los vectores tienden a ser casi ortogonales entre sí.
import numpy as npdef test_orthogonality(dimensions, n_trials):
for i in range(n_trials):
# Generate two random vectors
v1 = np.random.randn(dimensions)
v2 = np.random.randn(dimensions)
# Calculate dot product
dot_product = np.dot(v1, v2)
# Calculate magnitudes
magnitude_v1 = np.linalg.norm(v1)
magnitude_v2 = np.linalg.norm(v2)
# Calculate the cosine of the angle
cos_theta = dot_product / (magnitude_v1 * magnitude_v2)
# Check if vectors are almost orthogonal
if np.abs(cos_theta) < 0.1: # Adjust this threshold as needed
orthogonality = "Almost Orthogonal"
else:
orthogonality = "Not Orthogonal"
# Calculate angle in degrees
theta = np.arccos(cos_theta) * (180 / np.pi) # Convert to degrees
print(f"Trial {i+1}:")
print(f" Dot Product: {dot_product}")
print(f" Cosine of Angle: {cos_theta}")
print(f" Angle: {theta} degrees")
print(f" Status: {orthogonality}")
print("--------------------------------")
# Try to edit this and notice the near-orthogonality of vectors in higher dimensions
dimensions = 100 # Number of dimensions
n_trials = 10 # Number of trials
test_orthogonality(dimensions, n_trials)
Intente ejecutar el código anterior y editar el número de dimensiones/ensayos, y podrá notar que los vectores en dimensiones superiores son casi ortogonales.
El ángulo entre dos vectores, A y B, está determinado por el coseno del ángulo, que se deriva de su producto escalar y sus magnitudes. La fórmula se expresa como:
Aquí, A⋅B representa el producto escalar de los vectores A y B, y ∥A∥ y ∥B∥ son sus respectivas magnitudes. Para que dos vectores sean ortogonales, el ángulo entre ellos debe ser de 90 grados, por lo que cos(i) igual a cero. Normalmente, esto se logra cuando el producto escalar A⋅B es cero, una condición familiar en dimensiones inferiores.
Sin embargo, en espacios de alta dimensión surge otro fenómeno. La relación entre el producto escalar y la magnitud de los vectores se vuelve tan pequeña que podemos considerar que los vectores son “casi ortogonales”.
Pero, ¿qué significa que dos vectores sean “independientes” en este contexto?
Navegando por una ciudad cuadriculada: una analogía de la independencia en altas dimensiones
Imagina que estás en una ciudad dispuesta en forma de cuadrícula, como las calles de Manhattan. Imagínate en una intersección, intentando llegar a otro punto de esta ciudad. En esta analogía, cada calle representa una dimensión en un espacio de alta dimensión. Moverse por una calle es como cambiar el valor en una dimensión de un vector de alta dimensión. Moverse por una calle no afecta tu posición en otra calle, al igual que cambiar una dimensión no afecta a las demás.
Para llegar a una intersección específica, se toman una serie de decisiones independientes, como calcular la distancia en un espacio de alta dimensión. Cada decisión contribuye de forma independiente pero te lleva a tu destino.
Esta analogía también se aplica al concepto de ortogonalidad en vectores de alta dimensión. Cuando los vectores son casi ortogonales, siguen sus propios caminos sin influirse significativamente entre sí. Esta condición complementa la necesidad de independencia estadística del LIN.
Una nota importante: si bien esta analogía de LIN ofrece una perspectiva útil, es posible que no capture toda la idea o las causas detrás de este comportamiento. Sin embargo, sirve como un indicador útil, ya que proporciona una comprensión de cuál es el motivo. podría ser que los pares de puntos sean casi equidistantes.
Una forma en que aparece la maldición de los problemas de dimensionalidad es el sobreajuste. El sobreajuste ocurre cuando un modelo complejo aprende ruido en lugar de patrones en los datos. Esto es especialmente cierto en espacios de grandes dimensiones donde hay muchas características. El modelo puede hacer conexiones o correlaciones falsas y funcionar mal cuando ve datos nuevos (sin generalizar).
La maldición también dificulta encontrar patrones en grandes conjuntos de datos. Los datos de alta dimensión están dispersos y son escasos, por lo que resulta complicado para los métodos de análisis tradicionales encontrar información significativa. Se necesitan algunos cambios o métodos especializados para navegar y comprender este tipo de datos.
Otra implicación es que el procesamiento de datos de alta dimensión requiere mucha potencia computacional y memoria. Los algoritmos que funcionan bien en dimensiones inferiores se vuelven mucho más complejos y requieren muchos recursos a medida que aumenta el número de dimensiones. Esto significa tener hardware más potente u optimizar algoritmos para manejar la mayor carga computacional de manera eficiente.
Existen varias estrategias para afrontar la maldición de la dimensionalidad. Una forma es reducir la dimensionalidad manteniendo la información importante (por ejemplo, el algoritmo PCA). Otro método es el aprendizaje múltiple (puede considerarse como un tipo de reducción de dimensionalidad), que descubre la estructura dentro de los datos de alta dimensión. La idea clave detrás del aprendizaje múltiple es que muchos conjuntos de datos de alta dimensión en realidad se encuentran en una variedad de dimensiones inferiores dentro del espacio de alta dimensión (por ejemplo, isomapas).
Tenga en cuenta aquí que, en términos generales, las técnicas tradicionales de reducción de dimensionalidad como PCA (Análisis de Componentes Principales) se centran en preservar la estructura de datos globales y la varianza de forma lineal. Por el contrario, múltiples técnicas de aprendizaje como Isomap (mapeo isométrico) enfatizan el descubrimiento de la estructura no lineal subyacente (múltiple) de los datos, con el objetivo de preservar las relaciones locales y las características geométricas.
La selección de funciones también es una opción, donde se eligen funciones relevantes para mejorar el rendimiento del modelo. Las técnicas de regularización evitan el sobreajuste al reducir las características menos importantes. Aumentar el tamaño de la muestra también puede ayudar, aunque no siempre sea posible. Estos métodos pueden ayudarnos a analizar datos de alta dimensión de forma más precisa y eficiente.
La maldición de la dimensionalidad es uno de los problemas más importantes en la ciencia de datos y el aprendizaje automático. Sucede cuando se trata de espacios de alta dimensión. Dos desafíos importantes que surgen son la escasez de datos y los problemas con las métricas de distancia. Estos desafíos pueden provocar un sobreajuste en los modelos de aprendizaje automático y hacer que los cálculos sean más complejos. Para abordar estos desafíos, se pueden utilizar estrategias como la reducción de dimensionalidad, la selección de características y técnicas de regularización.
Si has llegado hasta aquí, ¡me gustaría agradecerte por dedicar tiempo a leer esto! Espero que el tema le haya resultado agradable y al menos lo suficientemente inspirador como para profundizar en el mundo de los datos de alta dimensión. No dude en sugerir cualquier edición o señalar cualquier error o inexactitud.