## 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] )