## SVM - B)
## 1.
library(e1071)
## Warning: package 'e1071' was built under R version 3.4.4
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.4.4
# SIMULACIÓN
set.seed(5)
n<- 500
l<-2
y<-as.factor(c(rep(-1,n),rep(1,n)))
x1<-c(runif(n,3,3+l),runif(n,6,6+l))
x2<-c(runif(n,3,3+l),runif(n,6,6+l))
datos<-cbind.data.frame(x1,x2)
# Gráfica de los datos
ggplot(datos, aes(x = x1 , y = x2)) + geom_point(color="blue", size=1, pch=19)+
ggtitle("Simulación de dos Cuadrados uniformes")

# PLANO ÓPTIMO DE SEPARACIÓN
# Los datos son linealmente separables, y están en un espacio de dos
# dimensiones, por lo tanto, obtendremos una recta óptima de separación.
# Genero SVM.
svm_datos<- svm(y ~ .,
data = datos,
type = c("C"),
cost = 1,
kernel = c("linear"),
scale = F
)
summary(svm_datos) # Resumen de svm
##
## Call:
## svm(formula = y ~ ., data = datos, type = c("C"), cost = 1, kernel = c("linear"),
## scale = F)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
## gamma: 0.5
##
## Number of Support Vectors: 2
##
## ( 1 1 )
##
##
## Number of Classes: 2
##
## Levels:
## -1 1
# svm_datos$type #acción que realiza con svm: clasificacion binaria
# svm_datos$kernel #tipo de kernel utilizado: lineal
# svm_datos$cost #constante de penalización
# svm_datos$nclasses #numero de clases en que clasificó
# svm_datos$levels #clases en que clasificó
# svm_datos$tot.nSV #numero de vectores de soporte en la maquina
# svm_datos$nSV #numero de vectores de soporte para cada clase
# svm_datos$labels #nombre que le asignó a las clases
# svm_datos$SV #vectores de soporte
# svm_datos$index #renglones de los vectores de soporte
# svm_datos$rho #-beta_cero
# svm_datos$coefs #los coeficientes de la optimización "alphai*yi"
# svm_datos$fitted #clasificación "y" para cada individuo
# svm_datos$decision.values #valores con los que decidió respecto a su signo
# svm_datos$terms #atributos principales
# Vector normal beta
beta=c(0,0)
for(i in 1:svm_datos$tot.nSV){
beta = beta + c(svm_datos$SV[i,]*svm_datos$coefs[i,])
}
beta
## x1 x2
## -0.9467024 -0.9047532
# Margen de error
margen = 1/sqrt(beta%*%beta)
margen
## [,1]
## [1,] 0.7636428
# beta_0
beta_0 = -svm_datos$rho
beta_0
## [1] 10.21692
# Vectores de soporte
svm_datos$SV
## x1 x2
## 122 4.963778 4.993294
## 692 6.067918 6.048508
# Número total de vectores de soporte
svm_datos$tot.nSV
## [1] 2
# Matriz de clasificación que genera el modelo (primeros y últimos registros)
head(cbind.data.frame(x1,x2,svm_datos$fitted))
## x1 x2 svm_datos$fitted
## 1 3.400429 3.932487 -1
## 2 4.370437 3.753912 -1
## 3 4.833752 4.157784 -1
## 4 3.568799 4.232293 -1
## 5 3.209300 4.781238 -1
## 6 4.402115 3.655866 -1
tail(cbind.data.frame(x1,x2,svm_datos$fitted))
## x1 x2 svm_datos$fitted
## 995 7.802758 7.870378 1
## 996 7.385917 7.346159 1
## 997 6.885569 6.312459 1
## 998 6.004111 6.743805 1
## 999 6.022137 7.724164 1
## 1000 6.711034 6.082837 1
## Gráfica de la clasificación obtenida
clase<-as.numeric(svm_datos$fitted)
grafica <- as.data.frame(cbind(x1,x2,clase))
ggplot(grafica, aes(x1,x2)) + geom_point(aes(colour = clase))+
ggtitle("Cuadrados separados mediante SVM lineal") +
geom_abline(slope = -beta[1]/beta[2], intercept = -beta_0/beta[2] )+
geom_abline(slope = -beta[1]/beta[2], intercept = (-beta_0+margen)/beta[2] )+
geom_abline(slope = -beta[1]/beta[2], intercept = (-beta_0-margen)/beta[2] )
