繁体   English   中英

e1071 R包的SVM方程?

[英]SVM equations from e1071 R package?

我有兴趣测试SVM性能,将几个人分为四组/每组。 当使用MATLAB中的svmtrain LibSVM函数时,我能够根据该等式的值得到用于对这4个组中的个体进行分类的三个方程式。 计划如下:

                All individuals (N)*
                      |
 Group 1 (n1) <--- equation 1 --->  (N-n1)
                                      |
                   (N-n1-n2) <--- equation 2 ---> Group 2 (n2)
                      |
Group 3 (n3) <--- equation 3 ---> Group 4(n4)

*N = n1+n2+n3+n4

有没有办法在e1071 R包中使用svm函数来获得这些方程式?

e1071 svm使用“一对一”策略进行多类分类(即所有对之间的二进制分类,然后进行投票)。 因此,为了处理这种分层设置,您可能需要手动执行一系列二进制分类器,例如组1对所有,然后组2对比剩下的等等。此外,基本的svm函数不调整超参数,因此,您通常希望在e1071使用类似于tune的包装,或者使用优秀的caret包进行train

无论如何,要对R中的新个体进行分类,您不必手动将数字插入等式中。 相反,您使用predict泛型函数,该函数具有不同模型(如SVM)的方法。 对于像这样的模型对象,您通常也可以使用通用函数plotsummary 以下是使用线性SVM的基本思想示例:

require(e1071)

# Subset the iris dataset to only 2 labels and 2 features
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]

# Fit svm model
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')

# Make a plot of the model
dev.new(width=5, height=5)
plot(fit, iris.part)

# Tabulate actual labels vs. fitted labels
pred = predict(fit, iris.part)
table(Actual=iris.part$Species, Fitted=pred)

# Obtain feature weights
w = t(fit$coefs) %*% fit$SV

# Calculate decision values manually
iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]]) 
t(w %*% t(as.matrix(iris.scaled))) - fit$rho

# Should equal...
fit$decision.values

在此输入图像描述

将实际类标签与模型预测相关联:

> table(Actual=iris.part$Species, Fitted=pred)
            Fitted
Actual       versicolor virginica
  versicolor         38        12
  virginica          15        35

svm模型对象中提取特征权重(用于特征选择等)。 在这里, Sepal.Length显然更有用。

> t(fit$coefs) %*% fit$SV
     Sepal.Length Sepal.Width
[1,]    -1.060146  -0.2664518

为了理解决策值的来源,我们可以手动计算它们作为特征权重和预处理特征向量的点积减去截距偏移rho (如果使用RBF SVM,预处理意味着可能居中/缩放和/或内核转换等)

> t(w %*% t(as.matrix(iris.scaled))) - fit$rho
         [,1]
51 -1.3997066
52 -0.4402254
53 -1.1596819
54  1.7199970
55 -0.2796942
56  0.9996141
...

这应该等于内部计算的:

> head(fit$decision.values)
   versicolor/virginica
51           -1.3997066
52           -0.4402254
53           -1.1596819
54            1.7199970
55           -0.2796942
56            0.9996141
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM