Fundamentos del motor bayesiano adaptativo, con formulación general y ejemplos numéricos de la demo
Los bloques en EJEMPLO · DEMO muestran el caso concreto de la demo (3 niveles, 4 opciones). El resto de cada sección es formulación general.
Un test convencional hace las mismas preguntas a todos los alumnos y cuenta cuántas acierta. El resultado es un porcentaje. El problema es que muchas de esas preguntas son demasiado fáciles o demasiado difíciles para cada alumno concreto: aportan poca información útil y alargan el test innecesariamente.
Un test adaptativo elige cada pregunta en función de lo que ya sabe del alumno. Para ello necesita:
Este sistema resuelve los cuatro puntos usando el teorema de Bayes para actualizar, la función logística IRT 3PL para calcular las verosimilitudes, y la entropía de Shannon para medir la incertidumbre y seleccionar preguntas. El diseño es independiente del número de hipótesis, del número de dificultades y del formato de las preguntas.
El sistema no trabaja con una estimación puntual del nivel del alumno, sino con una distribución de probabilidades sobre \(n\) hipótesis \(H_0, H_1, \ldots, H_{n-1}\). Las hipótesis pueden ser niveles jerárquicos, errores conceptuales, necesidades de refuerzo u otras categorías pedagógicas pertinentes.
A cada hipótesis se le asigna un valor numérico \(\theta_i\) que la posiciona en la escala de habilidad. Los valores deben ser simétricos respecto al cero y espaciados uniformemente:
donde \(s\) es el paso entre niveles consecutivos. La dificultad de las preguntas \(b_q\) usa la misma escala. Sin embargo, es imprescindible que las escalas no coincidan en sus extremos:
Con \(s = 1\) y \(n = 3\): \(\theta = (-1,\; 0,\; +1)\) — rango ±1, igual al de \(b\). Con \(s = 2\) y \(n = 3\): \(\theta = (-2,\; 0,\; +2)\) — rango ±2, doble del de \(b\). Este segundo caso cumple la invariante.
Al comenzar el test, el sistema no tiene información sobre el alumno. Aplica el principio de indiferencia: asigna probabilidades iguales a todas las hipótesis.
Este vector \(\pi^{(0)}\) es el prior. Tras cada respuesta se convierte en el posterior, que pasa a ser el prior de la siguiente pregunta. La estimación se refina de forma acumulativa.
| Hipótesis | Valor \(\theta_i\) | Significado |
|---|---|---|
| \(H_0\) — Básico | \(-2\) | Conocimiento básico o escaso |
| \(H_1\) — Medio | \(0\) | Conocimiento medio o consolidado |
| \(H_2\) — Avanzado | \(+2\) | Conocimiento avanzado o sólido |
Con \(s = 2\): rango \(\theta \in [-2, +2]\), doble que el rango de dificultades \(b \in [-1, +1]\). Cumple la invariante \(\max|\theta_i| > \max|b_q|\). El valor de \(\theta\) se calcula automáticamente como \(\pm 2\cdot b_{\max}\) a partir del banco de preguntas.
Prior inicial: \(\pi^{(0)} = (1/3,\; 1/3,\; 1/3) \approx 33{,}3\%\) para cada nivel.
Para actualizar con Bayes, el sistema necesita saber: «si el alumno fuera de nivel \(H_i\), ¿con qué probabilidad acertaría esta pregunta \(q\)?» Esa probabilidad es la verosimilitud.
En lugar de fijar una tabla estática, las verosimilitudes se calculan de forma dinámica para cada pregunta usando el modelo logístico IRT de tres parámetros (3PL):
Los tres parámetros son:
La fracción \(\sigma(x) = 1/(1+e^{-x})\) es la función logística estándar. Con \(x = a(\theta_i - b_q)\):
El término \(c_q + (1-c_q)\cdot\sigma\) desplaza el suelo de la curva hasta \(c_q\): ningún alumno puede tener una probabilidad de acierto menor que la de responder al azar. Cuando \(\theta_i = b_q\) exactamente, la probabilidad de acierto es siempre:
Por tanto, el punto de inflexión de la curva depende del valor de \(c_q\): con \(c_q = 0{,}25\) es \(0{,}625\); con \(c_q = 0{,}5\) (pregunta verdadero/falso) es \(0{,}75\); con \(c_q = 0\) es exactamente \(0{,}5\).
Si el alumno falla, la verosimilitud es el complemento:
El punto de inflexión diagonal es \((1+0{,}25)/2 = 0{,}625\).
Tabla de verosimilitudes de acierto:
| Dificultad | Básico \(\theta=-2\) | Medio \(\theta=0\) | Avanzado \(\theta=+2\) |
|---|---|---|---|
| Fácil \(b=-1\) | 38,7 % | 86,3 % | 99,2 % |
| Media \(b=0\) | 28,6 % | 62,5 % | 96,4 % |
| Difícil \(b=+1\) | 25,8 % | 38,7 % | 86,3 % |
Solo la celda Medio/Media está en el punto \(\theta_i = b_q\) (resaltada, 62,5 %). Los valores \(\theta\) ampliados a ±2 separan las escalas de habilidad y dificultad, haciendo que cada tipo de pregunta sea muy diagnóstico para el nivel correspondiente.
Cálculos explícitos para pregunta media:
Verosimilitudes de fallo en pregunta media: Básico 71,4 % · Medio 37,5 % · Avanzado 3,6 %. La ratio básico/avanzado es 20:1: el fallo es altamente diagnóstico.
El teorema de Bayes toma el prior actual \(\pi^{(t)}\), la verosimilitud de la respuesta observada \(R\), y produce el posterior \(\pi^{(t+1)}\):
El denominador normaliza el resultado: garantiza que \(\sum_i \pi^{(t+1)}_i = 1\). Coincide con la probabilidad total de la respuesta \(P(R) = \sum_j P(R\mid H_j)\,\pi^{(t)}_j\).
El proceso se repite tras cada respuesta. El posterior de cada turno se convierte en el prior del siguiente, acumulando evidencia de forma continua.
En la práctica, la operación vectorial es:
Después de cada actualización, el sistema necesita cuantificar cuánta incertidumbre queda. Para eso usa la entropía de Shannon:
La entropía se mide en bits. Sus propiedades fundamentales son:
La fórmula \(-p\log_2 p\) mide la «sorpresa» esperada de cada hipótesis: si \(p = 1\) no hay sorpresa; si \(p = 0{,}5\), la sorpresa es 1 bit (equivalente a una moneda). La entropía total es la media ponderada de las sorpresas individuales.
La entropía inicial máxima depende únicamente del número de hipótesis:
| Hipótesis \(n\) | \(H_0 = \log_2 n\) (bits) |
|---|---|
| 2 | 1,000 |
| 3 | 1,585 |
| 4 | 2,000 |
| 5 | 2,322 |
| Distribución \(\pi\) | Entropía | Situación |
|---|---|---|
| \((1/3,\; 1/3,\; 1/3)\) | \(1{,}585\) bits | Prior inicial — ignorancia total |
| \((0{,}545,\; 0{,}333,\; 0{,}122)\) | \(1{,}375\) bits | Tras un fallo en pregunta media |
| \((0{,}80,\; 0{,}10,\; 0{,}10)\) | \(0{,}922\) bits | Umbral de parada \(H_\text{stop}\) |
| \((1{,}0,\; 0{,}0,\; 0{,}0)\) | \(0\) bits | Certeza absoluta |
El sistema simula el futuro: para cada pregunta disponible, calcula cuánta incertidumbre esperaría reducir antes de mostrarla, y elige la que produzca mayor reducción esperada.
La ganancia esperada de información de la pregunta \(q\) es:
Donde:
Esta fórmula es la información mutua entre la respuesta a \(q\) y la hipótesis verdadera, calculada bajo el prior actual. Es positiva o cero: ninguna pregunta puede aumentar la incertidumbre esperada.
La pregunta más informativa no es siempre la que coincide con el nivel estimado. Puede ser una que ayude a distinguir entre dos hipótesis todavía plausibles, aunque su dificultad sea distinta a la hipótesis máxima actual. El cálculo de IG se repite en cada turno con el prior actualizado.
Prior: \(\pi^{(0)} = (1/3, 1/3, 1/3)\). Parámetros: \(a=1{,}5\), \(m_q=4\), \(c_q=0{,}25\).
| Tipo | P(A) | IG (bits) | Decisión |
|---|---|---|---|
| Fácil \(b=-1\) | 0,714 | 0,280 | ✓ Máxima IG |
| Media \(b=0\) | 0,625 | 0,275 | ≈ Empate técnico |
| Difícil \(b=+1\) | 0,433 | 0,061 |
Con el banco y los parámetros actuales de la demo, la pregunta fácil tiene una IG ligeramente mayor que la media desde prior uniforme (0,280 frente a 0,275 bits). La diferencia es pequeña, pero el selector adaptativo elige la de mayor IG desde la primera pregunta.
El test se detiene cuando se cumplen simultáneamente dos condiciones, tras un número mínimo de preguntas \(MIN\_Q\):
El parámetro \(p_\min\) es el nivel de confianza deseado (típicamente \(0{,}80\)).
El umbral \(H_\text{stop}\) es la entropía de la distribución límite: la menos concentrada que aún cumple \(\max_i \pi_i = p_\min\). Bajo el supuesto de que la probabilidad restante \(1 - p_\min\) se distribuye uniformemente entre las otras \(n-1\) hipótesis:
Valores para \(p_\min = 0{,}80\):
| Hipótesis \(n\) | \(H_0 = \log_2 n\) | \(H_\text{stop}\) | Recorrido \(H_0 - H_\text{stop}\) |
|---|---|---|---|
| 2 | 1,000 bits | 0,722 bits | 0,278 bits |
| 3 | 1,585 bits | 0,922 bits | 0,663 bits |
| 4 | 2,000 bits | 1,061 bits | 0,939 bits |
| 5 | 2,322 bits | 1,161 bits | 1,161 bits |
\(H_\text{stop}\) se calcula asumiendo reparto uniforme del resto, lo que es una aproximación. Con \(n=3\), las distribuciones \((0{,}80,\; 0{,}10,\; 0{,}10)\) y \((0{,}80,\; 0{,}19,\; 0{,}01)\) tienen la misma hipótesis máxima pero entropías distintas (0,922 y 0,834 bits respectivamente). La condición \(\max_i \pi_i \geq p_\min\) garantiza que la hipótesis dominante supera el umbral de confianza independientemente de cómo se distribuya el resto.
La reducción relativa de entropía hacia el umbral de parada define el progreso:
Progreso tras el primer fallo (H = 1,375 bits):
\(MAX\_Q\) combina un peor caso estadístico con un límite práctico de uso. El cálculo minimax estima cuántas preguntas harían falta en el peor caso posible hasta alcanzar una parada firme o agotar el banco disponible, pero la demo además impone un tope duro de 20 preguntas y una parada por baja utilidad marginal desde la pregunta 12.
Como muchas preguntas tienen los mismos parámetros estadísticos, el cálculo agrupa las preguntas reales por dificultad y número de opciones. Cada grupo conserva su recuento disponible: formular una pregunta de ese grupo consume una unidad. La búsqueda se hace con memoización sobre distribuciones ya visitadas y recuentos restantes. En la demo, el peor caso teórico se usa como referencia interna, pero el número mostrado al usuario queda acotado por el límite práctico.
En la demo hay tres grupos reales: 30 fáciles (\(b=-1\)), 30 medias (\(b=0\)) y 30 difíciles (\(b=+1\)), todas con \(m_q=4\). La búsqueda minimax parte del prior uniforme, consume preguntas del grupo seleccionado y explora recursivamente el peor caso de acierto/fallo en cada nodo, pero el recorrido efectivo se corta si la utilidad cae por debajo de 0,015 bits desde la pregunta 12 o si se alcanza el máximo práctico de 20.
El truco común de barajar con array.sort(() => Math.random() - 0.5) produce permutaciones sesgadas. Los algoritmos de ordenación no llaman al comparador el mismo número de veces para todos los pares, lo que hace que ciertos elementos aparezcan antes con más frecuencia. El sesgo es sistemático y reproducible.
El algoritmo de Fisher-Yates garantiza una distribución uniforme sobre todas las \(N!\) permutaciones:
En cada paso, el elemento que ocupa la posición \(i\) se elige con probabilidad \(1/(i+1)\) entre los que aún no se han colocado. La probabilidad de cualquier permutación particular es exactamente \(1/N!\).
Muchas preguntas tienen la misma IG cuando comparten dificultad y número de opciones. Una selección determinista entre empates produciría tests sistemáticamente repetitivos entre sesiones. El procedimiento correcto es:
El peso inversamente proporcional al recuento de categorías combina máxima utilidad informativa con diversidad temática, sin imponer restricciones rígidas. Si todas las categorías han aparecido el mismo número de veces, la selección es uniforme entre candidatas.
Sesión hipotética de tres preguntas que ilustra la evolución de la distribución. Las barras muestran la probabilidad de cada hipótesis en porcentaje normalizado al nivel mayor.
\(\pi^{(0)} = (33{,}3\%,\; 33{,}3\%,\; 33{,}3\%)\) · \(H = 1{,}585\) bits · Progreso: 0 %
En el banco actual, la fácil tiene una IG ligeramente mayor que la media desde prior uniforme (0,280 frente a 0,275 bits), por lo que el selector adaptativo empezaría por una fácil.
Verosimilitudes de fallo: \((0{,}613,\; 0{,}375,\; 0{,}137)\) · Numeradores: \(0{,}2043\;\; 0{,}1250\;\; 0{,}0457\) · Z = 0,375
\(\pi^{(1)} = (54{,}5\%,\; 33{,}3\%,\; 12{,}2\%)\) · \(H = 1{,}375\) bits · Progreso: 32 %
El fallo concentra masa en Básico. La siguiente pregunta más informativa con este prior es una fácil, para distinguir entre básico y medio.
Verosimilitudes de acierto: \((0{,}625,\; 0{,}863,\; 0{,}964)\) · P(A) = 0,746 · Numeradores: \(0{,}341\;\; 0{,}287\;\; 0{,}118\)
\(\pi^{(2)} = (45{,}7\%,\; 38{,}5\%,\; 15{,}8\%)\) · \(H \approx 1{,}466\) bits · Progreso: 18 %
El acierto en pregunta fácil es débilmente diagnóstico: un alumno básico también la acierta con 62,5 %. La entropía sube respecto al paso anterior porque el acierto no diferencia bien los niveles. Es esperable y correcto: la barra de progreso puede retroceder levemente.
Verosimilitudes de fallo: \((0{,}613,\; 0{,}375,\; 0{,}137)\) · Numeradores: \(0{,}280\;\; 0{,}144\;\; 0{,}022\) · Z = 0,446
\(\pi^{(3)} = (62{,}8\%,\; 32{,}3\%,\; 4{,}9\%)\) · \(H \approx 1{,}134\) bits · Progreso: 68 %
Avanzado está prácticamente descartado. \(\max \pi = 63\% < 80\%\): el criterio de parada aún no se cumple. El test continúa con preguntas que apunten a la frontera básico/medio.
La actualización bayesiana garantiza que, con respuestas consistentes, la distribución converge hacia la hipótesis verdadera. Tras \(t\) respuestas, la probabilidad de cada hipótesis es proporcional al producto de todas sus verosimilitudes:
Para que la hipótesis verdadera \(H^*\) domine sobre cualquier otra \(H_j\), basta con que su producto de verosimilitudes crezca más rápido:
Esto ocurre cuando las respuestas son consistentes con \(H^*\): cada respuesta coherente multiplica su probabilidad por un factor mayor que 1 relativo a las demás. Los factores se acumulan multiplicativamente, lo que produce convergencia exponencialmente rápida.
La entropía cae porque los productos de verosimilitudes son distintos para cada hipótesis. Una vez que una hipótesis tiene mucha más probabilidad que las demás, los nuevos datos la refuerzan aún más (retroalimentación positiva), y la entropía cae rápidamente hacia cero.
Si el alumno responde de forma inconsistente (acierta preguntas muy difíciles pero falla fáciles), las verosimilitudes de distintas hipótesis se compensan. La distribución no converge hacia ningún nivel y la entropía permanece alta. El sistema lo detecta: si se alcanza \(MAX\_Q\) sin cumplir el criterio de parada, el resultado se presenta como estimación provisional. Esta honestidad sobre la incertidumbre es una característica del diseño, no un defecto.
Si el alumno falla las primeras preguntas pero luego acierta preguntas difíciles, la hipótesis de nivel alto acumula factores favorables progresivamente. No se necesita ninguna lógica de recuperación explícita: la actualización bayesiana reorienta la distribución y la selección por IG elige automáticamente preguntas más exigentes a medida que la distribución se desplaza. La recuperación es gradual y proporcional a la coherencia de la evidencia acumulada.
Si el alumno falla las primeras preguntas medias (verosimilitud de fallo para Básico: 61,3 % frente a 13,7 % para Avanzado) pero luego acierta difíciles (verosimilitud de acierto para Avanzado: 62,5 % frente a 28,6 % para Básico), los productos acumulados de Avanzado superan a los de Básico tras suficientes aciertos difíciles, sin ninguna instrucción adicional.