ADR 0036 — K-Means vs Fuzzy C-Means for Question Clustering
Status
Accepted
Context
El sistema necesita agrupar preguntas de estudiantes para:
- Análisis de FAQs: Identificar preguntas frecuentes y patrones temáticos
- Clasificación de dificultad: Agrupar preguntas por nivel de complejidad semántica
- Personalización: Adaptar respuestas según el tipo de pregunta
Disponemos de dos algoritmos implementados según TFG Sección 3.2:
- K-Means (Sección 3.2.1): Clustering particional “duro” con asignación única
- Fuzzy C-Means (FCM) (Sección 3.2.2): Clustering “difuso” con membresía parcial
Requisitos
| Requisito | Prioridad |
|---|---|
| Identificar preguntas que pertenecen a múltiples categorías | Alta |
| Detectar preguntas ambiguas o en fronteras temáticas | Alta |
| Rendimiento computacional aceptable | Media |
| Interpretabilidad de resultados | Media |
Decision
Usar FCM como algoritmo principal para clustering de preguntas, con K-Means como fallback para análisis rápido.
Configuración recomendada
# FCM para análisis detallado
fcm = FuzzyCMeans(
n_clusters=k, # Determinado por Elbow Method
m=2.0, # Fuzziness estándar
max_iter=300,
tol=1e-4
)
# Umbral para identificar preguntas "fuzzy"
FUZZY_THRESHOLD = 0.3 # Membresía mínima para considerar pertenencia
Justificación matemática
FCM minimiza el funcional generalizado (Proposición 3.15):
\[J_m(U, C) = \sum_{i=1}^{N} \sum_{j=1}^{k} (\mu_{ji})^m \|x_i - c_j\|^2\]Donde:
- $\mu_{ji} \in [0,1]$: Grado de pertenencia del punto $x_i$ al cluster $j$
- $m > 1$: Parámetro de fuzziness (controla suavidad de transiciones)
A diferencia de K-Means que asigna cada punto a exactamente un cluster, FCM permite expresar:
- Preguntas claras: Alta membresía en un cluster ($\mu_{ji} > 0.8$)
- Preguntas ambiguas: Membresía distribuida entre varios clusters
Consequences
Pros
- Mejor manejo de ambigüedad: Preguntas como “¿Cómo funciona Docker y por qué es mejor que VMs?” pueden pertenecer tanto a “conceptos básicos” como a “análisis comparativo”
- Información adicional: El grado de membresía indica confianza en la clasificación
- Detección de outliers: Puntos con membresía uniforme ($\approx 1/k$) son candidatos a nuevas categorías
- Análisis pedagógico: Identificar qué conceptos se confunden frecuentemente
Cons
- Mayor complejidad computacional: $O(n \cdot k \cdot d \cdot i)$ vs $O(n \cdot k \cdot d \cdot i)$ similar pero con más operaciones por iteración
- Parámetro adicional ($m$): Requiere tuning para cada caso de uso
- Interpretación menos directa: Resultados requieren análisis de matriz de membresía
Mitigaciones
- Usar K-Means para análisis exploratorio rápido
- Pre-calcular centroides FCM offline y reusar para clasificación online
- Establecer umbrales claros para interpretación de membresía
Alternatives Considered
1. Solo K-Means
Rechazado
- No captura la naturaleza ambigua de preguntas en educación
- Pérdida de información sobre fronteras entre categorías
- Una pregunta sobre “diferencias entre REST y GraphQL” podría abordar múltiples temas
2. DBSCAN / Clustering jerárquico
Rechazado
- DBSCAN no produce centroides para clasificación de nuevas preguntas
- Clustering jerárquico tiene complejidad $O(n^2)$ o peor
- Ninguno ofrece membresía parcial
3. Gaussian Mixture Models (GMM)
Considerado para futuro
- Similar a FCM pero con modelado probabilístico completo
- Mayor complejidad de implementación
- Podría ser útil para análisis avanzado
Implementation
Archivos modificados/creados
| Archivo | Propósito |
|---|---|
math_investigation/clustering/kmeans.py | Implementación K-Means con K-Means++ |
math_investigation/clustering/fcm.py | Implementación FCM según Proposiciones 3.15 y 3.17 |
math_investigation/clustering/metrics.py | Métricas: Silhouette, ARI, NMI, FPC |
chatbot/logic/difficulty.py | Usa centroides pre-entrenados para clasificación |
Flujo de uso
1. Entrenamiento (offline):
- Embeddings de preguntas etiquetadas → FCM → Centroides por dificultad
2. Clasificación (online):
- Nueva pregunta → Embedding → Distancia a centroides → Nivel de dificultad
Métricas de validación
- Silhouette Score: Validación interna de separación de clusters
- Fuzzy Partition Coefficient (FPC): Calidad de partición difusa (1 = crisp, 1/k = máxima fuzziness)
- ARI/NMI: Validación externa contra etiquetas manuales
References
- TFG Sección 3.2.1: “Algoritmo K-Means”
- TFG Sección 3.2.2: “Fuzzy C-Means y el parámetro de fuzziness m”
- Bezdek, J.C. (1981). “Pattern Recognition with Fuzzy Objective Function Algorithms”
- ADR 0035: Usa clasificación de dificultad para CoT adaptativo