Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. require('kernlab')
  2. dataA <- data.frame(
  3. x1 = c(0,4),
  4. x2 = c(0,4),
  5. y = c(1,-1)
  6. )
  7.  
  8. dataA$y <- as.factor(dataA$y)
  9.  
  10. dataB <- data.frame(
  11. x1 = c(2,0,1),
  12. x2 = c(0,0,1),
  13. y = c(1,-1,-1)
  14. )
  15. dataB$y <- as.factor(dataB$y)
  16.  
  17. dataC <- data.frame(
  18. x1 = c(2, 2,-2,-2, 2, 2,-2,-2, 1, 1,-1,-1),
  19. x2 = c(2,-2,-2, 2, 2,-2,-2, 2, 1,-1,-1, 1),
  20. y = c( 1, 1,-1,-1, 1, 1, 1, 1, 1, 1,-1,-1)
  21. )
  22. dataC$y <- as.factor(dataC$y)
  23.  
  24. plot(dataA$x1, dataA$x2)
  25.  
  26. plot(dataB$x1, dataB$x2)
  27.  
  28. plot(dataC$x1, dataC$x2)
  29.  
  30. library(e1071)
  31. formula <- y ~ .
  32. svmA <- svm(formula, dataA, kernel="linear")
  33. svmB <- svm(formula, dataB, kernel="linear")
  34. svmC <- svm(formula, dataC, kernel="linear")
  35.  
  36. #Vectores de soporte
  37. vsA <- dataA[svmA$index,1:2]
  38. vsB <- dataB[svmB$index,1:2]
  39. vsC <- dataC[svmC$index,1:2]
  40. vsA
  41. vsB
  42. vsC
  43.  
  44. #Kernel
  45. kA = matrix(c(0,0,0,32),2,2)
  46. kB = matrix(c(4,0,1,0,0,0,1,0,2),3,3)
  47.  
  48. # Vector de pesos normal al hiperplano (W)
  49. wA <- crossprod(as.matrix(vsA), svmA$coefs)
  50. wB <- crossprod(as.matrix(vsB), svmB$coefs)
  51. wC <- crossprod(as.matrix(vsC), svmC$coefs)
  52. wA
  53. wB
  54. wC
  55.  
  56. # Calcular ancho del canal
  57. widthA = 2/(sum(sqrt((wA)^2)))
  58. widthB = 2/(sum(sqrt((wB)^2)))
  59. widthC = 2/(sum(sqrt((wC)^2)))
  60. widthA
  61. widthB
  62.  
  63. # Calcular vector B
  64. bA <- -svmA$rho
  65. bB <- -svmB$rho
  66. bC <- -svmC$rho
  67. bA
  68. bB
  69. bC
  70.  
  71. # Calcular la ecuación del hiperplano y de los planos de soporte positivo y negativo
  72. paste(c("[",wA,"]' * x + [",bA,"] = 0"), collapse=" ")
  73. paste(c("[",wA,"]' * x + [",bA,"] = 1"), collapse=" ")
  74. paste(c("[",wA,"]' * x + [",bA,"] = -1"), collapse=" ")
  75.  
  76. paste(c("[",wB,"]' * x + [",bB,"] = 0"), collapse=" ")
  77. paste(c("[",wB,"]' * x + [",bB,"] = 1"), collapse=" ")
  78. paste(c("[",wB,"]' * x + [",bB,"] = -1"), collapse=" ")
  79.  
  80. paste(c("[",wC,"]' * x + [",bC,"] = 0"), collapse=" ")
  81. paste(c("[",wC,"]' * x + [",bC,"] = 1"), collapse=" ")
  82. paste(c("[",wC,"]' * x + [",bC,"] = -1"), collapse=" ")
  83.  
  84. # Determinar la clase a la que pertenece un punto dado
  85. x = c(5,6)
  86. if ((t(wA) %*% x + bA) >= 0){
  87. print("1")
  88. }else if((t(wA) %*% x + bA) < 0){
  89. print("-1")
  90. }
  91.  
  92. x = c(1,4)
  93. if ((t(wA) %*% x + bA) >= 0){
  94. print("1")
  95. }else if((t(wA) %*% x + bA) < 0){
  96. print("-1")
  97. }
  98.  
  99. x = c(5,6)
  100. if ((t(wB) %*% x + bB) >= 0){
  101. print("1")
  102. }else if((t(wB) %*% x + bB) < 0){
  103. print("-1")
  104. }
  105.  
  106. x = c(1,4)
  107. if ((t(wB) %*% x + bB) >= 0){
  108. print("1")
  109. }else if((t(wB) %*% x + bB) < 0){
  110. print("-1")
  111. }
  112.  
  113. x = c(1,0)
  114. if ((t(wC) %*% x + bC) >= 0){
  115. print("1")
  116. }else if((t(wC) %*% x + bC) < 0){
  117. print("-1")
  118. }
  119.  
  120. x = c(-1,0)
  121. if ((t(wC) %*% x + bC) >= 0){
  122. print("1")
  123. }else if((t(wC) %*% x + bC) < 0){
  124. print("-1")
  125. }
  126.  
  127. #Dibujar los puntos y el hiperplano
  128. plot(svmA, dataA)
  129.  
  130. plot(svmB, dataB)
  131.  
  132. plot(svmC, dataC)
  133.  
  134. kfunction <- function(x1 =0, x2=0){
  135. if(sqrt(x1^2+x2^2)>2){
  136. k <- function(x1,x2){
  137. c(4-x2+ abs(x1-x2),4-x1+ abs(x1-x2))
  138. }
  139. }
  140. else{
  141. k <- function(x1,x2){
  142. c(x1,x2)
  143. }
  144. }
  145. class(k) <- "kernel"
  146. k
  147. }
  148.  
  149. x1 = matrix(cbind(dataC$x1,dataC$x2),2)
  150. svp <- ksvm(x1,dataC$y,type="C-svc",C = 100, kernel=kfunction(1,0),scaled=c())
  151.  
  152. plot(c(min(x1[,1]), max(x1[,1])),c(min(x1[,2]), max(x1[,2])),type='n',xlab='x1',ylab='x2')
  153. title(main='Linear Separable Features')
  154. ymat <- ymatrix(svp)
  155. points(x1[-SVindex(svp),1], x1[-SVindex(svp),2], pch = ifelse(ymat[-SVindex(svp)] < 0, 2, 1))
  156. points(x1[SVindex(svp),1], x1[SVindex(svp),2], pch = ifelse(ymat[SVindex(svp)] < 0, 17, 16))
  157.  
  158. # Extract w and b from the model
  159. w <- colSums(coef(svp)[[1]] * x1[SVindex(svp),])
  160. b <- b(svp)
  161.  
  162. # Draw the lines
  163. abline(b/w[2],-w[1]/w[2])
  164. abline((b+1)/w[2],-w[1]/w[2],lty=2)
  165. abline((b-1)/w[2],-w[1]/w[2],lty=2)
  166.  
  167. # Determinar la clase a la que pertenece un punto dado
  168. x = c(4,5)
  169. if ((t(w) %*% x + b) >= 0){
  170. print("1")
  171. }else if((t(w) %*% x + b) < 0){
  172. print("-1")
  173. }
  174.  
  175. svmIris <- svm(formula, iris, kernel="linear")
  176.  
  177. #Vectores de soporte
  178. vsIris <- dataA[svmIris$index,1:2]
  179. vsIris
  180.  
  181. # Vector de pesos normal al hiperplano (W)
  182. wIris <- crossprod(as.matrix(vsIris), svmIris$coefs)
  183. wIris
  184.  
  185. # Calcular ancho del canal
  186. widthIris = 2/(sum(sqrt((wIris)^2)))
  187. widthIris
  188.  
  189. # Calcular vector B
  190. bIris <- -svmIris$rho
  191. bIris
  192.  
  193. # Calcular la ecuación del hiperplano y de los planos de soporte positivo y negativo
  194.  
  195. paste(c("[",wIris,"]' * x + [",bIris,"] = 0"), collapse=" ")
  196. paste(c("[",wIris,"]' * x + [",bIris,"] = 1"), collapse=" ")
  197. paste(c("[",wIris,"]' * x + [",bIris,"] = -1"), collapse=" ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement