Nieliniowe maszyny wektorów wspierających
Marcin Orchel
1 Wstęp 2 Zadania
2.1 Zadania na 3.0
• dla wygenerowanych danych dwuwymiarowych dwóch klas z rozkładów normalnych zaznacz na wykresie dane treningowe, klasyfikator svm, dla różnych wartości C oraz sigma, dla funkcji jądrowej wielomianowej i RBF.
• dodać do wykresu wcześniej testowane klasyfikatory
• oblicz błąd klasyfikacji na zbiorze testowym dla wszystkich użytych klasyfikatorów
• przetestować SVM z różnymi wartościami parametru cost (C) i sigma
• wykorzystać walidację krzyżową do testowania jakości, parametr cross
• przetestować wyszukiwanie optymalnych wartości parametrów C i sigma
• zbadać wpływ wartości C na błąd testowy
• przetestować uogólnienie klasyfikatora na wiele klas za pomocą konstrukcji kilku maszyn wektorów wspierających
• przetestować maszyny wektorów wspierających dla problemu regresji
• zbadać liczbę wektorów wspierających, zaobserwować liczbę wektorów wspierają- cych, dla różnych sigma kiedy mamy przeestymowanie lub niedoestymowanie
• zastosować różną wartość parametru C dla każdej klasy Wskazówki
• przetestować C-classification z jądrem RBF i wielomianowym Wskazówki do R
• parametr kernel powinien być ustawiony na polynomial lub radial basis
• pakiet e1071
• https://www.rdocumentation.org/packages/e1071/topics/svm
• https://www.rdocumentation.org/packages/e1071/topics/tune.wrapper,https:
//www.rdocumentation.org/packages/e1071/topics/tune,https://www.rdocumentation.
org/packages/e1071/topics/tune.control
• https://www.rdocumentation.org/packages/e1071/topics/predict.svm
• https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Classification/
SVM
• https://stackoverflow.com/questions/21827776/plot-margins-for-support-
vector-machine,https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/
asset/ch9.html Wskazówki do Matlaba
• svmtrain http://www.mathworks.com/help/stats/svmtrain.html
• svmclassify http://www.mathworks.com/help/stats/svmclassify.html
• fitcsvm http://www.mathworks.com/help/stats/fitcsvm.html
• fitcecochttp://www.mathworks.com/help/stats/fitcecoc.html
• http://www.mathworks.com/help/stats/classificationsvm-class.html
• http://www.mathworks.com/help/stats/compactclassificationsvm-class.html
• omówienie metody http://www.mathworks.com/help/stats/support-vector- machines-svm.html
• wszystkie funkcje związane z svmhttp://www.mathworks.com/help/stats/support- vector-machine-classification.html
• http://www.mathworks.com/help/stats/classificationecoc-class.html
• http://www.mathworks.com/help/matlab/ref/importdata.html
• http://www.mathworks.com/help/stats/perfcurve.html Przykłady
• svm.iris<-svm(klasa ~ ., data=iris, kernel="radial basis", cost=10, cross=1)
print(summary(svm.iris))
y.theoretical <- fitted(svm.iris)
print(table(iris$klasa, y.theoretical)) print(svm.iris$index)
• wyświetlanie granicy i marginesu require("MASS")
require("e1071") n <- 2
A <- matrix(runif(n^2)*2-1, ncol=n) sigma <- t(A) %*% A
B <- matrix(runif(n^2)*2-1, ncol=n) sigma2 <- t(B) %*% B
points1<-mvrnorm(n = 1000, c(-1, -1), sigma) points2<-mvrnorm(n = 1000, c(2, 1), sigma2) points1b<-cbind(rep(1, 1000), points1) points2b<-cbind(rep(-1, 1000), points2) allPoints<-rbind(points1b, points2b)
allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V1
allPointsDataFrame$V1 <- as.factor(allPointsDataFrame$V1) w <- allPointsDataFrame$V2
l <- allPointsDataFrame$V3
svm.model<-svm(as.factor(c)~w+l, data=allPointsDataFrame, kernel="radial", gamma=1.5, cost=10000, cross=0, scale=FALSE)
print(summary(svm.model))
y.theoretical <- fitted(svm.model)
#print(table(c, y.theoretical)) min.w <- min(w)
max.w <- max(w) min.l <- min(l) max.l <- max(l)
#plot(svm.model, allPointsDataFrame, w~l, svSymbol="o", dataSymbol="o")
zerojeden <- ifelse((svm.model$decision.values > 0), 1, 0) plot(allPoints[,2], allPoints[,3], col = zerojeden + 1, xlim =
c(-5,5), ylim=c(-5,5))
plot(allPoints[,2], allPoints[,3], col = allPoints[,1]+2, xlim = c(min.w,max.w), ylim=c(min.l,max.l))
x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)
myallPointsDataFrameT<-expand.grid(w=x, l=y) n <- length(x)
y.pred <- predict(svm.model, myallPointsDataFrameT) z <- y.pred
contour(x, y, matrix(z, n), add=TRUE, levels=0, labcex = 0, drawlabels = FALSE)
v <- t(svm.model$coefs) %*% svm.model$SV b <- -svm.model$rho
#abline(a=-b/v[1,2], b=-v[1,1]/v[1,2], col="black", lty=1)
#abline(a=-(b-1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#abline(a=-(b+1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#plot(allPoints[,3], z, xlim = c(-5,5), ylim=c(-5,5))
• regresja
require("MASS") require("e1071") n <- 2
A <- matrix(runif(n^2)*2-1, ncol=n) sigma <- t(A) %*% A
B <- matrix(runif(n^2)*2-1, ncol=n) sigma2 <- t(B) %*% B
points1<-mvrnorm(n = 1000, c(-1, -1), sigma) points2<-mvrnorm(n = 1000, c(2, 1), sigma2) points1b<-cbind(rep(1, 1000), points1) points2b<-cbind(rep(-1, 1000), points2) allPoints<-rbind(points1b, points2b)
allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V1
allPointsDataFrame$V1 <- as.factor(allPointsDataFrame$V1) w <- allPointsDataFrame$V2
l <- allPointsDataFrame$V3
svm.model<-svm(w~l, data=allPointsDataFrame,
type="eps-regression", kernel="radial", gamma=1.5, cost=10000,
cross=0, epsilon=0.1, scale=FALSE) print(summary(svm.model))
y.theoretical <- fitted(svm.model)
#print(table(c, y.theoretical)) min.w <- min(w)
max.w <- max(w) min.l <- min(l) max.l <- max(l)
#plot(svm.model, allPointsDataFrame, w~l, svSymbol="o", dataSymbol="o")
zerojeden <- ifelse((svm.model$decision.values > 0), 1, 0) plot(allPoints[,2], allPoints[,3], col = zerojeden + 1, xlim =
c(-5,5), ylim=c(-5,5))
plot(allPoints[,2], allPoints[,3], col = 1, xlim = c(min.w,max.w),
ylim=c(min.l,max.l))
x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)
myallPointsDataFrameT<-expand.grid(w=x) n <- length(x)
y.pred <- predict(svm.model, x) z <- y.pred
#contour(x, y, matrix(z, n), add=TRUE, levels=0, labcex = 0, drawlabels = FALSE)
#v <- t(svm.model$coefs) %*% svm.model$SV
#b <- -svm.model$rho
#abline(a=-b/v[1,2], b=-v[1,1]/v[1,2], col="black", lty=1)
#abline(a=-(b-1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#abline(a=-(b+1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3) points(allPoints[,3], z, xlim = c(-5,5), ylim=c(-5,5))
• tune.svm
obj <- tune.svm(as.factor(c)~w+l, data=allPointsDataFrame, cost = 2^(2:8), gamma=2^(-2:4), kernel = "radial")
• tune.svm z walidacją krzyżową tc <- tune.control(cross = 5)
obj <- tune.svm(as.factor(c)~w+l, data=allPointsDataFrame, cost = 2^(2:8), gamma=2^(-2:4), kernel = "radial", tunecontrol = tc)
• 3 klasy
require("MASS") require("e1071") n <- 2
A <- matrix(runif(n^2)*2-1, ncol=n) sigma <- t(A) %*% A
B <- matrix(runif(n^2)*2-1, ncol=n) sigma2 <- t(B) %*% B
C <- matrix(runif(n^2)*2-1, ncol=n) sigma3 <- t(C) %*% C
points1<-mvrnorm(n = 1000, c(-1, -1), sigma) points2<-mvrnorm(n = 1000, c(2, 1), sigma2) points3<-mvrnorm(n = 1000, c(0, 1), sigma3) points1b<-cbind(rep(1, 1000), points1) points2b<-cbind(rep(-1, 1000), points2) points2c<-cbind(rep(2, 1000), points3)
allPoints<-rbind(points1b, points2b, points2c) allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V1
allPointsDataFrame$V1 <- as.factor(allPointsDataFrame$V1) w <- allPointsDataFrame$V2
l <- allPointsDataFrame$V3
svm.model<-svm(as.factor(c)~w+l, data=allPointsDataFrame, kernel="radial", gamma="0.01", cost=1, cross=0, scale=FALSE)
print(summary(svm.model))
y.theoretical <- fitted(svm.model)
#print(table(c, y.theoretical)) min.w <- min(w)
max.w <- max(w) min.l <- min(l) max.l <- max(l)
#plot(svm.model, allPointsDataFrame, w~l, svSymbol="o", dataSymbol="o")
zerojeden <- ifelse((svm.model$decision.values > 0), 1, 0) plot(allPoints[,2], allPoints[,3], col = zerojeden + 1, xlim =
c(-5,5), ylim=c(-5,5))
plot(allPoints[,2], allPoints[,3], col = allPoints[,1]+2, xlim = c(min.w,max.w), ylim=c(min.l,max.l))
x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)
myallPointsDataFrameT<-expand.grid(w=x, l=y) n <- length(x)
y.pred <- predict(svm.model, myallPointsDataFrameT) z <- y.pred
contour(x, y, matrix(z, n), add=TRUE, levels=c(0, 1.5), labcex = 0, drawlabels = FALSE)
v <- t(svm.model$coefs) %*% svm.model$SV b <- -svm.model$rho
#abline(a=-b/v[1,2], b=-v[1,1]/v[1,2], col="black", lty=1)
#abline(a=-(b-1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#abline(a=-(b+1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#plot(allPoints[,3], z, xlim = c(-5,5), ylim=c(-5,5))
• jedno klasowe svm require("MASS") require("e1071") n <- 2
A <- matrix(runif(n^2)*2-1, ncol=n)
sigma <- t(A) %*% A
B <- matrix(runif(n^2)*2-1, ncol=n) sigma2 <- t(B) %*% B
C <- matrix(runif(n^2)*2-1, ncol=n) sigma3 <- t(C) %*% C
points1<-mvrnorm(n = 1000, c(-1, -1), sigma) points2<-mvrnorm(n = 1000, c(2, 1), sigma2) points3<-mvrnorm(n = 1000, c(0, 1), sigma3) points1b<-cbind(rep(1, 1000), points1) points2b<-cbind(rep(1, 1000), points2) points2c<-cbind(rep(1, 1000), points3)
allPoints<-rbind(points1b, points2b, points2c) allPointsDataFrame<-as.data.frame(allPoints) c <- allPointsDataFrame$V1
allPointsDataFrame$V1 <- as.factor(allPointsDataFrame$V1) w <- allPointsDataFrame$V2
l <- allPointsDataFrame$V3
svm.model<-svm(as.factor(c)~w+l, data=allPointsDataFrame, kernel="radial", gamma="0.5", cost=100,
cross=0, scale=FALSE, type="one-classification", nu=0.1)
print(summary(svm.model))
y.theoretical <- fitted(svm.model)
#print(table(c, y.theoretical)) min.w <- min(w)
max.w <- max(w) min.l <- min(l) max.l <- max(l)
#plot(svm.model, allPointsDataFrame, w~l, svSymbol="o", dataSymbol="o")
zerojeden <- ifelse((svm.model$decision.values > 0), 1, 0) plot(allPoints[,2], allPoints[,3], col = zerojeden + 1, xlim =
c(-5,5), ylim=c(-5,5))
plot(allPoints[,2], allPoints[,3], col = allPoints[,1]+2, xlim = c(min.w,max.w), ylim=c(min.l,max.l))
x<- seq(min.w, max.w, length=100) y<- seq(min.l, max.l, length=100)
myallPointsDataFrameT<-expand.grid(w=x, l=y) n <- length(x)
y.pred <- predict(svm.model, myallPointsDataFrameT) z <- y.pred
contour(x, y, matrix(z, n), add=TRUE, levels=c(1), labcex = 0,
drawlabels = FALSE)
v <- t(svm.model$coefs) %*% svm.model$SV b <- -svm.model$rho
#abline(a=-b/v[1,2], b=-v[1,1]/v[1,2], col="black", lty=1)
#abline(a=-(b-1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#abline(a=-(b+1)/v[1,2], b=-v[1,1]/v[1,2], col="orange", lty=3)
#plot(allPoints[,3], z, xlim = c(-5,5), ylim=c(-5,5))
2.2 Zadania na 4.0
• powtórzyć zadanie na 3.0 dla danych syntetycznych trójwymiarowych
• wykonać klasyfikacje svm z zadania na 3.0 z walidacją krzyżową 2.3 Zadania na 5.0
• dla wybranych danych wielowymiarowych za pomocą metody svm, porównać ja- kość klasyfikacji na danych testowych z klasyfikatorem Bayesa (z macierzą kowa- riancji i wartościami średnimi obliczonymi z danych)