Descripción General del Proyecto
Este proyecto es una implementación educativa y altamente técnica de Support Vector Machines (SVM) desarrollada en Python. Evita el uso de bibliotecas de machine learning de alto nivel como scikit-learn para demostrar las matemáticas subyacentes y los procesos de optimización. La implementación se apoya estrictamente en numpy para operaciones de vector/matriz, scipy (scipy.optimize.minimize vía SLSQP) para resolver los problemas de programación cuadrática y el dual de Lagrangian, y matplotlib para visualizar los decision boundaries y los support vectors.
📂 Arquitectura y Módulos Principales
El proyecto está modularizado en varias iteraciones, escalando progresivamente la complejidad del algoritmo SVM:
- hard_margin/ (Modelo Lineal) El algoritmo base diseñado para datasets perfectamente separables linealmente. Resuelve la formulación primal/dual para encontrar el hiperplano óptimo sin tolerancia al error.
- soft_margin/ (Modelo Suavizado) Una evolución del modelo de hard margin que introduce variables de holgura ($\epsilon$) y un parámetro de regularización ($C$). Esto permite que el modelo maneje datos superpuestos o ruidosos que no son perfectamente separables al tolerar ciertas violaciones del margen.
- dual_kernel/ (Kernel Trick) Este módulo resuelve el problema SVM utilizando su formulación Dual para aplicar el Kernel Trick. Implementa transformaciones no lineales (como kernels Gaussian/RBF y Polynomial) para clasificar con precisión distribuciones complejas como anillos concéntricos o datos cruzados, calculando la matriz de Gram dinámicamente.
- multiclass_classifier/ (Arquitecturas Multiclase) Dado que el SVM nativo es estrictamente un clasificador binario, este módulo se basa en el dual_kernel para soportar datasets de $N$ clases utilizando dos estrategias estándar:
One-vs-All (OvA): Entrena $N$ modelos binarios comparando cada clase contra el resto.
One-vs-One (OvO): Entrena $\frac{N(N-1)}{2}$ modelos binarios utilizando un sistema de votación. Incluye un benchmarking automatizado del tiempo de ejecución (time.perf_counter) para comparar la complejidad computacional de ambas estrategias.
⚙️ Núcleo Compartido (core/)
Para adherirse al principio DRY (Don't Repeat Yourself), el proyecto extrae todas las utilidades compartidas en un paquete central
core/: datasets.py: Genera datasets sintéticos (ej. rings, blobs) para probar diferentes escenarios.
kernels.py: Contiene las definiciones matemáticas para las funciones de kernel Linear, Polynomial y Gaussian (RBF).
visualization.py: Funciones de plotting estandarizadas para mapear puntos de datos, resaltar support vectors y dibujar decision boundaries no lineales complejos.
🖼️ Assets (assets/)
Cuando se ejecutan cualquiera de los scripts principales, el proyecto genera automáticamente plots y gráficas 2D de alta calidad, guardándolos agrupados por algoritmo en el directorio assets/ para servir como prueba visual de las implementaciones matemáticas.