Documentos de Académico
Documentos de Profesional
Documentos de Cultura
para los parámetros 𝛽𝛽0 , 𝛽𝛽1 y 𝛽𝛽2 . Cuando decimos que la ecuación (𝑖𝑖) "define"
el hiperplano, queremos decir que cualquier 𝑋𝑋 = 𝑋𝑋1 , 𝑋𝑋2 𝑇𝑇 para el cual se
cumple la ecuación (𝑖𝑖) es un punto en el hiperplano. Nótese que la ecuación
(𝑖𝑖) representa una recta, ya que en dos dimensiones un hiperplano es una
recta.
Entonces esto nos dice que 𝑋𝑋 se encuentra a un lado del hiperplano. Por otro
lado, si
𝛽𝛽0 + 𝛽𝛽1 𝑋𝑋1 + 𝛽𝛽2 𝑋𝑋2 … + 𝛽𝛽𝑝𝑝 𝑋𝑋𝑝𝑝 < 0 (𝑖𝑖𝑣𝑣)
Se muestra el hiperplano
1 + 2𝑥𝑥1 + 3𝑥𝑥2 = 0. La
región azul es el conjunto
de puntos para los cuales
1 + 2𝑥𝑥1 + 3𝑥𝑥2 > 0, y la
región roja es el conjunto
de puntos para los cuales
1 + 2𝑥𝑥1 + 3𝑥𝑥2 < 0.
𝑥𝑥11 𝑥𝑥𝑛𝑛1
. .
𝑥𝑥1 = . ,…, 𝑥𝑥 = .
𝑛𝑛
. .
𝑥𝑥1𝑝𝑝 𝑥𝑥𝑛𝑛𝑝𝑝
y que estas observaciones se dividen en dos clases, es decir, 𝑦𝑦1 , 𝑦𝑦2 , … , 𝑦𝑦𝑝𝑝 ∈
−1, +1 donde −1 representa una clase y +1 otra clase.
Una observación puede estar no solo en el lado equivocado del margen, sino
también en el lado equivocado del hiperplano. De hecho, cuando no hay un
hiperplano separador, tal situación es inevitable. Las observaciones en el
lado equivocado del hiperplano corresponden a observaciones de
entrenamiento que están mal clasificadas por el CVS. El panel de la derecha
de la Figura 6 ilustra tal escenario.
6/9/2022 Miguel Mejía Puente 38
Figura 6
A la izquierda, un CVS se ajustaba a un conjunto de datos pequeño. El hiperplano se
muestra como una línea sólida y los márgenes se muestran como líneas
discontinuas. Observaciones rojas: Las observaciones 3, 4, 5 y 6 están en el lado
correcto del margen, la observación 2 está en el margen y la observación 1 está en
el lado equivocado del margen. Observaciones azules: Las observaciones 7 y 10
están en el lado correcto del margen, la observación 9 está en el margen y la
observación 8 está en el lado equivocado del margen. Ninguna observación está en
el lado equivocado del hiperplano.
A la derecha, igual que el panel
izquierdo con dos puntos adicionales,
11 y 12. Estas dos observaciones
están en el lado equivocado del
hiperplano y en el lado equivocado
del margen.
6/9/2022 Miguel Mejía Puente 39
Detalles del Clasificador de Vectores de
Soporte - 1
El CVS clasifica una observación de prueba dependiendo del lado de un
hiperplano en el que se encuentre. El hiperplano se elige para separar
correctamente la mayoría de las observaciones de entrenamiento en las dos
clases, pero puede clasificar erróneamente algunas observaciones. Es la
solución al problema de optimización (PO2).
� 𝛽𝛽𝑗𝑗2 = 1 (𝑅𝑅𝑅)
𝑗𝑗=1
𝑦𝑦𝑖𝑖 𝛽𝛽0 + 𝛽𝛽1 𝑥𝑥𝑖𝑖𝑖 + 𝛽𝛽2 𝑥𝑥𝑖𝑖𝑖 … + 𝛽𝛽𝑝𝑝 𝑥𝑥𝑖𝑖𝑖𝑖 ≥ 𝑀𝑀(1 − 𝜖𝜖𝑖𝑖 ), ∀ 𝑖𝑖 = 1, … , 𝑛𝑛 (𝑅𝑅𝑅)
𝑛𝑛
� 𝜖𝜖𝑖𝑖 ≤ 𝐶𝐶 (𝑅𝑅𝑅)
𝑖𝑖=1
𝜖𝜖𝑖𝑖 ≥ 0
Ahora usamos la función svm() para ajustar el CVS para un valor dado del
parámetro cost. Aquí demostramos el uso de esta función en un ejemplo
bidimensional para que podamos trazar el límite de decisión final resultante.
6/9/2022 54
6/9/2022 Miguel Mejía Puente 55
Ejemplo de Clasificador de Vectores de
Soporte - 4
Las clases no son linealmente separables.
61
Ejemplo de Clasificador de Vectores de
Soporte - 9
Podemos obtener información básica sobre el ajuste del CVS utilizando
el comando summary():
Call:
# Información del ajuste svm(formula = y~., data = dat, kernel =
"linear", cost = 10, scale = FALSE)
summary(svmfit)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 10
Number of Support Vectors: 7
( 4 3 )
Number of Classes: 2
Levels:
-1 1
6/9/2022 62
Ejemplo de Clasificador de Vectores de
Soporte - 10
Este resumen nos dice que se utilizó un kernel = "linear" con cost = 10,
y que había siete vectores de soporte, cuatro en una clase y tres en la
otra.
65
Ejemplo de Clasificador de Vectores de
Soporte - 12
Podemos obtener información básica sobre el ajuste del CVS utilizando
el comando summary():
Call:
svm(formula = y ~ ., data = dat, kernel =
# Información del ajuste "linear", cost = 0.1, scale = FALSE)
summary(svmfit)
Parameters:
SVM-Type: C-classification
Este resumen nos dice que se SVM-Kernel: linear
cost: 0.1
utilizó un kernel = "linear"
Number of Support Vectors: 16
con cost = 0.1, y que había ( 8 8 )
dieciseis vectores de soporte, Number of Classes: 2
ocho en cada clase. Levels:
-1 1
6/9/2022 66
Ejemplo de Clasificador de Vectores de
Soporte - 13
Ahora que se está utilizando un valor menor del parámetro cost,
obtenemos un mayor número de vectores de soporte, porque el
margen ahora es más amplio. Desafortunadamente, la función svm() no
genera explícitamente los coeficientes del límite de decisión lineal
obtenidos cuando se ajusta el CVS, ni genera el ancho del margen.
6/9/2022 70
Ejemplo de Clasificador de Vectores de
Soporte - 17
La función tune() almacena el mejor modelo obtenido, al que se puede
acceder de la siguiente manera:
# Mejor modelo
bestmod <- tune2$best.model
summary(bestmod)
Call:
best.tune(method = svm, train.x = y~., data = dat, ranges = list(cost = c(0.001,
0.01, 0.1, 1, 5, 10, 100)), kernel = "linear")
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 0.1
Number of Support Vectors: 16
( 8 8 )
Number of Classes: 2
Levels:
-1 1
Ejemplo de Clasificador de Vectores de
Soporte - 18
La función predict() se puede utilizar para predecir la etiqueta de clase
en un conjunto de observaciones de prueba, a cualquier valor dado del
parámetro cost. Comenzamos generando un conjunto de datos de
prueba.
# Datos de prueba
xtest <- matrix(rnorm(20*2), ncol = 2)
ytest <- sample(c(-1, 1), 20, rep = TRUE)
xtest[ytest == 1, ] = xtest[ytest == 1, ] + 1
testdat = data.frame(x = xtest, y = as.factor(ytest))
6/9/2022 72
Ejemplo de Clasificador de Vectores de
Soporte - 19
Ahora predecimos las etiquetas de clase de estas observaciones de
prueba. Aquí utilizamos el mejor modelo obtenido a través de la
validación cruzada para hacer predicciones.
6/9/2022 73
Ejemplo de Clasificador de Vectores de
Soporte - 20
Con el parámetro cost = 0.1, 17 de las observaciones de prueba se
clasifican correctamente y 3 se clasifican incorrectamente.
6/9/2022 74
Ejemplo de Clasificador de Vectores de
Soporte - 21
Con el parámetro cost = 0.1, 14 de las observaciones de prueba se
clasifican correctamente y 6 se clasifican incorrectamente.
Ahora considere una situación en la que las dos clases son linealmente
separables. Entonces podemos encontrar un hiperplano separador
usando la función svm(). Primero separamos aún más las dos clases en
nuestros datos simulados para que sean linealmente separables:
# Modificar las observaciones y graficarlas
x[y == 1, ] = x[y == 1, ] + 0.5
plot(x, col = (y + 5)/2, pch = 19)
6/9/2022 75
6/9/2022 Miguel Mejía Puente 76
Ejemplo de Clasificador de Vectores de
Soporte - 22
Ahora las observaciones son apenas separables linealmente. Ajustamos
el CVS y trazamos el hiperplano resultante, utilizando un valor cost muy
grande para que ninguna observación se clasifique erróneamente.
79
Ejemplo de Clasificador de Vectores de
Soporte - 24
# Información del ajuste
summary(svmfit)
Este resumen nos dice que se utilizó un kernel = "linear" con cost =
10000, y que había tres vectores de soporte, uno en una clase y dos en
la otra. Call:
svm(formula = y ~ ., data = dat, kernel = "linear", cost = 1e+05)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1e+05
Number of Support Vectors: 3
( 1 2 )
Number of Classes: 2
Levels:
6/9/2022 -1 1 80
Ejemplo de Clasificador de Vectores de
Soporte - 25
No se cometieron errores de entrenamiento y solo se utilizaron tres
vectores de soporte. Sin embargo, podemos ver en la figura que el
margen es muy estrecho, porque las observaciones que no son
vectores de soporte, indicadas como círculos, están muy cerca del
límite de decisión. Parece probable que este modelo tenga un
rendimiento deficiente en los datos de prueba.
6/9/2022
Ejemplo de Clasificador de Vectores de
Soporte - 26
Ahora probamos un valor de costo más pequeño:
6/9/2022
6/9/2022 Miguel Mejía Puente 83
Ejemplo de Clasificador de Vectores de
Soporte - 27
# Vectores de soporte
svmfit$index
[1] 1 2 5 7 14 16 17
Ejemplo de Clasificador de Vectores de
Soporte - 28
# Información del ajuste
summary(svmfit)
Call:
svm(formula = y~., data = dat, kernel = "linear", cost = 1)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1
Number of Classes: 2
Levels:
-1 1
6/9/2022 85
Ejemplo de Clasificador de Vectores de
Soporte - 29
Usando el parámetro cost = 1, se clasifica erróneamente una
observación de entrenamiento, pero también se obtiene un margen
mucho más amplio y se hace uso de siete vectores de soporte.
6/9/2022
Máquinas de Soporte de
Vectores
James, Gareth; Witten, Daniela; Hastie, Trevor; Tibshirani,
Robert (2013). An Introduction To Statistical Learning with
Applications in R.
Clasificación con límites de decisión no
lineales - 1
El CVS es un enfoque natural para la clasificación en el entorno de dos clases,
si el límite entre las dos clases es lineal. Sin embargo, en la práctica a veces
nos enfrentamos a límites de clase no lineales. Por ejemplo, considere los
datos en el panel izquierdo de la Figura 8. Está claro que un CVS o cualquier
clasificador lineal funcionará mal aquí. De hecho, el CVS que se muestra en el
panel de la derecha de la Figura 8 es inútil aquí.
� 𝜖𝜖𝑖𝑖 ≤ 𝐶𝐶
𝑖𝑖=1
𝜖𝜖𝑖𝑖 ≥ 0
Así, el producto interno de dos observaciones 𝑥𝑥𝑖𝑖 , 𝑥𝑥𝑖𝑖 ′ viene dado por
𝑝𝑝
Supongamos ahora que cada vez que aparece el producto interno (𝑣𝑣) en la
representación (𝑣𝑣𝑣𝑣), o en un cálculo de la solución para el CVS, lo
reemplazamos con una generalización del producto interior de la forma
lo que nos devolvería el CVS. La ecuación (𝑖𝑖𝑖𝑖) se conoce como núcleo lineal
porque el CVS es lineal en las características; el núcleo lineal cuantifica
esencialmente la similitud de un par de observaciones utilizando la
correlación de Pearson (estándar). Pero en su lugar se podría elegir otra
forma para (𝑣𝑣𝑣𝑣𝑣𝑣𝑣𝑣).
∗ ∗ ∗ ∗ 𝑇𝑇
Si una observación de prueba dada 𝑥𝑥 = 𝑥𝑥1 , 𝑥𝑥2 , … , 𝑥𝑥𝑝𝑝 está
lejos de ser
una observación de entrenamiento 𝑥𝑥𝑖𝑖 en términos de distancia euclidiana,
entonces
2
∑𝑝𝑝𝑗𝑗=1 𝑥𝑥𝑗𝑗∗ − 𝑥𝑥𝑖𝑖𝑖𝑖 será grande, y así
𝑝𝑝 2
∗
𝐾𝐾 𝑥𝑥 , 𝑥𝑥𝑖𝑖 = 𝑒𝑒𝑒𝑒𝑒𝑒 −𝛾𝛾 ∑𝑗𝑗=1 𝑥𝑥𝑗𝑗∗ −𝑥𝑥𝑖𝑖𝑗𝑗 será muy pequeño.
Para ajustar una MVS usando un núcleo no lineal, una vez más usamos
la función svm(). Sin embargo, ahora usaremos un valor diferente del
parámetro kernel. Para ajustar un MVS con un núcleo polinómico
usamos kernel = "polynomial", y para encajar un MVS con un núcleo
radial usamos kernel = "radial". En el primer caso también usamos el
argumento degree para especificar un grado para el núcleo polinómico,
esto es 𝑑𝑑 en (𝑥𝑥), y en el segundo caso usamos gamma para especificar
un valor de 𝛾𝛾 para el núcleo de base radial 𝑥𝑥𝑥𝑥𝑥𝑥 .
# Datos de entrenamiento
train <- sample(200, 100)
Number of Classes: 2
Levels:
1 2
6/9/2022 115
Ejemplo de Máquina de Vectores de Soporte - 6
6/9/2022 116
Ejemplo de Máquina de Vectores de Soporte - 7
# Ejecutar la máquina de vectores de soporte con cost = 10000
svmfit <- svm(y~., data = dat[train, ], kernel = "radial", gamma = 1, cost
= 1e5)
6/9/2022 117
6/9/2022 Miguel Mejía Puente 118
Ejemplo de Máquina de Vectores de Soporte - 8
# Validación cruzada
set.seed(1)
tune2 <- tune(svm, y~., data = dat[train, ], kernel = "radial", ranges =
list(cost = c(0.1, 1, 10,100, 1000), gamma = c(0.5, 1, 2, 3, 4)))