Implementación de algoritmos Support Vector Machine (SVM)
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: 1. 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. 2. 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. 3. 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. 4. 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.



