**Cómo medir la Complejidad** ¿Qué queremos decir con que un sistema dado muestra **comportamiento complejo**?, ¿podemos ofrecer medidas precisas para el grado de complejidad? En esta entrada se presenta un breve resumen sobre los diversos enfoques que ha habido para dar medidas concretas de esta complejidad. La pregunta principal es... ¿podemos proporcionar una sola medida, o un pequeño número de medidas, que sean adecuadas para caracterizar el **grado de complejidad** de cualquier sistema dinámico? Esta pregunta, que cae dentro de la filosofía más que de las matemáticas, ha fascinado a los investigadores durante décadas y, hasta el momento, no hay respuestas definitivas, aunque sí aproximaciones a ellas. La búsqueda de estas medidas de complejidad toca muchos temas interesantes de la teoría de **[Sistemas Dinámicos](Sistemas_Dinamicos.md.html)** y ha dado lugar a una serie de potentes herramientas, aunque el objetivo original de desarrollar una medida que valga para medir la complejidad de cualquier sistema no parece realista y se ha eliminado de los objetivos científicos. Los **[Sistemas Dinámicos Complejos](Sistemas_Complejos_Sistemas_Dinamicos_Redes_Complejas.md.html)** muestran una gran variedad de comportamientos cualitativamente diferentes (que es una de las razones por las que la Teoría de Sistemas Complejos es tan fascinante), y no parece apropiado intentar meter todos los sistemas complejos en una sola bolsa para medir su grado de complejidad siguiendo un único criterio. La tarea de desarrollar una medida matemáticamente bien definida para la complejidad se ve obstaculizada por la falta de un objetivo claramente definido. Vamos a presentar algunos requisitos previos y algunas de las restricciones que deben postularse para obtener una medida de complejidad válida. Al final, sin embargo, es algo que depende de nuestra intuición el decidir si estos requisitos son apropiados o no para ello. # Complejidad frente a Aleatoriedad Una propuesta habitual para medir la complejidad es la **entropía informativa de Shannon**: $$H[p]=-\sum_{x_i}p(x_i) log(p(x_i))$$ Esta medida se anula cuando el sistema es regular (es decir, hay un solo evento probable), lo que concuerda con nuestra intuición de que la complejidad es baja cuando no pasa nada, y sin embargo, es máxima para una dinámica completamente al azar y con incertidumbre máxima. Realmente, es una cuestión de punto de vista el que se considere que los sistemas aleatorios son complejos. Para algunas consideraciones, por ejemplo, cuando se trata de la **complejidad algorítmica** tiene sentido atribuir un grado de complejidad máximo a conjuntos completamente aleatorios de objetos. En general, sin embargo, se considera que las medidas de complejidad deben ser funciones cóncavas que alcanzan sus mínimos tanto para comportamientos regulares como para secuencias puramente aleatorias. # Sistemas con muchas componentes Habitualmente, se considera que la complejidad debe ser una cantidad positiva, como ocurre con la entropía. Pero, ¿cómo se debe comportar respecto al tamaño del sistema?, ¿debe crecer con él, o debería ser independiente del tamaño?, ¿y si consideramos la agrupación de muchos sistemas idénticos e independientes? Intuitivamente, se podría esperar que no se ganara complejidad cuando se considera el comportamiento de un conjunto de $N$ sistemas dinámicos independientes e idénticos; pero, por otro lado, no podemos descartar que la interacción de $N$ sistemas dinámicos debería mostrar un comportamiento cada vez más complejo si se aumenta el número de subsistemas. Por ejemplo, consideramos intuitivamente que la dinámica global del cerebro debe ser más compleja que los patrones que se producen entre las neuronas individuales. No existe una manera sencilla de resolver este dilema en la búsqueda de una sola medida de complejidad que sirva para todos los sistemas complejos, ya que parece que ambas opciones tienen aplicabilidad dependiendo del caso concreto que estemos analizando. # Complejidad y predecibilidad La relación entre complejidad y predecibilidad es un tema fundamental en ciencias como la física, la teoría del caos, la teoría de la información y la ciencia de los sistemas complejos. La **predecibilidad** se refiere a la capacidad para prever el comportamiento futuro de un sistema. En sistemas complejos, donde hay interacciones no lineales y sensibilidad a las condiciones iniciales (como en sistemas caóticos), la predicción a largo plazo puede volverse extremadamente difícil debido a la amplificación de pequeñas diferencias iniciales a lo largo del tiempo (el famoso efecto mariposa). A menudo la relación entre complejidad y predecibilidad es inversa: cuanto más complejo es un sistema, es más probable que exhiba comportamiento caótico o estocástico, lo que significa que se vuelve difícil de predecir a largo plazo. La teoría del caos revela que incluso en sistemas deterministas, pequeñas variaciones en las condiciones iniciales pueden llevar a resultados enormemente divergentes con el tiempo. Esto significa que, en sistemas complejos, la predicción a largo plazo puede ser prácticamente imposible debido a esta sensibilidad extrema a las condiciones iniciales. Se pueden construir medidas de complejidad interesantes haciendo uso de herramientas estadísticas, por medio de la generalización de conceptos como la **entropía de la información** y la **información mutua**. Ya hemos nombrado la entropía en los párrafos anteriores. La información mutua mide la dependencia entre dos variables aleatorias. En el contexto de series temporales o estructuras espaciales, puedes usar la información mutua para analizar cómo la ocurrencia de un evento en un punto dado afecta la probabilidad de ocurrencia de otro evento en otro punto. La fórmula de la información mutua entre dos series temporales \( X \) e \( Y \) es: \[ I(X; Y) = \sum_{x_i} \sum_{y_j} P(x_i, y_j) \cdot \log_2\left(\frac{P(x_i, y_j)}{P(x_i) \cdot P(y_j)}\right) \] Donde \( I(X; Y) \) es la información mutua entre las series temporales \( X \) e \( Y \), \( P(x_i, y_j) \) es la probabilidad conjunta de que \( X = x_i \) e \( Y = y_j \), \( P(x_i) \) es la probabilidad de que \( X = x_i \) y \( P(y_j) \) es la probabilidad de que \( Y = y_j \). Al analizar la dependencia entre variables, la información mutua proporciona información de gran valor sobre la estructura y las interacciones en los datos, lo que permite comprender mejor la complejidad subyacente en los sistemas que los generan. # Exceso de Entropía !!!side:1 Ha de tenerse en cuenta que este requisito puede no ser válido para sistemas dinámicos críticos, que se caracterizan por correlaciones dinámicas y estadísticas que decaen muy lentamente, como una potencia inversa del tiempo. Si trabajamos con **procesos dinámicos estacionarios**, es decir procesos dinámicos que no cambian su comportamiento ni sus propiedades estadísticas cualitativamente con el tiempo, entonces las series temporales generadas por el sistema tienen un **horizonte de tiempo finito**, es decir, cuando $t$ crece las correlaciones entre los estados del sistema caen de forma exponencial [1]. !!!side:2 Al estar trabajando con procesos dinámicos estacionarios, no tiene sentido tomar los valores temporales en un rango superior al horizonte de tiempo finito del sistema, es decir, aquel por encima del cual ya no hay correlación entre los valores de la dinámica. Por lo que aquí $n$ refleja ese horizonte. Si la dinámica del sistema viene representado por un conjunto de símbolos, $X$, para una serie temporal sobre $X$, $x_n, x_{n-1}, \dots, x_2, x_1$, con $x_i = x(t_i)\in X$, podemos definir la **distribución de probabilidad conjunta**, como $p(x_n, ..., x_1)$ [2]. Si consideramos la entropía de la distribución anterior: $$H[p_n]=-\sum_{x_n,\dots,x_1\in X} p(x_n,\dots,x_1) log(p(x_n,\dots,x_1))$$ (que debe medirse sobre un conjunto de series temporales de longitud mayor o igual a $n$). A partir de estas entropías, podemos medir la **densidad límite** de ellas como: $$h_\infty = \lim_{n\rightarrow \infty} \frac{1}{n}H[p_n]$$ que existe para los procesos dinámicos estacionarios (por tener horizonte de tiempo finito). De alguna forma, esta densidad mide el número medio de bits por unidad de tiempo que son necesarios para codificar las series temporales estadísticamente. Podemos definir entonces el **exceso de entropía** como: $$E=\lim_{n\rightarrow \infty} (H[p_n]-nh_\infty)$$ De alguna forma, podemos expresar: $$H[p_n] = n h_\infty + E + O(\frac{1}{n}) \text{ cuando } n\rightarrow \infty$$ Se puede probar que, en el caso de los procesos dinámicos estacionarios, el exceso de entropía E es positiva porque $H[p_n]$ es una función cóncava en $n$. Desde un punto de vista práctico, podemos aproximar el exceso de entropía por: $$h_\infty=\lim_{n\rightarrow \infty} h_n\text{, donde } h_n=H[p_{n+1}]-H[p_n]$$ Se puede comprobar que el exceso de entropía se anula tanto para los sistemas ordenados como para los completamente aleatorios, por lo que a veces se puede ver como una medida de complejidad más adecuada que la entropía. El exceso de entropía es una buena herramienta para el análisis de series temporales, verificando varios criterios básicos de las medidas de complejidad, y que permite muchas posibles ampliaciones como, por ejemplo, para los sistemas que muestran actividad dinámica estructurada tanto en el tiempo como en el dominio espacial. En contra, debe decirse que el exceso de entropía es muy difícil de evaluar numéricamente, por lo que su ámbito de aplicación está limitado a los estudios teóricos. # Complejidad Algorítmica y Generativa Hasta ahora hemos presentado los enfoques descriptivos que hacen uso de métodos estadísticos para la construcción de medidas de complejidad. Pero, además de éstos, podemos estar interesados en el modelado del **proceso generativo** que da lugar al sistema complejo que es objeto de nuestro estudio. En este caso, la pregunta sería: ¿cuál es el modelo más simple que es capaz de explicar los datos observados? A diferencia de lo que se ha visto en las partes anteriores, ahora vamos a tratar con objetos individuales compuestos por un número finito de símbolos, como podrían ser las cadenas $$0000000000000000000000$$ $$0010000011101001011001$$ La pregunta es entonces: ¿qué modelo dinámico puede generar una cadena dada de símbolos? En particular, nos centramos en reproducir cadenas de bits por medios computacionales. Como hay muchos lenguajes de programación con los que podríamos intentar reproducir las cadenas de bits, es necesario tomar un sistema de computación como referencia para poder medir de manera uniforma cuán complicado resulta generarlas. En este caso, suele ser habitual tomar como referencia las **máquinas de Turing**. !!!side:3 La máquina de Turing juega un papel central en la teoría de la computabilidad, por ejemplo, cuando uno está interesada en analizar lo difícil que es encontrar la solución a un determinado conjunto de problemas. La definición exacta de qué es una máquina de Turing no es relevante en este momento (aunque es de importancia fundamental si queremos comprender de verdad qué se entiende por reproducir computacionalmente), y nos quedaremos con que es esencialmente una máquina de estados finitos trabajando sobre una cinta de datos haciendo uso de un conjunto de instrucciones básicas [3]. # Complejidad Algorítmica La noción de **complejidad algorítmica** trata de encontrar una respuesta a la cuestión de lo difícil que es reproducir una serie temporal dada en ausencia de conocimiento previo: la **complejidad algorítmica** (también llamada **complejidad Kolmogorov**) de una cadena de bits es la longitud del programa más corto que produce dicha cadena dada de bits y luego se detiene. Existe un resultado, llamado la **Tesis de Church-Turing**, que asegura que cualquier modelo de computación habitual tiene la misma potencia computacional que las máquinas de Turing, por lo que al fijar uno de los modelos de computación como modelo de referencia (en nuestro caso, las máquinas de Turing) no perdemos fuerza en la definición anterior y, esencialmente, no depende del modelo elegido. La complejidad algorítmica es un concepto muy potente para consideraciones teóricas en el contexto de la computabilidad óptima, pero tiene dos inconvenientes desde el punto de vista de las medidas de complejidad que buscamos para sistemas complejos: no es computable y asigna la complejidad máxima a las secuencias aleatorias, ya que la única forma de generar números aleatorios por medio de máquinas de Turing (o cualquier modelo equivalente) sería haciendo uso de un código que tendría una longitud infinita. Esta es la razón por la que no es posible escribir programas que generen números aleatorios puros, y los códigos actuales solo producen **números pseudo-aleatorios**, que verifican ciertas propiedades estadísticas. Por tanto, la complejidad algorítmica entra en conflicto con el postulado buscado en las medidas de complejidad de anularse en los estados puramente aleatorios. # Complejidad Determinista Hay una gran línea de investigación tratando de entender el mecanismo generativo del comportamiento complejo no algorítmicamente, sino desde la perspectiva de la teoría de sistemas dinámicos, en particular, haciendo uso de sistemas deterministas. La pregunta en este caso sería: en ausencia de ruido, ¿cuáles son las características necesarias para producir trayectorias interesantes y complejas? En este contexto, son de interés la sensibilidad a las condiciones iniciales que tienen los sistemas que presentan una transición entre estados caóticos y regulares en el espacio de fases; el efecto de las bifurcaciones y atractores no triviales (como son los atractores extraños); las consecuencias de la retroalimentación; y las tendencias hacia la sincronización y autoorganización. # Complejidad y Emergencia Intuitivamente, atribuimos un alto grado de complejidad a la cambiante estructura que emerge de reglas subyacentes posiblemente simples. Esta relación entre complejidad y **emergencia** es, sin embargo, muy difícil de formalizar matemáticamente, y hasta la fecha no se ha propuesto ninguna medida precisa para medir esta emergencia. (insert menu.md.html here)