我正在开展手写模式识别(字母)项目,使用支持向量机。总共有26个类,但是我在R中无法使用SVM进行分类。只有在二元分类的情况下才能对图像进行分类。如何在R中使用多类SVM?
我正在使用“e1071”包。
提前感谢。
对于多分类器,您可以获取每个类别的概率。在训练模型时和使用“predict”API时,您可以设置“probability=TRUE”以获取每个类别的概率。以下是鸢尾花数据集的示例代码:
data(iris)
attach(iris)
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y, probability = TRUE)
pred_prob <- predict(model, x, decision.values = TRUE, probability = TRUE)
使用以上代码,“pred_prob”将具有其他数据中的概率。您可以使用以下语句仅访问对象中的概率:
attr(pred_prob, "probabilities")
setosa versicolor virginica
1 0.979989881 0.011347796 0.008662323
2 0.972567961 0.018145783 0.009286256
3 0.978668604 0.011973933 0.009357463
...
希望这能帮到你。
注意:我认为当你在内部给出"概率"时,svm会执行一对多分类器,因为使用"概率"参数的模型比不使用"概率"参数的模型需要更多时间。
我猜想被认可的答案已经过时了。在e1071包中使用的libsvm还支持"1对1"模型的多类分类。也就是说,它会创建(L-choose-2)个分离平面。
这里有一个示例代码:
# Create 2d data
set.seed(1)
x1 = matrix(c(rnorm(20, 0), rnorm(20, 0)), ncol=2)
x2 = matrix(c(rnorm(20, 0), rnorm(20, 4)), ncol=2)
x3 = matrix(c(rnorm(20, 4), rnorm(20, 0)), ncol=2)
x4 = matrix(c(rnorm(20, 4), rnorm(20, 4)), ncol=2)
x = rbind(x1,x2,x3,x4)
y = factor(c(rep(1,20), rep(2,20), rep(3,20), rep(4,20)))
# Multiclass Classification (1 vs. 1)
fit = svm(y~x, kernel = "linear", cost = 10, scale=F)
plot(x, col=y, xlim=c(-3,6), ylim=c(-2.5,6.5))
table(y, predict(fit))
e1071
中没有多类SVM的直接等效物。此外,所有用于多类分类的SVM方法都使用“一对其余”或编码等技术。这里有一个参考文献详细介绍了最常见的方法...
http://arxiv.org/ftp/arxiv/papers/0802/0802.2411.pdf
如果您想使用e1071
进行多类SVM,最好创建26个svm模型,每个类别一个,并使用概率分数进行预测。这种方法对于手写模式识别应该足够好。
svm
支持“一对一”方法的多类别分类。 - Maverick Meerkat