# początek jak zwykle
library(mlbench)
data(Glass)

      # funkcja obliczająca błąd
err <- function(y.true, y.pred) { sum(y.pred!=y.true)/length(y.true) }

      # podzielmy dane na trenujące i testowe losowo w stosunku ok. 2:1
rg <- runif(nrow(Glass))
g.train <- Glass[rg>=0.33,]
g.test <- Glass[rg<0.33,]
      
      # pakiet e1071 zawiera implementację SVM
library(e1071)
    
      # model SVM z domyślnymi parametrami
g.svm0 <- svm(Type ~ ., g.train)
      # krótka charakterystyka modelu
g.svm0
      # błąd na zbiorze trenującym i testowym
err(g.train$Type, predict(g.svm0, g.train))
err(g.test$Type, predict(g.svm0, g.test))
			      
      # modele SVM z innymi funkcjami jądrowymi (domyślna jest radialna)
g.svm0.l <- svm(Type ~ ., g.train, kernel="linear")
g.svm0.s <- svm(Type ~ ., g.train, kernel="sigmoid")
      # ich błędy
err(g.train$Type, predict(g.svm0.l, g.train))
err(g.test$Type, predict(g.svm0.l, g.test))
err(g.train$Type, predict(g.svm0.s, g.train))
err(g.test$Type, predict(g.svm0.s, g.test))
      
      # modele SVM z innymi wartościami parametru C (domyślna 1)
g.svm1 <- svm(Type ~ ., g.train, cost=0.1)
g.svm2 <- svm(Type ~ ., g.train, cost=2)
g.svm3 <- svm(Type ~ ., g.train, cost=5)
g.svm4 <- svm(Type ~ ., g.train, cost=10)
      # i ich błędy
err(g.train$Type, predict(g.svm1, g.train))
err(g.test$Type, predict(g.svm1, g.test))
err(g.train$Type, predict(g.svm2, g.train))
err(g.test$Type, predict(g.svm2, g.test))
err(g.train$Type, predict(g.svm3, g.train))
err(g.test$Type, predict(g.svm3, g.test))
err(g.train$Type, predict(g.svm4, g.train))
err(g.test$Type, predict(g.svm4, g.test))
		  
      # strojenie parametru C przez 10x10-krotną walidację krzyżową
par.cost=2^(-4:4)
g.tuneC <- tune(svm, Type ~ ., data=g.train, ranges=list(cost=par.cost),
                tunecontrol=tune.control(nrepeat=10))
      # uzyskana najlepsza wartość
g.tuneC$best.parameters
      # błędy walidacji krzyżowej dla poszczególnych wartości
g.tuneC$performances[order(g.tuneC$performances$error),]
      # błąd modelu dla najlepszej wartości C na zbiorze trenującym i testowym
err(g.train$Type, predict(g.tuneC$best.model, g.train))
err(g.test$Type, predict(g.tuneC$best.model, g.test))