Máquinas de soporte vectorial (SVM)#

  • Son un conjunto de métodos para aprendizaje supervizado usados para regresión, clasificación y detección de outliers.

  • Son efectivos en espacios altamente dimensionales, inclusive cuando el número de dimensiones es mayor que el número de muestras.

  • Usan un subconjunto de puntos de entrenamiento en la función de decisión (llamados vectores de soporte), por lo que también son eficientes en el uso de la memoria.

  • No entregan estimados de probabilidad, los cuales deben ser calculados usando 5-fold cross-validation.

  • Construyen un hiperplano o conjunto de hiperplanos en un espacio altamente dimensional.

  • Una máquina de soporte vectorial es un modelo matemático de la siguiente forma:

    y = w_0 + \sum_d w_d \times k(\mathbf{x}, \mathbf{x}_d)

    donde:

    • w_0 es una constante.

    • \mathbf{x} es el vector de variables independientes (valor para el cual se desea calcular la salida y.

    • w_d son los coeficientes del modelo.

    • \mathbf{x}_d son los vectores de soporte.

    • k() es una función de núcleo (kernel function).

    • d=1,...,D es un índice que itera sobre el conjunto de vectores de soporte.

  • Los funciones kernel k() son las siguientes:

    • Lineal:

      k(\mathbf{x}, \mathbf{z}) = \sum_i x_i \cdot z_i

    • Polinomial:

      k(\mathbf{x}, \mathbf{z}) = 1 + \left( \sum_i x_i \cdot z_i \right)^d

      donde el grado d del polinomio debe ser especificado por el modelador.

    • RBF:

      k(\mathbf{x}, \mathbf{z}) = \exp( -\gamma \cdot ||\mathbf{x} - \mathbf{z}||^2)

      con \gamma > 0.

    • Sigmoid:

      k(\mathbf{x}, \mathbf{z}) = \tanh \left(r + \gamma \sum_i x_i \cdot y_i \right)

[1]:
import numpy as np

# Sea una SVM con kernels lineales:
#
# y = 0.3 + 0.4 * k(x, [1, 2]) + 0.5 * k(x, [3, 4]) + 0.6 * k(x, [5, 6])
#

# Los vectores de soporte son:
xd = np.array(
    [
        [1, 2],
        [3, 4],
        [5, 6],
    ]
)

# El punto x  donde se desea evaluar la SVM es:
x = [[0.1, 0.2]]
[2]:
from sklearn.metrics.pairwise import linear_kernel

# linear kernel: f(x, y) = x^T y
# 1 * 0.1 + 2 * 0.2 = 0.5
# 3 * 0.1 + 4 * 0.2 = 1.1
# 5 * 0.1 + 6 * 0.2 = 1.7

linear_kernel(xd, x)
[2]:
array([[0.5],
       [1.1],
       [1.7]])
[3]:
# La salida de la SVM será:

0.3 + 0.4 * 0.5 + 0.5 * 1.1 + 0.6 * 1.7
[3]:
2.0700000000000003