• Nie Znaleziono Wyników

Liniowe maszyny wektorów wspierających

N/A
N/A
Protected

Academic year: 2021

Share "Liniowe maszyny wektorów wspierających"

Copied!
6
0
0

Pełen tekst

(1)

Liniowe maszyny wektorów wspierających

Marcin Orchel

1 Wstęp

1.1 Uczenie maszynowe

W uczeniu maszynowym mamy dany zbiór treningowy D := (( ~ x 1 , y 1 ) , . . . , ( ~ x n , y n )). Za- danie polega na znalezieniu funkcji f : X → Y , tak aby dobrze przybliżała wyjście dla danego wejścia. Najczęściej zakłada się, że pary znane i nieznane (~ x, y) są wygenerowane niezależnie zgodnie z tym samym, ale nieznanym rozkładem łącznym prawdopodobień- stwa P na X × Y . Inaczej para jest wygenerowana w dwóch krokach: najpierw ~ x jest wygenerowany zgodnie z dystrybucją brzegową P X , a następnie wartość wyjściowa jest wygenerowana zgodnie z nieznanym prawdopodobieństwem warunkowym P (·|~ x) na Y mając dane X. Mierzymy jakość przewidywania za pomocą funkcji straty L (~ x, y, f (~ x)), która jest mniejsza dla lepszego przybliżenia.

L : X × Y × R → [0, ∞) (1)

Interesuje nas oczekiwana wartość straty, zwana ryzykiem R (f ) :=

Z

L (~ x, y, f (~ x)) dP (~ x, y) (2) W praktyce interesuje nas to, aby dla nowych przykładów wartość straty była mała czyli

1 m − n

m

X

i=n+1

L ( ~ x i , y i , f ( ~ x i )) (3) Wszystkie te przykłady pochodzą z rozkładu P i zgodnie z prawem wielkich liczb dla m → ∞ średnia strata empiryczna jest zbieżna w prawdopodobieństwie do R (f ).

Jak zdefiniować stratę? Możemy ją zdefiniować np. jako

L (~ x, y, f (~ x)) = |f (~ x) − f (~ x)| p (4) Dla takiej straty mamy ryzyko

R (f ) :=

Z

|f (~ x) − f (~ x)| p dP (~ x, y) (5) Interesuje nas najmniejsze możliwe ryzyko, czyli

R := inf

f :X→R R (f ) (6)

(2)

Interesuje nas znalezienie funkcji f D : X → R dla zbioru danych treningowych D, dla której ryzyko R (f D ) jest jak najbardziej zbliżone do R .

Zależy nam na tym, aby metoda generująca funkcję była niesprzeczna uniwersalnie, czyli

R (f D ) → R (7)

for n → ∞ w prawdopodobieństwie dla dowolnych rozkładów P . Zależy nam również na tym aby ryzyko było bliskie optymalnemu już dla małych wartości n.

1.2 Maszyny wektorów wspierających

Funkcja straty dla klasyfikacji jest równa 1, gdy sgn f (~ x) 6= y, w przeciwnym razie jest 0.

Chcemy znaleźć metodę, która dla danych treningowych znajdzie funkcję, która da nam małe ryzyko. Przykładowo możemy spróbować użyć funkcji, która minimalizuje ryzyko empiryczne

R (f ) = 1 n

n

X

i=1

L (y i , f ( ~ x i )) (8)

Ale czy taka funkcja rzeczywiście będzie dobrze przybliżała najmniejsze możliwe ryzyko?

Możemy tu zauważyć przedopasowanie. Możemy zawęzić zbiór możliwych funkcji do F aby temu zapobiec. Wtedy musimy mieć na uwadze różnicę

R F − R (9)

Jak znaleźć ten zbiór F . Można zwiększać jego rozmiar wraz z n. Drugi problem jest obliczeniowy, obliczenie ryzyka empirycznego dla klasyfikacji jest problemem niewypu- kłym. Aby to był problem wypukły zamienia się funkcję straty na inną. Dla SVM jest to hinge loss

L hinge (y, t) = max {0, 1 − yt} (10)

gdzie y ∈ {−1, 1}, t ∈ R, widzimy, że wtedy ryzyko empiryczne jest funkcją wypukłą i otrzymujemy problem wypukły gdy F jest zbiorem wypukłym. Pytanie czy możemy tak zamienić funkcję straty, można udowodnić, że

R (f ) − R ≤ R hinge (f ) − R hinge (11) więc wystarczy zadbać o dobrą metodę dla straty hinge.

Kolejnym dodatkiem w svmach jest człon regularyzacyjny k ~ wk, i mamy minimalizację inf

f ∈H λ f ~ 2 + R hinge (12) dla λ > 0. Motywacją dla członu regularyzacyjnego jest zredukowanie zagrożenia przed- opasowania danych, okazuje się, że funkcje z H są bardziej dopasowane do danych gdy mają dużą normę.

Jest to problem wypukły, istnieje jedno rozwiązanie.

(3)

Problem svm może być również zapisany w postaci min

k f ~ k ≤λ

−1/2

λ f ~ 2 + R hinge (13) A więc manipulując wartościami λ możemy zwiększać lub zmniejszać zestaw możliwych funkcji.

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, dla funkcji jądrowej liniowej.

• 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)

• wykorzystać walidację krzyżową do testowania jakości, parametr cross

• przetestować wyszukiwanie optymalnych wartości parametrów C Wskazówki

• przetestować C-classification Wskazówki do R

• parametr kernel powinien być ustawiony na linear

• 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

(4)

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

• fitcecoc http://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 svm http://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="linear", 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)

(5)

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, type="C-classification", kernel="linear", cost=10, 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)

• wyświetlanie błędu treningowego pred <- fitted(svm.model)

#pred<-predict(svm.model, allPointsDataFrame)

print(table(pred, allPointsDataFrame[,1]))

(6)

(table(pred, allPointsDataFrame[,1])[1,2] + table(pred,

allPointsDataFrame[,1])[2,1]) / (nrow(allPointsDataFrame))*100

• tune.svm

obj <- tune.svm(as.factor(c)~w+l, data=allPointsDataFrame, cost = 2^(2:8), kernel = "linear")

• 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), kernel = "linear", tunecontrol = tc)

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)

Cytaty

Powiązane dokumenty

CSng – konwersja do typu Single CDbl – konwersja do typu Double CInt – konwersja do typu Integer CStr – konwersja do typu String lub funkcje. Single.Parse –

Oczywiście, jeśli jest jakiś problem z innego przedmiotu możecie też- i wiele osób tak robi, zgłaszać do mnie i ja przekażę do nauczyciela, który także łączy się z

Projekt jest to przedsięwzięcie, na które składa się zespół czynności, które charakteryzują się tym, że mają:.. 

Udowodnić, że średnia arytmetyczna tych liczb jest równa n+1 r

Dane są dodatnio (prawostronnie) asymetryczne wtedy i tylko wtedy gdy ich funkcja symetrii jest niemalejąca.. Wykres dowolnej funkcji symetrii leży w pewnym

• 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

Tworzenie nowych grup łamania jest możliwe w kreatorze raportu (przy wybraniu odpowiedniego rozkładu) lub w modelu danych poprzez „wyciągnięcie” kolumny na zewnątrz grupy w

Możliwe jest aby po lewej stronie znaku równości (nierówności, nieostrej równości) była umieszczona para (trójka, itd.) wartości (kolumn). Musi jej odpowiadać liczba kolumn lub