Ich erweitere die Iris-Daten um eine weitere, sechste Spalte namens setosa.

iris <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data",header=F)
iris.local <- iris
iris.local <- cbind(iris.local, iris.local$V5 == 'Iris-setosa') # 6. Spalte
names(iris.local)[6] <- 'setosa'
summary(iris.local)
##        V1              V2              V3              V4       
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.054   Mean   :3.759   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##                V5       setosa       
##  Iris-setosa    :50   Mode :logical  
##  Iris-versicolor:50   FALSE:100      
##  Iris-virginica :50   TRUE :50       
##                       NA's :0        
##                                      
## 

Statt der logischen möchte ich numerische Werte in der sechsten Spalte haben.

iris.local$setosa <-as.numeric(iris.local$setosa)
summary(iris.local)
##        V1              V2              V3              V4       
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.054   Mean   :3.759   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##                V5         setosa      
##  Iris-setosa    :50   Min.   :0.0000  
##  Iris-versicolor:50   1st Qu.:0.0000  
##  Iris-virginica :50   Median :0.0000  
##                       Mean   :0.3333  
##                       3rd Qu.:1.0000  
##                       Max.   :1.0000

Nun kommt die Support Vector Machine.

require(e1071)
## Loading required package: e1071

Input-Variablen sind V1 bis V4, Outputvariable soll setosa sein.

formula.svm <- as.formula("setosa ~ V1 + V2 + V3 + V4")

SVM wird im Klassifizierungsmodus und mit cost=1000 aufgerufen. Große cost=Werte beschränken alpha nach oben wenig und sorgen für strikte Trennung der Klassen (hard margins), kleine cost=Werte beschränken alpha nach oben und können zu Fehlklassifikationen führen (soft margins).

model.svm <- svm(formula.svm, 
                 data=iris.local,
                 type="C-classification",
                 kernel="linear",
                 cost=1000
                 )
summary(model.svm)
## 
## Call:
## svm(formula = formula.svm, data = iris.local, type = "C-classification", 
##     kernel = "linear", cost = 1000)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  linear 
##        cost:  1000 
##       gamma:  0.25 
## 
## Number of Support Vectors:  4
## 
##  ( 2 2 )
## 
## 
## Number of Classes:  2 
## 
## Levels: 
##  0 1

Die Indizes der Support-Vektoren:

idx <- model.svm$index

Die Support-Vektoren sind

iris.local[idx,]
##     V1  V2  V3  V4              V5 setosa
## 24 5.1 3.3 1.7 0.5     Iris-setosa      1
## 42 4.5 2.3 1.3 0.3     Iris-setosa      1
## 58 4.9 2.4 3.3 1.0 Iris-versicolor      0
## 99 5.1 2.5 3.0 1.1 Iris-versicolor      0

Kontrolle:

pred <- predict(model.svm,iris.local)
table(pred,true=iris.local$setosa)
##     true
## pred   0   1
##    0 100   0
##    1   0  50

Alle Exemplare korrekt klassifiziert.